美文网首页Laravel开发实践程序员
Linux cron 中脚本执行超时限定和互斥配置

Linux cron 中脚本执行超时限定和互斥配置

作者: Zero_75 | 来源:发表于2019-03-12 16:01 被阅读7次

    Linux cron 中脚本执行超时限定和互斥配置

    场景

    • 假设有一个 PHP 脚本用来发送邮件,使用 Linux cron 每分钟执行一次;
    • 为阐明使用方式-暂不引入队列系统,其实使用队列处理此方式更优;
    • 例如基本的配置如下
    * * * * * php /home/app/email.php
    

    可能存在的问题

    1. 如果这个邮件服务出现异常,进程僵死如何处理?
      假设由于未知因素, email.php 脚本一直执行,没有退出。极端的情况,进入一个 while 死循环。
      原本一分钟执行一次,现在僵死后面的脚本也无法执行

    解决办法:

    • 使用 timeout,假设我们设定每个脚本最多执行时间位 200秒,超过 200秒 就自动 kill。
    * * * * * timeout 200 php /home/app/email.php
    
    1. 如果这个脚本执行时间超过 60秒,下一分钟又会执行 php email.php,如果避免重复执行?
      这样会出现,有两个进程同时在执行 php email.php,会不会出现同一个任务被执行了两次?

    解决办法:

    • 使用 flock 进行互斥控制
    • flock 命令参考
    用法:
     flock [选项] <文件|目录> <命令> [<参数>...]
     flock [选项] <文件|目录> -c <命令>
     flock [选项] <文件描述符号码>
    
    通过 shell 脚本管理文件锁。
    
    选项:
     -s, --shared             获取共享锁
     -x, --exclusive          获取排他锁(默认)
     -u, --unlock             移除锁
     -n, --nonblock           失败而非等待
     -w, --timeout <秒>       等待限定的时间
     -E, --conflict-exit-code <数字>     冲突或超时后的退出代码
     -o, --close              运行命令前关闭文件描述符
     -c, --command <命令>      通过 shell 运行单个命令字符串
     -F, --no-fork            执行命令时不 fork
         --verbose            增加详尽程度
    
     -h, --help               display this help
     -V, --version            display version
    
    • 我们用到其中的排他设置
    * * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php"
    
    • 记录日志-便于后期排查
    * * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php >> /home/log/test.log 2>&1"
    
    • 总结

    * * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php >> /home/log/test.log 2>&1" 
    

    相关文章

      网友评论

        本文标题:Linux cron 中脚本执行超时限定和互斥配置

        本文链接:https://www.haomeiwen.com/subject/odrnpqtx.html