通过 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 以及您是否有 systemd
、daemonize 等
如何避免 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 以及您是否有 systemd
、daemonize 等