一台新安装的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的交互模式是无法生效。
至此,问题解决。