docker中无法使用crontab的问题

最近在docker里使用crontab设置定时任务,发现crontab到时间没有执行。

第一个想到的是时区问题,查看了一下时区,是UTC时区,赶紧改成了Asia/Shanghai

使用date命令查看,时间没问题了。设置个时间测试一下,结果仍然不执行。

检查crontab任务是否启动

一切正常啊,奇怪。

装上rsyslog并启动,查看相关日志:

里面说set_loginuid failed,这个似乎是个认证模块,因为安全原因,被docker默认禁用掉了。修改/etc/pam.d/cron,把下面这行注释掉(也可以使用更高的权限启动容器,比如gdb无法使用的情况):

也可以把中间的required修改为optional来解决。

重启cron,运行成功。

同样的,ssh也会有这样的问题,因为也用到了pam认证模块,可以参考下面给出的链接来解决。

参考:

docker容器中crontab无法正常运行解决方案
Dockerize an SSH service

环境参考:

Docker版本:1.13.1
系统:archlinux

一些crontab要注意的地方

crontab是很常用的软件,这里说一些要注意的地方。

如果你的定时脚本执行需要utf-8环境,那么不要忘记加

export LANG=en_US.UTF-8

所以你的任务可能像下面一样

* * * * 1 export LANG=en_US.UTF-8 && /bin/sh do-something.sh

或者其他UTF-8编码的都可以,这样才才不至于执行的时候cron认为你的环境用ascii或其他编码。

如果你的是一个gui程序,那这个程序到时间应该不会显示,具体原因可以搜索shell的机制、cron的机制、DSIPALY和xpath等。可以增加下面一段话来解决此问题:

export DISPLAY=:0

类似于

* * * * 1 export DISPLAY=:0 && /bin/sh do-something.sh

如果还不行,那么请查看xpath,或者通过xterm来转发一下吧。