V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JhOOOn
V2EX  ›  问与答

crontab 执行程序时错误, crontab 会不断的重新尝试?

  •  
  •   JhOOOn · 2015-12-16 16:54:33 +08:00 · 2279 次点击
    这是一个创建于 3257 天前的主题,其中的信息可能已经有所发展或是发生改变。

    eg :
    crontab -e:

    10 9 * * * /bin/bash /home/xxx/eg.sh

    eg.sh 中:

    #!/bin/bash
    source /home/xxx/venv/bin/activate
    cd /home/xxx/eg
    python eg.py | tee eg.log
    

    在执行 eg.py 中途出现错误,我后来在 mail/xxx 中看到是, eg.py 每分钟执行了一次,

    进程中重复出现:

    CROND
    /bin/bash /home/xxx/eg.sh
    python eg.py
    tee eg.log

    请问造成这种原因因素是什么呢?

    另外:
    * * * * * /bin/bash eg.sh
    表示不执行吧。

    12 条回复    2015-12-19 11:56:18 +08:00
    Strikeactor
        1
    Strikeactor  
       2015-12-16 17:01:32 +08:00   ❤️ 1
    * * * * *是每分钟一次
    JhOOOn
        2
    JhOOOn  
    OP
       2015-12-16 17:19:39 +08:00
    @Strikeactor 卧槽,没认真看文档。谢谢你,那么这个程序如果设定每小时执行一次,通过 source 产生的进程会自动回收么?
    JhOOOn
        3
    JhOOOn  
    OP
       2015-12-16 20:42:03 +08:00
    @Strikeactor 我使用 * */ 1 * * * / bin/bash /home/xxx/eg.sh, 就会在进程中重复出现

    CROND
    /bin/bash /home/xxx/eg.sh
    python eg.py
    tee eg.log

    原因是什么呢?谢谢
    paulw54jrn
        5
    paulw54jrn  
       2015-12-16 21:13:31 +08:00
    @JhOOOn
    如果你不想多个 cron job 同时执行(上一个没结束下一个就进来了), 这个可以用 lockfile 实现.

    最简单的思路:
    - 执行时去制定路径检查 pid 文件.
    ---- 如果 pid 文件不存在
    --------- 把当前 pid 写入文件,继续执行
    ---- 若 pid 文件存在
    --------- grep pid, 看进程是否还活着
    -------------- 进程不存在, 写入 pid, 继续执行
    -------------- 存在, exit 0;
    JhOOOn
        6
    JhOOOn  
    OP
       2015-12-16 21:34:10 +08:00
    @paulw54jrn 谢谢您的思路,有用。另外,你给的链接打不开,还有,* */ 1 * * * 代表每个一个小时执行一次,但是我保存 crontab - e 后,不一会,就出现了好几个重复的进程,(重复的进程时间相差 1 秒):类似这个:

    xxx 2 1 0 09:00 ? 00:00:05 CROND
    xxx 3 2 0 09:00 ? 00:00:00 bin/bash /home/xxx/eg.sh
    xxx 4 3 0 09:00 ? 00:00:00 python eg.py
    xxx x x 0 09:00 ? 00:00:00 tee eg.log


    这是什么原因呢?
    按理说,就算进程没有回收,也应该是每隔一个小时之后出现重复的啊?这里我非常困惑,
    查看进程是 ps - ef ,系统是 centOs 6
    JhOOOn
        7
    JhOOOn  
    OP
       2015-12-16 21:35:11 +08:00
    类似这样:

    xxx 2 1 0 09:00 ? 00:00:05 CROND
    xxx 3 2 0 09:00 ? 00:00:00 bin/bash /home/xxx/eg.sh
    xxx 4 3 0 09:00 ? 00:00:00 python eg.py
    xxx x x 0 09:00 ? 00:00:00 tee eg.log

    xxx 2 1 0 09:01 ? 00:00:05 CROND
    xxx 3 2 0 09:01 ? 00:00:00 bin/bash /home/xxx/eg.sh
    xxx 4 3 0 09:01 ? 00:00:00 python eg.py
    xxx x x 0 09:01 ? 00:00:00 tee eg.log

    xxx 2 1 0 09:02 ? 00:00:05 CROND
    xxx 3 2 0 09:02 ? 00:00:00 bin/bash /home/xxx/eg.sh
    xxx 4 3 0 09:02 ? 00:00:00 python eg.py
    xxx x x 0 09:02 ? 00:00:00 tee eg.log
    paulw54jrn
        8
    paulw54jrn  
       2015-12-17 19:41:45 +08:00
    @JhOOOn

    * */1 * * * 并不是每小时执行一次. 它跟* * * * * 是一样的.
    每小时执行一次应该是 0 * * * *. 准确来说是每小时的第 0 分钟执行.
    paulw54jrn
        9
    paulw54jrn  
       2015-12-17 19:43:33 +08:00   ❤️ 1
    这是一个可以验证 cron 语句的网站: http://crontab.guru/.

    如果无法访问请备天梯.
    JhOOOn
        10
    JhOOOn  
    OP
       2015-12-18 10:23:48 +08:00
    @paulw54jrn 以感谢,很好的网站,我是按这个教程来的 http://linuxtools-rst.readthedocs.org/zh_CN/latest/tool/crontab.html#id18 ,我在你提供的网站试* */1 * * *这个提示‘ every min of 0 ~ 24 ’ 应该是你说的那样,我一会在机器上试试
    JhOOOn
        11
    JhOOOn  
    OP
       2015-12-18 11:11:12 +08:00
    在 osx 测试了 * */1 * * * date 确实是每分钟输出一次时间,那上面的教程应该不对
    JhOOOn
        12
    JhOOOn  
    OP
       2015-12-19 11:56:18 +08:00
    自问自答:
    原理不甚了解,但是这几天观察进程发现,运行程序都会同时存在 3 个相同的进程的,程序运行完就没有了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2217 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:41 · PVG 08:41 · LAX 16:41 · JFK 19:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.