这几天linux的定时任务不运行,各种找原因,最终是因为文件锁的问题,自己总结一下,也希望能帮助其他小伙伴。
如果你的crontab还不熟悉可以参考:linux定时任务crontab
下面是我的定时任务:
*/1 * * * * flock -n /tmp/timing_pub.lock /data/server/php/bin/php /data/server/www/web/app/script/index.php article timing_pub >> /tmp/timing_pub.log
使用linux flock 文件锁实现任务锁定,那么flock又是怎么使用的呢?
语法:
flock [-sxun][-w #] fd#
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: 显示版本
脚本单独执行没有问题,定时任务写法也没有问题,那为啥没有实行呢?参看一下进程吧
[web@BJ-ZB-ZCBNGINX-98-21 tmp]$ ps -ef | grep '/tmp/timing_pub.lock'
web 24844 24207 0 14:01 pts/0 00:00:00 grep /tmp/timing_pub.lock
web 59942 1 0 Jun09 ? 00:00:00 flock -n /tmp/timing_pub.lock /data/server/php/bin/php /data/server/www/web/app/script/script.php article timing_pub
web 116389 1 0 Jun16 ? 00:00:00 flock -n /tmp/timing_pub.lock /data/server/php/bin/php /data/server/www/web/app/script/script.php article timing_pub
web 186384 186380 0 Jun25 ? 00:00:00 /bin/sh -c flock -n /tmp/timing_pub.lock /data/server/php/bin/php /data/server/www/web/app/script/script.php article timing_pub >> /tmp/timing_pub.log
web 186386 186384 0 Jun25 ? 00:00:00 flock -n /tmp/timing_pub.lock /data/server/php/bin/php /data/server/www/web/app/script/script.php article timing_pub
发现有多个进程,先杀掉进程 kill 116389 等等再说。结果还是不执行,怎么回事呢?
/tmp/timing_pub.lock已经被锁了,将 /tmp/timing_pub.lock 的文件删除即可。
终于恢复正常了,瞬间心情放松了。
flock -n 如果没有立即获得锁,直接失败而不是等待。至于为啥会有多个进程就不太明白了,欢迎大神留言指点。