我有一个Python脚本,我想从cronjob运行,然后检查每一分钟是否仍在运行,如果没有,则再次启动它。
Cronjob是:
/usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py
有一些信息,但大多数答案并没有明确详细说明整个过程,例如:
Using cron job to check if python script is running
e.g。在这种情况下,它没有说明如何运行初始进程并记录PID。不幸的是,这给我留下了很多问题。
因此,有人可以给我一个如何做到这一点的简单指南吗?
e.g。需要完整的shell脚本,启动脚本的命令,等等。
答案 0 :(得分:3)
这并不难。首先设置* * * * * /home/mydir/check_and_start_script.sh
每分钟运行一次检查:
/home/mydir/check_and_start_script.sh
现在在#!/bin/bash
pid_file='/home/mydir/script.pid'
if [ ! -s "$pid_file" ] || ! kill -0 $(cat $pid_file) > /dev/null 2>&1; then
echo $$ > "$pid_file"
exec /usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py
fi
,
chmod 755 /home/mydir/check_and_start_script.sh
这将检查是否存在具有上次运行脚本的进程ID的文件。如果它在那里,它会读取pid并检查进程是否仍在运行。如果没有,那么它将当前运行的shell的pid放在文件中,并在同一进程中执行python脚本,终止shell。否则它什么都不做。
别忘了让脚本可执行
Team.join(:users).where('users.id in (?)', [1,5]).
select { |team| team.users.map(&:id).sort == [1,5] }
答案 1 :(得分:1)
你应该退后一步,想一想你为什么以及为什么这样做
你需要从cron实际启动你的long_running程序吗?我问的原因是你然后写另一个程序(观察者)启动你的long_running程序。我希望你看到你真的不需要cron来启动你的long_running程序。
所以你所拥有的是一个观察者每分钟开始并且如果它没有运行则启动long_running程序。
现在你需要真正理解你想要做什么,因为有很多方法可以做到这一点。如果这是一个练习观察者可以调用ps并在那里运行并开始运行。 在bash中你可以做到
[ -z "$(ps -ef | grep -v grep | grep myprogname)" ] && { echo runit; }
你只需用名称替换myprogname并使用在后台启动long_running代码的命令运行它 - 也许
但是你应该使用其他工具。 systemd,daemontools或其他
答案 2 :(得分:0)
现在有更好的方法可以通过名为flock的实用程序直接从单行内的cron任务执行此操作。 flock
会在运行您的应用之前获得锁定,并在运行后将其释放。格式如下:
* * * * * /usr/bin/flock -n /tmp/fcj.lockfile <your cron job>
对于您的情况,这是:
* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py
-n
告诉它如果无法获取锁定则立即失败。还有-w <seconds>
选项,如果它无法在给定的时间范围内获取锁定,它将失败。
* * * * /usr/bin/flock -w <seconds> /tmp/fcj.lockfile <your cron job>
答案 3 :(得分:0)
在您的 crontab 文件中,输入以下代码:
command='/usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py'
\* * * * * pgrep -af "$command" || $command
说明:
每分钟,pgrep 都会检查 python 脚本是否已经在运行。如果它正在运行,则不会调用第二条语句,因为我们使用了 ||
。如果 pgrep 无法在现有进程中找到 python 脚本,则将执行第二条语句,python 脚本将重新开始工作