跳至正文

crontab任务堆积导致启动大量进程的处理(flock)

  • 运维

crontab在执行任务过程中,可能由于任务执行错误或者在下一个任务开始前,前一个任务没有执行完成,导致大量的进程产生,最后导致死机等。
可以使用flock来加锁防止启动大量进程:

flock [-sxon][-w #] file [-c] command

-s, --shared:    获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待
-w, --timeout:   如果没有立即获得锁,等待指定时间
-o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command:   在shell中运行一个单独的命令
-h, --help       显示帮助
-V, --version:   显示版本

查看运行的进程:

ps -A | grep crond

任务堆积的大量进程的处理:

ps -ef | grep COMMAD | grep -v grep | awk '{print $2}' | xargs kill

#举例
ps -ef | grep crontab | grep -v grep | awk '{print $2}' | xargs kill
ps -ef | grep QuerySendDetails | grep -v grep | awk '{print "kill -9 " $2}' | sh
ps -ef | grep "QuerySendDetails.sh" | grep -v grep | awk '{print "kill -9 " $2}' | sh
ps -ef | grep "QuerySendDetails.php" | grep -v grep | awk '{print "kill -9 " $2}' | sh

任务举例:

* * * * * flock -xn /tmp/QuerySendDetails.lock -c "/data/crontab/QuerySendDetails.sh"
* * * * * flock -xn /tmp/sendBatchSms.lock -c "/usr/bin/php /data/crontab/sendBatchSms.php"
* * * * * sleep 10; flock -xn /tmp/sendBatchSms1.lock -c "/usr/bin/php /data/crontab/sendBatchSms.php"
* * * * * sleep 20; flock -xn /tmp/sendBatchSms2.lock -c "/usr/bin/php /data/crontab/sendBatchSms.php"
* * * * * sleep 30; flock -xn /tmp/sendBatchSms3.lock -c "/usr/bin/php /data/crontab/sendBatchSms.php"
* * * * * sleep 40; flock -xn /tmp/sendBatchSms4.lock -c "/usr/bin/php /data/crontab/sendBatchSms.php"
* * * * * sleep 50; flock -xn /tmp/sendBatchSms5.lock -c "/usr/bin/php /data/crontab/sendBatchSms.php"
标签: