我有一个 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 中。