Cronjob для службы Upstart не работает

У меня есть сценарий инициализации 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 вообще не удалась. Дело было не только в сбое предпускового и предостанового сценариев.

0
задан 16 February 2019 в 03:48
1 ответ

В итоге я решил эту проблему с помощью оболочки сценария оболочки, которая устанавливает ПУТЬ задания 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.

0
ответ дан 5 December 2019 в 04:07

Теги

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