【问题标题】:Check processes run by cronjob to avoid multiple execution检查cronjob运行的进程,避免多次执行
【发布时间】:2015-06-12 01:26:49
【问题描述】:

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

#!/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

【问题讨论】:

  • 您可以创建一个 .lock 文件,该文件在作业执行结束时才被释放
  • ^ 我该怎么做?可以发布完整的解决方案吗?
  • 任务开始时触摸文件,任务完成时删除。或者通过 cron 将你的任务间隔更远,这样它就不会以这种方式重叠(假设这是可能的)。
  • ^ 请发布解决方案?所以我会尝试并接受它。

标签: bash shell unix sh crontab


【解决方案1】:

我看不出添加一个 cron 作业然后启动一个运行作业的循环的意义。使用 cron 每分钟运行一次作业,或者使用守护程序脚本确保您的服务已启动并保持运行。

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

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...

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

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

【讨论】:

    【解决方案2】:

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

    您还可以在该文件中添加时间戳,以便检查脚本从何时开始运行(并且可能决定在 24 小时后再次运行,即使该文件存在)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      相关资源
      最近更新 更多