cron作业未在ubuntu上的docker容器内运行
我有一个简单的Dockerfile,如下所示cron作业未在ubuntu上的docker容器内运行,ubuntu,cron,docker,Ubuntu,Cron,Docker,我有一个简单的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" >>
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
当我在本地的OSX机器上运行这个程序时(docker机器正在运行),它工作得很好(“Hello world”每分钟都打印到日志文件中)。但是,当我尝试在Ubuntu机器上运行它时,cron作业不会运行(空日志文件)
下面是我用来运行容器的命令
docker build -t crontest .
docker run --name cron crontest
我不知道为什么会这样。我想知道我的Ubuntu盒子是否有问题(时间设置错误?)。我试图重新启动那台机器,但没有效果。我目前确实有其他docker容器在Ubuntu box上运行,而且运行良好
任何关于如何调试/修复此问题的建议都将不胜感激
编辑:
进入容器(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
使用
apt get Install rsyslog
在容器内安装rsyslog,并在使用cron-L15(最大日志记录)启动cron之前,使用命令rsyslogd
启动它。然后观察容器中的文件/var/log/syslog
,查看cron守护进程自己的日志输出。它将告诉您在解析crontab时是否有问题,在您的情况下,如果它已注册并正在尝试运行您的作业,它将每分钟记录一个条目,类似于下面的内容
CRON[16]:(root)CMD(echo“Hello world”>>/var/log/CRON.log 2>&1)
我也有类似的问题,特别是Ubuntu 14.04。为了调试,我尝试在前台运行cron,发现它在尝试运行计划的作业时发出系统错误
消息
显然,这是--net=host
参数(ref:)的一个已知问题。我试着按照建议传递--pid=host
,然后cron作业开始正常运行。我有一个名为backup.sh
的备份脚本,我将它复制到/etc/cron.daily
。
脚本调用不正确
为了实现这一目标,我不得不将其重命名为只备份而不备份.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
,其中显示了日常crontab作业的以下行:
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)
然后它立即存在,因此没有作业运行。在我的例子中,当我复制文件时,它创建了一个辅助硬链接(可能是Windows的东西)
我要做的是确保文件是在运行的容器中创建的
FROM mysql:5.7
RUN apt-get update && apt-get install -y anacron
COPY crontab /tmp/crontab
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
CMD (cat /tmp/crontab > /etc/cron.d/hello-cron ) && cron && tail -f /var/log/cron.log
它最近在debian和UbuntuWily(15.10)中得到了修复
作为一种解决方法,您可以尝试对模块pam_loginuid.so进行注释
在/etc/pam.d/cron内重新启动cron(或docker容器)
我投票决定以离题的方式结束这个问题,因为它属于AskUbuntu。@TinyGiant我能理解你的来历,但我认为这仍然是一个有效的问题,因为它也涉及docker。@TriNguyen你有想过这个问题吗?我有完全相同的问题,并希望避免冗长的日志调查,如果你找到一个解决方案@DaveNovelli不,我还没有弄明白这一点,不幸的是:(我仔细查看了日志后,它开始工作。我必须解决两件事:1)我使用windows,我的crontab文件的换行符是CRLF而不是LF。错误消息中的附加“^M”提示了我。2) 在我修复了这个问题之后,我出现了一个新的错误,表明命令错误。我意识到,因为我使用的是用户crontab文件,所以在命令开头不需要“root”。在那之后,它就像一个符咒。非常感谢@Dzamo提供的rsyslog提示!我在docker容器下也有同样的问题。您的解决方案对我有效,但我必须在/var/log(touch/var/log/syslog)下创建syslog文件,并将其所有者更改为syslog:adm(chown syslog:adm/var/log/syslog)。通过cron与syslog对话,我发现了这个:/usr/sbin/cron[2990]:(root)不安全模式(预期为模式0600)(crontab/root)。所以我必须设置正确的权限模式0600(chmod0600/var/spool/cron/crontab/root)。在那之后,一切正常。我在Docker容器中也遇到了这个问题。安装rsyslog
,启动它并运行cron-L15
神奇地运行了我的作业(我甚至没有检查日志)。所以我的cron作业命令没有错误。