怎么在定时器crontab中使用flock文件锁?

BILLSSJONE 2014-06-27 01:41:20
上个任务没执行完时,用来防止再次执行任务的。。。

*/10 * * * * flock -xn /var/www/html/create.lock -c '/usr/bin/php /var/www/html/test.php'

上面这条crontab定时器10分种执行一次,
已经在/var/www/html/下建立了空的create.lock文件,
test.php文件里面就是生成一个create.lock文件的程序,
照理说存在create.lock文件就不执行test.php,是这样吗?
但是我看到create.lock文件的修改日期在更新,10分钟更新一次,就是说还是相隔10分钟还是执行一次test.php啊。。。
是我的crontab写的有问题吗?怎么做到存在create.lock就不执行test.php?就是文件锁起作用。。怎么做到?
...全文
480 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲雪星枫 2014-07-30
  • 打赏
  • 举报
回复
李睿_Lee 2014-07-05
  • 打赏
  • 举报
回复
正常情况下不应该这样的,可能你的代码有问题。
李睿_Lee 2014-07-03
  • 打赏
  • 举报
回复
if(file_exists('/tmp/create.lock')){
exit();}
已经exit了,怎么会排队?
BILLSSJONE 2014-07-03
  • 打赏
  • 举报
回复
引用 21 楼 xuzuning 的回复:
这不是对的吗? 加锁的目的就是不让他一次运行多个
是对的。。。如果能真正做到文件锁就好了。。在程序里判断,感觉好像会任务会排队,不是后面的在等前面的执行完。。不知道怎么看这些任务有没有在排队。。
BILLSSJONE 2014-07-03
  • 打赏
  • 举报
回复
引用 23 楼 Novolee 的回复:
if(file_exists('/tmp/create.lock')){
exit();}
已经exit了,怎么会排队?
好像排完队后才执行exit。。第一个任务没执行完前会卡在那。不知道服务器自动执行是不是这样。。我在浏览器上测试是这样,用浏览器打开执行第一次任务,然后接着再开一个窗口执行第二次任务,然后第二次就在那转,第一次没执行完第二次在那等的,
xuzuning 2014-07-02
  • 打赏
  • 举报
回复
这不是对的吗? 加锁的目的就是不让他一次运行多个
BILLSSJONE 2014-07-02
  • 打赏
  • 举报
回复
引用 19 楼 fdipzone 的回复:
[quote=引用 18 楼 BILLSSJONE 的回复:] [quote=引用 16 楼 fdipzone 的回复:] 可将判断写在php里 */10 * * * * /usr/bin/php /var/www/html/test.php 在test.php 裡面,開頭 if(file_exists('/tmp/create.lock')){ exit(); }else{ file_put_contents('/tmp/create.lock', 1, true); } 然後在程序最後 unlink('/tmp/create.lock');
是啊,是这样。。但是文件锁好像没起作用,有create.lock存在也会执行test.php[/quote] if(file_exists('/tmp/create.lock')){ exit(); 存在怎麼會執行下去呢?[/quote] 是crontab中的定时器会执行test.php文件。。这个文件判断跟变量一样的,第一次没执行完,第二次会卡在那里排队,
傲雪星枫 2014-07-02
  • 打赏
  • 举报
回复
引用 18 楼 BILLSSJONE 的回复:
[quote=引用 16 楼 fdipzone 的回复:] 可将判断写在php里 */10 * * * * /usr/bin/php /var/www/html/test.php 在test.php 裡面,開頭 if(file_exists('/tmp/create.lock')){ exit(); }else{ file_put_contents('/tmp/create.lock', 1, true); } 然後在程序最後 unlink('/tmp/create.lock');
是啊,是这样。。但是文件锁好像没起作用,有create.lock存在也会执行test.php[/quote] if(file_exists('/tmp/create.lock')){ exit(); 存在怎麼會執行下去呢?
BILLSSJONE 2014-07-02
  • 打赏
  • 举报
回复
引用 16 楼 fdipzone 的回复:
可将判断写在php里 */10 * * * * /usr/bin/php /var/www/html/test.php 在test.php 裡面,開頭 if(file_exists('/tmp/create.lock')){ exit(); }else{ file_put_contents('/tmp/create.lock', 1, true); } 然後在程序最後 unlink('/tmp/create.lock');
是啊,是这样。。但是文件锁好像没起作用,有create.lock存在也会执行test.php
BILLSSJONE 2014-07-02
  • 打赏
  • 举报
回复
引用 14 楼 Novolee 的回复:
[quote=引用 12 楼 BILLSSJONE 的回复:] [quote=引用 11 楼 Novolee 的回复:] 如果要在test.php里面判断,有很多方法,就你说的,变量,某次开始执行时改变缓存变量为0,执行完成后将变量设置为1。 至于变量的保存,可以存很多地方:比如利用缓存,比如文本文件,比如数据库,所有能持久化,或者跨页面的都行。
我就是这样想的,是用文本文件存变量的。。初始变量为1,第一次开始执行后设变量为0,执行完变量为设为1。但是就只执行一次,之后这变量一直都是0。。 我想可能是第一次没执行完,第二次又来了,所以排着队在那等第二次执行,而第二次执行使用的变量是0,并不是用第一次执行完后设为1的变量,然后第二次开始时又马上又把变量设成0了。。所以变量一直是0,就只执行了一次。。。[/quote] 你逻辑不对,按你一开始说的,10分钟执行一次,如果已经有任务在执行的,这次就不执行了,那还有什么排队的问题?直接再过10分钟执行就完了。[/quote] 因为是执行同一个文件test.php,第一次没执行完,第二次执行好像会卡在那里,等第一次完了后才继续第二次执行
李睿_Lee 2014-07-01
  • 打赏
  • 举报
回复
引用 12 楼 BILLSSJONE 的回复:
[quote=引用 11 楼 Novolee 的回复:] 如果要在test.php里面判断,有很多方法,就你说的,变量,某次开始执行时改变缓存变量为0,执行完成后将变量设置为1。 至于变量的保存,可以存很多地方:比如利用缓存,比如文本文件,比如数据库,所有能持久化,或者跨页面的都行。
我就是这样想的,是用文本文件存变量的。。初始变量为1,第一次开始执行后设变量为0,执行完变量为设为1。但是就只执行一次,之后这变量一直都是0。。 我想可能是第一次没执行完,第二次又来了,所以排着队在那等第二次执行,而第二次执行使用的变量是0,并不是用第一次执行完后设为1的变量,然后第二次开始时又马上又把变量设成0了。。所以变量一直是0,就只执行了一次。。。[/quote] 你逻辑不对,按你一开始说的,10分钟执行一次,如果已经有任务在执行的,这次就不执行了,那还有什么排队的问题?直接再过10分钟执行就完了。
傲雪星枫 2014-07-01
  • 打赏
  • 举报
回复
可将判断写在php里 */10 * * * * /usr/bin/php /var/www/html/test.php 在test.php 裡面,開頭 if(file_exists('/tmp/create.lock')){ exit(); }else{ file_put_contents('/tmp/create.lock', 1, true); } 然後在程序最後 unlink('/tmp/create.lock');
码无边 2014-07-01
  • 打赏
  • 举报
回复
那你写个shell脚本,判断.lock文件是否存在,存在就不执行,不存在就执行,或者你通过php执行exec(),相应的判断文件即可。
BILLSSJONE 2014-06-30
  • 打赏
  • 举报
回复
引用 9 楼 Novolee 的回复:
运行不运行test.php不是关键问题,问题是有没有阻止了test.php里的相关逻辑代码的执行。你可以在test.php里一开始就判断该不该执行后面的代码。 当然,能直接不执行test.php是最好的。
我现在也想做个判断不执行test.php里面的代码,但是不知道怎么判断,我想加载一个文件,文件里面只有一个变量,变量为1就执行,为0就不执行。。 但是好像行不通,逻辑不通,第一次执行设变量为1.。然后怎么让它变成0不执行第二次(第一次还没完成的时候)?
李睿_Lee 2014-06-30
  • 打赏
  • 举报
回复
运行不运行test.php不是关键问题,问题是有没有阻止了test.php里的相关逻辑代码的执行。你可以在test.php里一开始就判断该不该执行后面的代码。 当然,能直接不执行test.php是最好的。
BILLSSJONE 2014-06-30
  • 打赏
  • 举报
回复
或者有其它什么方法怎么做到这样的功能? 就是等执行完了再执行下一次。。而不是没执行完第一次又定时触发第二次,甚至第一次没执行完就触发第三第四次,这样会导至服务器有问题吧。。
BILLSSJONE 2014-06-30
  • 打赏
  • 举报
回复
引用 11 楼 Novolee 的回复:
如果要在test.php里面判断,有很多方法,就你说的,变量,某次开始执行时改变缓存变量为0,执行完成后将变量设置为1。 至于变量的保存,可以存很多地方:比如利用缓存,比如文本文件,比如数据库,所有能持久化,或者跨页面的都行。
这样可以做到了。。执行开始设为0加个判断,原本是1的才设为0,已经是0的不做任何操作退出。。。
BILLSSJONE 2014-06-30
  • 打赏
  • 举报
回复
引用 11 楼 Novolee 的回复:
如果要在test.php里面判断,有很多方法,就你说的,变量,某次开始执行时改变缓存变量为0,执行完成后将变量设置为1。 至于变量的保存,可以存很多地方:比如利用缓存,比如文本文件,比如数据库,所有能持久化,或者跨页面的都行。
我就是这样想的,是用文本文件存变量的。。初始变量为1,第一次开始执行后设变量为0,执行完变量为设为1。但是就只执行一次,之后这变量一直都是0。。 我想可能是第一次没执行完,第二次又来了,所以排着队在那等第二次执行,而第二次执行使用的变量是0,并不是用第一次执行完后设为1的变量,然后第二次开始时又马上又把变量设成0了。。所以变量一直是0,就只执行了一次。。。
李睿_Lee 2014-06-30
  • 打赏
  • 举报
回复
如果要在test.php里面判断,有很多方法,就你说的,变量,某次开始执行时改变缓存变量为0,执行完成后将变量设置为1。 至于变量的保存,可以存很多地方:比如利用缓存,比如文本文件,比如数据库,所有能持久化,或者跨页面的都行。
BILLSSJONE 2014-06-27
  • 打赏
  • 举报
回复
引用 5 楼 dcxy0 的回复:
你每次设置完crontab之后要重新加载的,最好是重启一下服务 service crond restart 试试
service crond restart了还是每次都执行test.php
加载更多回复(6)

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧