Sintaksis Crontab; Banyak perintah

14

Saya ingin mendapatkan rantai perintah sebagai cronjob berikut:

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

Ini berfungsi di konsol, tapi saya tidak mendapatkan output dari cronjob.

Saya mengikuti saran ini , dengan menggantinya dengan

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

untuk mengetahui apakah env berbeda. Saya tidak dapat menemukan sesuatu yang relevan selain PATH yang berbeda. Jadi saya mengatur

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

dan itu masih tidak berhasil. Akhirnya saya ganti dengan

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

dan kali ini saya bahkan tidak mendapatkan env.outputfile. Oleh karena itu saya pikir ada sesuatu yang salah dengan sintaks saya - tetapi sepertinya persis seperti saran multi-perintah yang saya temukan online.

Apa yang terjadi di sini? Jika tidak jelas, apa yang bisa saya lakukan selanjutnya untuk melacak kesalahan?

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
FooBar
sumber

Jawaban:

16

Di Ubuntu, secara default, crondaemon menjalankan semua pekerjaan menggunakan sh( dash) shell dan dashtidak memiliki sourcebuiltin.

Anda perlu menggunakan cara POSIX yaitu .:

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

Sebagai alternatif, Anda dapat menjalankan pekerjaan sebagai argumen untuk bash:

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'
heemayl
sumber
Sekarang saya memiliki file /tmp/env.output lagi, tetapi masih tidak ada output dari file utama.
FooBar
1
@ FooBar apa outputnya grep SHELL /tmp/env.output? Jalankan juga pekerjaan pertama sebagai * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1dan periksa konten/tmp/out.err
heemayl
Dikatakan SHELL = / bin / sh. Saya akan menempelkan output out.errdan PATH aktual yang saya tempelkan ke pertanyaan.
FooBar
1
+1 untuk enkapsulasi Anda menggunakan $(command -v bash) -c ' ... '- memecahkan seluruh tigaboo tanpa masuk ke detail berantakan (tidak begitu).
Cbhihe
1
Bagian perintah -v "$(command -v bash)" -c '...'tidak ada gunanya. Lakukanbash -c '...'
geirha