linux定时任务crontab文件锁flock问题

    技术2022-07-11  121

    这几天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 如果没有立即获得锁,直接失败而不是等待。至于为啥会有多个进程就不太明白了,欢迎大神留言指点。

    Processed: 0.010, SQL: 9