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

2015-12-16 16:54:33 +08:00
 JhOOOn

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
表示不执行吧。

2285 次点击
所在节点    问与答
12 条回复
Strikeactor
2015-12-16 17:01:32 +08:00
* * * * *是每分钟一次
JhOOOn
2015-12-16 17:19:39 +08:00
@Strikeactor 卧槽,没认真看文档。谢谢你,那么这个程序如果设定每小时执行一次,通过 source 产生的进程会自动回收么?
JhOOOn
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
2015-12-16 21:07:10 +08:00
paulw54jrn
2015-12-16 21:13:31 +08:00
@JhOOOn
如果你不想多个 cron job 同时执行(上一个没结束下一个就进来了), 这个可以用 lockfile 实现.

最简单的思路:
- 执行时去制定路径检查 pid 文件.
---- 如果 pid 文件不存在
--------- 把当前 pid 写入文件,继续执行
---- 若 pid 文件存在
--------- grep pid, 看进程是否还活着
-------------- 进程不存在, 写入 pid, 继续执行
-------------- 存在, exit 0;
JhOOOn
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
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
2015-12-17 19:41:45 +08:00
@JhOOOn

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

如果无法访问请备天梯.
JhOOOn
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
2015-12-18 11:11:12 +08:00
在 osx 测试了 * */1 * * * date 确实是每分钟输出一次时间,那上面的教程应该不对
JhOOOn
2015-12-19 11:56:18 +08:00
自问自答:
原理不甚了解,但是这几天观察进程发现,运行程序都会同时存在 3 个相同的进程的,程序运行完就没有了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX