У меня есть следующий сценарий оболочки: /var/local/myapp/bin/import
#!/bin/bash
# Move to base directory
cd $(dirname $0)
cd ..
# Execute and bail if one of them fails
cake compile
cake tms:fetch
cake tms:fetch:clean
cake tms:split
cake tms:injest:main
cake tms:injest:schedules
Пытаюсь запустить из cron. Все пользователи имеют доступ к cake
. Однако, когда я запускаю этот скрипт с помощью cron, я получаю следующую ошибку (в каждой строке торта):
/var/local/myapp/bin/import: line 13: cake: command not found
Вот мой кронтаб
* * * * * /var/local/myapp/bin/import
Кроме того, я не могу найти простой способ перенаправить стандартный вывод bin / import в файл при запуске из cron. Добавление > /var/local/myapp/import.log
до конца оператора cron просто обрезает import.log - единственный способ сделать это - добавить exec &> import.log
в bin / import, а это совсем не то, что я хочу делать, потому что, когда я запускаю его вручную, я хочу видеть результат на экране.
Все работает отлично, когда я просто печатаю /var/local/myapp/bin/import
с моего терминала.
В PATH
для cron
отличается от пользовательского. В вашем скрипте укажите полный каталог для cake
, например:
/path/to/cake compile
Если все, что вы сейчас получаете, - это сообщения об ошибках, поэтому ваш выходной файл усечен. Исправление проблемы с каталогом также должно помочь. Если вы также хотите регистрировать ошибки, вы можете сделать одно из следующих действий:
* * * * * /var/local/myapp/bin/import > /var/local/myapp/import.log 2>&1
или
* * * * * /var/local/myapp/bin/import > /var/local/myapp/import.log 2> /var/local/myapp/error.log
И это при условии, что вы хотите, чтобы он запускался каждую минуту. Если вы хотите, чтобы он запускался каждый час в течение получаса, вы бы сделали что-то вроде этого:
30 * * * * /var/local/myapp/bin/import > /var/local/myapp/import.log 2>&1
Как вы выяснили, cron работает с ограниченным окружением, включая путь.
Либо установите ПУТЬ в верхней части файла, либо (лучше) укажите полный / путь / к / пирогу (и / путь / к / журналу).
>> означает добавить в файл.
В вашем crontab вам, вероятно, следует указать время или времена, а не использовать все * s.