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/log
或sendmail
由于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输出告诉你这个。 请享用!