Upstart 服务的 Cronjob 不起作用

Upstart 服务的 Cronjob 不起作用

我有一个 Upstart init 脚本,用于管理服务器上的 python 脚本。预启动和预停止脚本将带有时间戳的条目附加到日志文件中。有一个 cronjob 每小时停止和启动一次服务。当我以 root 身份启动或停止服务时,这些条目会添加到日志文件中,但当我的 cronjob 运行时,这些条目不会添加。

新贵脚本:

/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

计划任务:

crontab -l -u 根

# Stop and start the some_scriptd service once an hour
30 * * * * initctl stop some_scriptd && initctl start some_scriptd

我已经检查了 /var/log/cron 并且看到 cronjob 正在按计划运行。

Feb 15 09:30:01 my_server CROND[16371]: (root) CMD (initctl stop some_scriptd && initctl start some_scriptd)

日志文件不显示来自 cronjob 的条目,仅显示我以 root 身份手动停止和启动服务时的条目。

猫/var/log/some_scriptd.log

[2019-02-15 8:58:43AM] Some Script Stopping
[2019-02-15 8:58:43AM] Some Script Starting

更新:我在 cronjob 运行之前和之后检查了正在运行的 python 脚本的 pid,它保持不变。这表明 initctl 命令根本没有成功。这不仅仅是启动前和停止前脚本失败的问题。

答案1

我最终使用 shell 脚本包装器解决了这个问题,该包装器将 cronjob 的 PATH 设置为与 root 用户的 PATH 相匹配。

/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

计划任务:

# Stop and start the some_scriptd service once an hour
30 * * * * /usr/bin/some_scriptd_wrapper.sh

问题似乎是根用户 PATH 和 cronjob 使用的 PATH 之间的差异。

我创建了一个简单的 cronjob 来解决这个问题:

0 * * * * echo $PATH > /tmp/cronpath.txt

然后我比较了两个 PATH 并找到了 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 的 PATH 中。

相关内容