使用 cronjob 运行 Python 进程并检查它是否仍在每分钟运行

the*_*t_1 4 python cron python-2.7

我有一个 Python 脚本,我想从 cronjob 运行它,然后每分钟检查它是否仍在运行,如果没有,则重新启动它。

定时任务是:

/usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py
Run Code Online (Sandbox Code Playgroud)

有一些关于此的信息,但大多数答案并没有真正清楚地详细说明整个过程,例如:

使用 cron 作业检查 python 脚本是否正在运行

例如,在这种情况下,它没有说明如何运行初始进程并记录 PID。不幸的是,这给我留下了很多问题。

因此,谁能给我一个简单的指南来说明如何做到这一点?

例如需要完整的shell 脚本、启动脚本的命令等等。

Can*_*ner 5

现在有一种更好的方法可以通过名为flock 的实用程序直接从单行中的 cron 任务执行此操作。flock将在运行您的应用程序之前获取锁定并在运行后释放它。格式如下:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile <your cron job>
Run Code Online (Sandbox Code Playgroud)

对于您的情况,这将是:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py
Run Code Online (Sandbox Code Playgroud)

-n如果无法获取锁,则告诉它立即失败。还有一个-w <seconds>选项,如果在给定的时间范围内无法获取锁,它将失败。

 * * * * /usr/bin/flock -w <seconds> /tmp/fcj.lockfile <your cron job>
Run Code Online (Sandbox Code Playgroud)


Gen*_*ene 3

这并不难。首先设置crontab每分钟运行一次检查器:

* * * * * /home/mydir/check_and_start_script.sh
Run Code Online (Sandbox Code Playgroud)

现在在/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
Run Code Online (Sandbox Code Playgroud)

这将检查是否存在具有上次运行脚本的进程 ID 的文件。如果存在,它会读取 pid 并检查进程是否仍在运行。如果没有,则它将当前正在运行的 shell 的 pid 放入文件中,并在同一进程中执行 python 脚本,从而终止 shell。否则它什么也不做。

不要忘记使脚本可执行

chmod 755 /home/mydir/check_and_start_script.sh
Run Code Online (Sandbox Code Playgroud)