ไวยากรณ์ Crontab; หลายคำสั่ง


14

ฉันต้องการรับสายคำสั่งต่อไปนี้เป็น cronjob:

* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

มันทำงานในคอนโซล แต่ฉันไม่ได้รับผลใด ๆ จาก cronjob

ฉันทำตามคำแนะนำนี้โดยแทนที่ด้วย

* * * * * env > /tmp/env.output

เพื่อค้นหาว่า env แตกต่างกันหรือไม่ ฉันไม่พบสิ่งใดที่เกี่ยวข้องนอกจาก PATH แตกต่างกัน ดังนั้นฉันจึงตั้งค่า

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

และมันก็ยังไม่ทำงาน ในที่สุดฉันก็แทนที่มันด้วย

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py
* * * * * env > /tmp/env.output

และครั้งนี้ฉันไม่ได้รับenv.outputไฟล์ด้วยซ้ำ ดังนั้นฉันคิดว่ามีบางอย่างผิดปกติกับไวยากรณ์ของฉัน - แต่ดูเหมือนว่าคำแนะนำหลายคำสั่งที่ฉันพบทางออนไลน์

เกิดอะไรขึ้นที่นี่? หากไม่ชัดเจนฉันจะติดตามข้อผิดพลาดอะไรได้บ้าง

PATH=/usr/local/anaconda2/envs/myenv3/bin:~/.conda:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

out.err:

/bin/sh: 6: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 15: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 17: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
Only bash and zsh are supported

คำตอบ:


16

ใน Ubuntu ตามค่าเริ่มต้นcrondaemon จะรันงานทั้งหมดโดยใช้เชลล์sh( dash) และdashไม่มีsourcebuiltin

คุณต้องใช้วิธี POSIX เช่น.:

* * * * * . activate myenv3 && cd ~/foo/bar && python sssb.py

คุณสามารถรันงานเป็นอาร์กิวเมนต์เพื่อbash:

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'

ตอนนี้ฉันมีไฟล์ /tmp/env.output อีกครั้ง แต่ก็ยังไม่มีเอาต์พุตจากไฟล์หลัก
FooBar

1
@FooBar ผลลัพธ์ของgrep SHELL /tmp/env.outputอะไร ยังทำงานแรกเป็น* * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1และตรวจสอบเนื้อหาของ/tmp/out.err
heemayl

มันบอกว่า SHELL = / bin / sh ฉันจะวางผลลัพธ์out.errและเส้นทางจริงที่ฉันวางลงในคำถาม
FooBar

1
+1 สำหรับการห่อหุ้มของคุณโดยใช้$(command -v bash) -c ' ... '- แก้ tigaboo ทั้งหมดโดยไม่มีรายละเอียดที่ยุ่งเหยิง
Cbhihe

1
ส่วนคำสั่ง -v ของ"$(command -v bash)" -c '...'นั้นไม่มีจุดหมาย เพิ่งทำbash -c '...'
เกอฮา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.