Синтаксис 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
FooBar
источник

Ответы:

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'
heemayl
источник
Теперь у меня снова есть файл /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 '...'
гейра