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

Использование команды which в задании cron

У меня есть задание 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