Назад | Перейти на главную страницу

Используйте cron для запуска сценария bash, который запускает кучу подкоманд

У меня есть следующий сценарий оболочки: /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.