记一次crontab无法执行的排查方法

1,104 阅读2分钟

一台新安装的Ubuntu 云服务器,没有安装cronjob,现在需要执行一个每分钟一次的定时任务,去启动一个docker容器,业务逻辑在容器内完成,大概耗时几秒钟,执行后就关闭删除容器即可。

本以为会很简单

功能很简单,那就开始安装cronjob吧

sudo apt-get install -y cron

看起来没什么问题。

去写一个bash脚本,启动docker容器

#! /bin/bash
docker run -it --rm -v $PWD:/tmp IMAGE:TAG CMD >> $PWD/log.txt

看起来也很easy没毛病

容器里面print的内容都会放到log.txt文件当中,看起来也OK的。

去编写一下crontab吧

crontab -e

是一个每分钟一次的定时任务,就简单的编辑一下即可。

* * * * * cd /xxx/xxx && bash a.sh

启动cronjob,使用命令cron并通过sudo service cron status查看是否正确运行。

没有预期效果

接下来就静静等待吧。

几分钟过去了,log.txt没有任何变化,还是0 Byte。

排查问题

没有任何日志,需要知道这个cronjob是否正确执行了才行。去把cron的日志打开。 修改文件/etc/rsyslog.d/50-default.conf文件,把其中的cron前面的注释符 # 给去掉,并执行 sudo service rsyslog restart 即可生效。去观察cron的日志/var/log/cron.log文件即可。

这时候发现有报错提示:

(CRON) info (No MTA installed, discarding output)

是因为没有安装邮箱服务。 解决起来也简单

sudo apt-get install -y postfix

安装之后别忘了根据提示把默认的cf文件复制进去(不然又要走很多弯路)

sudo cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf

将a.sh里的docker命令替换成一个简单的echo 1 >> log.txt试验一下,一切正常,cron.log的日志没有报错,log.txt的内容也增加了一行1.

改回原来的docker命令再试试看。

还是不行,没有任何日志的增长。

这就很奇怪了。

查看postfix的日志/var/log/mail.log/var/log/mail.err 发现有这样的报错:

mailed 54 bytes of output but got status 0x004b#012

还有一些奇怪的报错,又仔细看了一下a.sh里的docker命令,尝试着将-it改为 -d,一切就正常了。

应该是在cronjob中,docker的交互模式是无法生效。

至此,问题解决。