让我们假设我有一个这样的 cron 作业:
*/15 * * * * /path/to/thedaemon
守护进程(它是一个 python 守护进程,通过from daemon import runner
)将不允许其自身的多个实例,这本身就非常好。当守护进程已经运行时,它尝试启动它,结果如下:
lockfile.LockTimeout: Timeout waiting to acquire lock for /tmp/thedaemon.pid
当然,cron 作业并不关心 - 它可以继续定期执行命令,以便在它没有运行的情况下,它然后开始运行。但这不是很优雅。
更优雅的是,有没有办法设置 cron 作业在启动之前知道守护进程是否正在运行? 也许是一个简写的 if 条件?
简而言之,如何设置 cron 作业以确保守护进程正在运行?
如果正在运行,则不执行任何操作。如果未运行,则启动。
答案1
您可以将 python 守护进程包装在 shell 脚本中。首次启动时,检查该进程是否已在运行:
pid=$(cat pid.file)
ps -ef | grep $pid | grep <command to start daemon>
if [[ $? -eq 0 ]]; then
echo "daemon already running" & exit 1
else
<command to start daemon> & \
echo $! > pid.file
fi