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命令说它需要"伪终端并以交互模式运行"(-it标志),而cron不附加到任何TTY。

试着把docker-exec命令改成这个,看看是否有效?

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

值得一提的是,我也遇到了同样的问题。修复您的PATH、更改权限以及确保您以适当的docker用户身份运行都是好事,但这还不够。它将继续失败,因为您正在使用"docker exec-It",它告诉docker使用交互式shell。把它改成"docker exec-t",它就会正常工作。但是,任何地方都不会有日志输出告诉您这一点。享受

cron调试

1./var/logsendmail

由于crond作为守护进程工作,没有失败的能力,所以执行比日志记录更重要。默认情况下,如果出现问题,cron将向$USER@localhost发送一封邮件,报告脚本输出和错误。

查看一些邮件的/var/mail/var/spool/mail,可能是

并且在CCD_ 11处查看根的邮件被发送到哪里。

2.crond和$PATH

当您通过cron运行命令时,请注意$PATH用户的默认路径,而不是根默认路径(即没有*/sbin和其他到超级用户工具的保留路径)。

为此,更简单的方法是在一切正常的环境中打印默认路径:

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.强制记录

在脚本顶部添加:

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

试试这个:

sed -e '1a\nexec 1>/tmp/cronlog-$$.lognexec 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

1)确保此任务在用户的crontab中-可能是这样,但您没有明确地编写

2) cron可能无法找到CCD_。我会删除它,并在使其可执行后直接调用您的脚本:

chmod 755 /root/scripts/direct.sh

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

如果它仍然不起作用,那么您应该在/root/cron.log 中有一些有用的输出

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

不要忘记crontab在末尾需要一个换行符。使用crontab -e进行编辑。

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

如果你的操作系统是redhat/centros/fedeora,你应该在频率和命令之间使用用户名(root)。

使用mail命令检查您的邮件。

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

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

以下是我要更改的几件事——首先,捕获STDERR和STDOUT,并删除cron中的shell规范——使用#!而是在脚本中。

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

接下来,您将以相反的顺序设置您的PATH,您将错过您的shbang。我不知道为什么在运行bash时将SHELL定义为/bin/sh,而不是dash。将脚本更改为此。

#!/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/

看看这是否会带来更好的工作效果。

最新更新