Задать вопрос
@coliator
всякое бывало

Как заставить правильно выполняться bash-скрипт в crontab?

Приветствую!
ОС FreeBSD 7.3
Bash скрипт вручную отрабатывает без всяких проблем:
#!/bin/bash
        ret=$(ps aux | grep [s]cript | wc -l)
        if [ "$ret" -eq 0 ]
then {
        echo "Running script"
        sleep 1  #delay
        script.sh start
        exit 1
}
else
{
        echo "EXIT. script already running!"
        exit 1
}
fi;

Но в crontab'е он никак правильно работать не хочет. Как бы я его туда не добавлял. Скидывал вывод значения переменной ret из него в лог, и она в любом случае оказывается равна нулю, хотя на деле это не так. PATH в задание крона добавлял.
SHELL=/bin/bash
MAILTO=user@mail.ru
PATH=/sbin:/bin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/home/admin/bin
* * * * * /usr/local/script.sh

Абсолютные пути к ps, grep и wc прописывал. Всё бесполезно. Куда копать?
  • Вопрос задан
  • 2225 просмотров
Подписаться 2 Оценить 8 комментариев
Решения вопроса 1
@coliator Автор вопроса
всякое бывало
Всем спасибо за советы, жаль только что они не помогли.
Выяснить почему оператор "-eq" отрабатывал неправильно мне так и не удалось. Поэтому сравнение стал делать другим способом и всё из-под cron заработало корректно.
#!/bin/bash
if [ -z "$(pgrep -f [s]cript)" ]
then {
        echo $(date +%Y-%m-%d:%k:%M:%S) "Running script" >> /var/log/script_log
        sleep 1  #delay
        /usr/local/script.sh start
        exit 1
} else {
        echo $(date +%Y-%m-%d:%k:%M:%S) "EXIT. script already running!" >> /var/log/script_log
        exit 1
}
fi
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
По моему у вас проблема в пути к файлу script.sh
Ответ написан
athacker
@athacker
Как минимум, в PATH у вас не хватает /usr/bin. Между тем:

% whereis grep
grep: /usr/bin/grep /usr/share/man/en.UTF-8/man1/grep.1.gz /usr/src/usr.bin/grep
Ответ написан
@Eddy_Em
Чтобы crond не убивал скрипт, нужно "оторвать" этот скрипт: например, запустить его через nohup и в фоне.
А вообще, лучше его запускать из inittab, пометив как respawn, чтобы init перезапустил скрипт в случае, когда тот отвалится. Если перезапуск не нужен, можно вообще по-человечески сделать: написать простую init-обертку и запихать туда, где ваши скрипты для текущего уровня запуска лежат.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы