docker exec在cron中不起作用

我有一个非常简单的命令,它可以独立的作为一个命令或者bash脚本运行,但是当我把它放在crontab中的时候不行

40 05 * * * bash /root/scripts/direct.sh >> /root/cron.log 

有以下线路

 PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root/ # Mongo Backup docker exec -it mongodb mongodump -d meteor -o /dump/ 

我试图改变脚本的URL到/usr/bin/scirpts/没有运气

我甚至试图直接在cron中运行脚本

 26 08 * * * docker exec -it mongodb mongodump -d meteor -o /dump/ >> /root/cron.log 

没有运气,任何帮助表示赞赏。

编辑

我在/root/cron.log文件中也看不到任何错误

你的docker exec命令表示它需要“伪terminal并以交互模式运行”( -it标志 ),而cron不附加到任何TTY。

尝试改变你的docker执行命令,看看是否有用?

 docker exec mongodb mongodump -d meteor -o /dump/ 

1)确保这个任务在root用户的crontab中 – 可能是这种情况,但是你没有明确写出它

2) cron可能无法findbash 。 我会删除它,并使其可执行后直接调用脚本:

 chmod 755 /root/scripts/direct.sh 

然后设置你的crontab条目为40 05 * * * /root/scripts/direct.sh 2>&1 >> /root/cron.log

如果它仍然不能正常工作,那么你应该在/root/cron.log有一些有用的输出

你确定你的脚本正在运行? 在touch /tmp/cronok docker exec调用之前添加其他命令,如touch /tmp/cronok

不要忘记,crontab最后需要一个换行符。 使用crontab -e编辑它。

重新启动cron服务并检查日志( grep -i cron /var/log/syslog )。

如果你的操作系统是redhat / centos / fedora,你应该用频率和命令之间的用户名( root )来尝试。

mail命令检查你的mail

检查crontab权限。 chmod 644 /etc/crontab

也许你只是不想重新发明轮子 。

crondebugging

1. /var/logsendmail

由于crond是一个守护进程,没有失败的能力,执行比logging更重要。 那么默认情况下,如果出现问题, cron会发送一个邮件给$USER@localhost报告脚本输出和错误。

看看/var/mail/var/spool/mail的一些邮件,也许

并在/etc/aliases中查看根目录的邮件是否是sents。

2. crond和$PATH

当你通过cron运行一个命令时,请注意$PATH用户的默认path,不是 root默认path (即没有*/sbin和其他保留的超级用户工具path)。

为此,最简单的方法是在一切正常运行的环境中打印默认path:

 echo $PATH 

或从命令行修补脚本:

 sed -e "2aPATH='$PATH'" -i /root/scripts/direct.sh 

这将在脚本中的第2行添加当前的$PATH初始值设定项。

或者这个,从你的脚本中将所有其他的PATH=

 sed -e "s/PATH=[^ ]*\( \|$\)/\1/;2aPATH='$PATH'" -i /root/scripts/direct.sh 

3.强制logging

在脚本顶部添加:

 exec 1>/tmp/cronlog-$$.log exec 2>/tmp/cronlog-$$.err 

尝试这个:

 sed -e '1a\\nexec 1>/tmp/cronlog-$$.log\nexec 2>/tmp/cronlog-$$.err' -i ~/scripts/direct.sh 

最终脚本可能如下所示:

 #!/bin/bash # uncomment two following lines to force log to /tmp # exec 1>/tmp/cronlog-$$.log # exec 2>/tmp/cronlog-$$.err PATH='....' # copied from terminal console! docker exec -it mongodb mongodump -d meteor -o /dump/ 

可执行标志

如果你运行你的脚本

 40 05 * * * bash /root/scripts/direct.sh 

没有可执行标志是必需的,但你必须添加它们:

 chmod +x ~/scripts/direct.sh 

如果你想运行:

 40 05 * * * /root/scripts/direct.sh 

这里有几件事我会改变 – 首先,捕捉STDERR和STDOUT,并删除cron中的shell规范 – 使用#! 在你的脚本中。

40 05 * * * /root/scripts/direct.sh &>> /root/cron.log

接下来,你正在按照相反的顺序设置你的PATH,并且你错过了你的shbang。 我不知道为什么当你运行bash而不是短划线时,将SHELL定义为/ bin / sh。 改变你的脚本。

 #!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # Mongo Backup docker exec -it mongodb mongodump -d meteor -o /dump/ 

看看是否能产生更好的工作。

为什么它值得我有这个完全相同的问题。 修复PATH,更改权限,并确保您作为合适的docker用户运行都是好东西,但这还不够。 它将继续失败,因为您正在使用“docker exec -it”,它会告诉docker使用交互式shell。 将其更改为“docker exec -t”,它会正常工作。 然而,不会有任何logging输出告诉你这个。 请享用!