我有一个简单的Dockerfile如下
FROM ubuntu:latest
ADD crontab /etc/cron.d/test-cron
RUN chmod a+x /etc/cron.d/test-cron
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log
并且crontab
文件的内容就像
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
# empty line
当我在我的本地OS X机器上运行它(运行docker-machine)时,它工作正常(" Hello world"每分钟打印到日志文件)。但是,当我尝试在Ubuntu机器上运行它时,cron作业不会运行(空日志文件)。
这是我用来运行容器的命令
docker build -t crontest .
docker run --name cron crontest
我不确定为什么会这样。我想知道我的Ubuntu盒子是否有问题(错误的时间设置?)。我试图重启该机器无效。我目前在Ubuntu盒子上运行其他docker容器,它们运行正常。
关于如何调试/修复此问题的任何建议都将非常受欢迎。
编辑:
进入容器(docker exec -it cron /bin/bash
)后,我可以验证cron是否在那里运行:
root@a2ad451af8d9:/# ps -ef | grep cron
root 1 0 0 20:15 ? 00:00:00 /bin/sh -c cron && tail -f /var/log/cron.log
root 6 1 0 20:15 ? 00:00:00 cron
root 7 1 0 20:15 ? 00:00:00 tail -f /var/log/cron.log
root 25 11 0 20:21 ? 00:00:00 grep --color=auto cron
答案 0 :(得分:32)
使用apt-get install rsyslog
在容器内安装rsyslog,并在使用rsyslogd
(最大日志记录)启动cron之前使用命令cron -L15
启动它。然后查看容器内的文件/var/log/syslog
以查看cron守护程序自己的日志输出。它将告诉您解析crontab时是否存在问题,在您的情况下,如果已经注册并且正在尝试运行您的工作,则会在每分钟记录一个类似于下面的条目。
CRON[16]: (root) CMD (echo "Hello world" >> /var/log/cron.log 2>&1)
答案 1 :(得分:1)
我有类似的问题,特别是Ubuntu 14.04。为了调试,我尝试在前台运行cron,并在尝试运行预定作业时发现它发出System error
消息。
显然,它是--net=host
参数的已知问题(参考:https://github.com/moby/moby/issues/5899)。我按照建议尝试传递--pid=host
,然后,cron作业开始正常运行。
答案 2 :(得分:0)
我有一个名为backup.sh
的备份脚本,我将其复制到/etc/cron.daily
。
该脚本未正确调用。
为了实现这一点,我必须重命名为backup
,而不是.sh
所以对我来说ls -l /etc/cron.daily
有以下输出:
root@0989a35b8f94:/# ls -l /etc/cron.daily
total 24
-rwxr-xr-x 1 root root 1474 Sep 13 16:47 apt-compat
-rwxrwxr-x 1 root root 45 Nov 9 11:18 dobackup
-rwxr-xr-x 1 root root 1597 Feb 22 2017 dpkg
-rwxr-xr-x 1 root root 4125 Mar 2 2016 exim4-base
-rwxr-xr-x 1 root root 249 May 17 11:59 passwd
为了测试/分析这个,我使用了以下方法:
我查看了crontab文件cat /etc/crontab
,显示了每日cronjobs的以下行:
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
然后我将备份脚本隔离到专用文件夹中:
mkdir /etc/cron.test
mv /etc/cron.daily/dobackup /etc/cron.test
然后运行
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)
并在另一个终端上使用ps auxf
向我展示了现在正在运行的作业。您还可以在重命名为.sh
版本时验证它是否中断:
mv /etc/cron.test/dobackup /etc/cron.test/dobackup.sh
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)
然后立即存在,因此没有工作。
答案 3 :(得分:0)
在我的情况下,当我notifyDataSetChanged
一个文件时,它创建了一个辅助硬链接(可能是Windows的东西)。
我要做的是确保文件是在运行中的容器中创建的。
COPY
答案 4 :(得分:0)
最近已在debian https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=726661和Ubuntu Wily(15.10)中修复。
作为一种解决方法,您可以尝试注释模块pam_loginuid.so 在/etc/pam.d/cron中,然后重新启动cron(或docker容器)。