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"