Синтаксис Crontab; Кілька команд


14

Я хотів би отримати наступний ланцюжок команд як кронштейн:

* * * * * 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 за замовчуванням cronдемон виконує всі завдання, використовуючи оболонку sh( dash), і dashне має sourceвбудованого.

Вам потрібно використовувати спосіб 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і власне PATH, який я вставив у запитання.
FooBar

1
+1 для вашої інкапсуляції за допомогою $(command -v bash) -c ' ... '- вирішує весь тигабуд без попадання в (не дуже) безладні деталі.
Cbhihe

1
Команда -v частина не "$(command -v bash)" -c '...'має сенсу. Просто зробітьbash -c '...'
geirha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.