У меня есть сценарий инициализации Upstart, который управляет сценарием python на сервере. Сценарии перед запуском и перед остановкой добавляют запись с отметкой времени в файл журнала. Существует cronjob для остановки и запуска службы один раз в час. Когда я запускаю или останавливаю службу как root, эти записи добавляются в файл журнала, но когда мое задание cron запускается, записи не добавляются.
Сценарий Upstart:
/etc/init/some_scriptd.conf
description "Manages some_script"
author "me"
start on runlevel [2345]
stop on shutdown
respawn
respawn limit 10 10
script
exec /usr/bin/python3.4 /usr/bin/some_script.py
end script
pre-start script
echo "[`date +%Y-%m-%d%l:%M:%S%p`] Some Script Starting" >> /var/log/some_scriptd.log
end script
pre-stop script
echo "[`date +%Y-%m-%d%l:%M:%S%p`] Some Script Stopping" >> /var/log/some_scriptd.log
end script
Cronjob :
crontab -l -u root
# Stop and start the some_scriptd service once an hour
30 * * * * initctl stop some_scriptd && initctl start some_scriptd
Я проверил / var / log / cron и вижу, что задание cron выполняется по расписанию.
Feb 15 09:30:01 my_server CROND[16371]: (root) CMD (initctl stop some_scriptd && initctl start some_scriptd)
В файле журнала не отображаются записи из задания cron, только из когда я вручную останавливаю и запускаю службу от имени пользователя root.
cat /var/log/some_scriptd.log
[2019-02-15 8:58:43AM] Some Script Stopping
[2019-02-15 8:58:43AM] Some Script Starting
Update: Я проверил pid запущенного скрипта python до и после запуска cronjob, и он остался прежним. Это указывает мне на то, что команда initctl вообще не удалась. Дело было не только в сбое предпускового и предостанового сценариев.
В итоге я решил эту проблему с помощью оболочки сценария оболочки, которая устанавливает ПУТЬ задания cron в соответствии с ПУТЬ пользователя root.
/usr/bin/some_scriptd_wrapper.sh
#!/bin/bash
PATH="/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
initctl stop harvestd && initctl start harvestd
Cronjob:
# Stop and start the some_scriptd service once an hour
30 * * * * /usr/bin/some_scriptd_wrapper.sh
Проблема, похоже, заключается в разнице между PATH пользователя root и PATH, используемым cronjob.
Я создал простое cronjob, чтобы найти это:
0 * * * * echo $PATH > /tmp/cronpath.txt
Затем я сравнил два ПУТЬ и нашел команду initctl:
# cat /tmp/cronpath.txt
/usr/bin:/bin
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# locate initctl
/sbin/initctl
initctl находится в / sbin, а не в ПУТИ cronjob.