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/log
或 sendmail
由于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" 即可正常工作。但是,任何地方都不会有日志输出告诉您这一点。享受吧!
我有一个非常简单的命令,它可以作为命令或 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/log
或 sendmail
由于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" 即可正常工作。但是,任何地方都不会有日志输出告诉您这一点。享受吧!