У меня есть задание cron, которое выполняется один раз в день на сервере Linux, и в выполняемом им скрипте есть тест:
# Validate ffmpeg is installed
if [ $(which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
echo "error: ffmpeg is not installed!" | tee -a "$log"
exit 1
fi
Каждый день, когда я проверяю файл журнала, появляется сообщение ffmpeg is not installed!
находится в журнале и в результате работа не выполнена. Если я запустил which
test в оболочке все работает нормально, и когда я запускаю скрипт, все работает.
Есть ли в cron что-то внутреннее, что мешает ему правильно использовать which
команда?
Вверху вашего файла crontab поместите объявление SHELL и PATH, например:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Видеть это сообщение SE Больше подробностей.
По умолчанию SHELL и PATH для cron: SHELL=/bin/sh
, PATH=/usr/bin:/bin
(Из man 5 crontab
страницу руководства).
Вероятно, он не выбирает ваш путь, так как он работает из cron. Есть несколько способов сообщить ему путь, самый простой, который я нашел, - это просто запрограммировать путь к которому.
Сделайте:
locate which
Моя возвращает это:
[user@server ~]$ locate which |grep bin
/usr/bin/which
Затем измените свой сценарий на:
if [ $(/usr/bin/which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
echo "error: ffmpeg is not installed!" | tee -a "$log"
exit 1
fi
Другой вариант - установить среду и путь в crontab:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin