在Centos Docker容器中,crontab无法工作

3

我正在尝试通过Crontab在Centos Docker容器中运行一些Python脚本,但是我尝试的所有方法都没有成功。

首先,我安装了cron:

yum install vixie-cron

然后我把它作为一个服务运行:

/etc/init.d/crond start

我也运行了/sbin/service crond start,因为一些相关问题的答案建议这样做。

ps aux | grep cron显示:

root     16917  0.0  0.0  23288  1252 ?        Ss   18:53   0:00 crond                                                                                
root     16929  0.0  0.0   9720   836 pts/0    S+   18:55   0:00 grep cron 

crontab -l 的输出如下:

0 17 1 * * /root/proj/env/bin/python /root/proj/files/frontend/file1.py > /var/log/cron.log                                                      

0 9 4 * * /root/proj/env/bin/python /root/proj/files/frontend/file2.py > /var/log/cron.log                                                      

0 17 15 * * /root/proj/env/bin/python /root/proj/files/frontend/file3.py > /var/log/cron.log                                                     

0 9 18 * * /root/proj/env/bin/python /root/proj/files/frontend/file4.py > /var/log/cron.log                                                     

0 14 * * * /root/proj/env/bin/python /root/proj/files/frontend/file5.py > /var/log/cron.log                                               

0 8 * * * /root/proj/env/bin/python /root/proj/files/frontend/file6.py > /var/log/cron.log                                                  

* * * * * echo 'Check!!' > /var/log/cron.log 

所有的Python脚本和cron.log文件都有权限777

crontab中的最后一个条目只是为了检查是否有任何内容被写入日志文件...但是没有任何内容被写入...

有什么解决方法吗?

附注:我查看了大量相关的问答,但没有一个能帮助到我。

一些答案建议写入/etc/crontab...所以我甚至在那里添加了条目:* * * * * root echo 'Blah' > var/log/cron.log,但没有效果 :(


你每行代码后面都有这么多空格,这正常吗?另外,你在使用哪个用户来运行这些定时任务?如果输入 service crond status 命令,会得到什么结果? - fedorqui
@fedorqui:我以root身份运行它们,因为据我所知,crontab用户是执行命令crontab -e的用户...service crond status显示crond(pid 16917)正在运行... - ofey
给它一分钟:) 这很奇怪。 顺便问一下,你清理了crontab中的尾随空格吗? - fedorqui
似乎是复制粘贴问题,在vim中没有这些尾随空格...仍然没有在/tmp/test.log中找到任何条目。 - ofey
是的,这是换行符,这意味着文件没问题。 - fedorqui
显示剩余4条评论
2个回答

8
在经过一天的不太理想的谷歌搜索和尝试后,解决这个难题的方法是在文件/etc/pam.d/crond注释掉以下行(然后运行service crond restart):
session required pam_loginuid.so

这是由于一些Docker-Centos安全问题造成的。我不清楚为什么会这样,具体情况请参考此链接
另外,解决这个问题让我意识到了一些需要注意的问题,这些可能会有用:
  • 检查是否已将crond作为服务运行(如果没有,请使用/etc/init.d/crond start

  • 你的crontab中每行后面应该跟着一个换行符

  • 你的脚本和日志文件应该具有适当的写/执行权限

  • crontab文件中不应该有奇怪的Windows环境字符(如^M)

  • 在某些罕见情况下,crond的时区可能与你的系统不同

  • 还要检查/etc/cron.allow和/etc/cron.deny文件以验证谁可以添加/编辑cron作业

祝陌生人有更富有成效的一天。

0

我建议在主机下运行 cron 并在容器内部运行命令。

例如:

0 17 1 * * /usr/bin/docker exec container_name /root/proj/env/bin/python /root/proj/files/frontend/file1.py > /var/log/cron.log                                                      

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接