docker exec 在 cron 中不工作

docker exec is not working in 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 文件中也没有看到任何错误

1) 确保此任务在 root 用户的 crontab 中 - 可能是这种情况,但您没有明确编写它

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

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)。

如果您的 OS 是 redhat/centos/fedora,您应该尝试在频率和命令之间使用用户名 (root)。

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

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

也许您只是不想重新发明the wheel

以下是我要更改的一些内容——首先,捕获 STDERR 和 STDOUT 并删除 cron 中的 shell 规范——使用 #!在你的脚本中。

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

接下来,您正在以相反的顺序设置您的 PATH,并且您丢失了您的 shbang。我不知道为什么你将 SHELL 定义为 /bin/sh,而你是 运行 bash,而不是破折号。将您的脚本更改为此。

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

看看这是否会产生更好的结果。

你的 docker exec 命令说它需要 "pseudo terminal and runs in interactive mode" (-it flags) 而 cron 没有附加到任何 TTY。

尝试将您的 docker exec 命令更改为此,看看是否有效?

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

cron 调试

1。 /var/logsendmail

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

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

并在 /etc/aliases 查看 root 的邮件发送到哪里。

2。 crond 和 $PATH

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

为此,更简单的方法是在一切 运行 都很好的环境中打印您的默认路径:

echo $PATH

或从命令行修补您的脚本:

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

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

或者这个,将从您的脚本中删除所有其他 PATH=:

sed -e "s/PATH=[^ ]*\( \|$\)//;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-$$.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

不管怎样,我遇到了完全相同的问题。修复您的 PATH、更改权限并确保您是 运行 作为适当的 docker 用户都是好事,但这还不够。它会继续失败,因为您正在使用 "docker exec -it",它告诉 docker 使用交互式 shell。将其更改为 "docker exec -t" 即可正常工作。但是,任何地方都不会有日志输出告诉您这一点。享受吧!