通过 cronjob 检查进程 运行 以避免多次执行

Check processes run by cronjob to avoid multiple execution

如何避免 cronjob 在同一命令上执行多次?我曾尝试环顾四周并尝试检查并终止进程,但它不适用于以下代码。使用下面的代码,它会不断进入 else 条件,它应该是 "running"。知道我做错了哪一部分吗?

#!/bin/sh
devPath=`ps aux | grep "[i]mport_shell_script"` | xargs
if [ ! -z "$devPath" -a "$devPath" != " " ]; then
        echo "running"
        exit
else
        while true
        do
            sudo /usr/bin/php /var/www/html/xxx/import_from_datafile.php /dev/null 2>&1
            sleep 5
        done
fi
exit

定时任务:

*/2 * * * * root /bin/sh /var/www/html/xxx/import_shell_script.sh /dev/null 2>&1

检查脚本开头是否存在文件(例如 /tmp/runonce-import_shell_script)。如果它存在,则意味着相同的脚本已经 运行ning(或前一个因错误而停止)。

您还可以在该文件中添加一个时间戳,这样您就可以检查脚本何时 运行ning(并且可能决定在 24 小时后再次 运行 它,即使该文件存在)

我不明白添加一个 cron 作业的意义,它会启动一个 运行 是一个作业的循环。每分钟使用 cron 运行 作业或使用守护程序脚本来确保您的服务已启动并保持 运行ning。

要检查您的脚本是否已经 运行ning,您可以使用锁定目录(除非您的守护程序框架已经为您完成):

LOCK=/tmp/script.lock # You may want a better name here
mkdir $LOCK || exit 1 # Exit with error if script is already running

trap "rmdir $LOCK" EXIT # Remove the lock when the script terminates

...normal code...

如果您的 OS 支持它,那么 /var/lock/script 可能是更好的路径。

您的下一个问题可能是如何编写守护进程。要回答这个问题,我需要知道您使用的是哪种 Linux 以及您是否有 systemddaemonize