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

时间:2015-04-07 12:36:13

标签: bash shell unix sh crontab

如何避免cronjob在同一命令上执行多次?我试图环顾四周,尝试检查并杀死进程,但它不适用于下面的代码。使用下面的代码,它会继续进入其中假设“正在运行”的其他条件。知道我错误地做了哪一部分?

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

的cronjob:

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

2 个答案:

答案 0 :(得分:3)

我没有看到添加一个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等内容。

答案 1 :(得分:1)

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

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