我有一个非常简单的命令,它可以单独作为命令或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/
我尝试将脚本的网址更改为/usr/bin/scirpts/
没有运气
我甚至试图直接在cron中运行脚本
26 08 * * * docker exec -it mongodb mongodump -d meteor -o /dump/ >> /root/cron.log
没有运气,任何帮助表示赞赏。
修改
我在/root/cron.log
文件中看不到任何错误
答案 0 :(得分:68)
你的docker exec
命令说它需要"伪终端并以交互模式运行" (-it flags)而cron没有附加到任何TTY。
尝试将docker exec命令更改为此命令,看看是否有效?
docker exec mongodb mongodump -d meteor -o /dump/
答案 1 :(得分:7)
为什么它值得我有这个完全相同的问题。修复你的PATH,更改权限,并确保你作为适当的docker用户运行都是好事,但这还不够。它会继续失败,因为你正在使用" docker exec -it&#34 ;,它告诉docker使用交互式shell。将其更改为" docker exec -t"它会正常工作。但是,在任何地方都没有记录输出。享受!
答案 2 :(得分:4)
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
答案 3 :(得分:2)
crond
或cron
由于$USER@localhost
作为守护进程工作,没有失败的能力,执行比记录更重要。然后默认情况下,如果出现问题,/var/mail
会向/var/spool/mail
报告脚本输出和错误发送邮件。
对于某些邮件,请查看/etc/aliases
或$PATH
,也许
并在$PATH
查看root用户邮件的位置。
*/sbin
当您通过cron运行命令时,请注意echo $PATH
用户的默认路径和不 root默认路径(即没有sed -e "2aPATH='$PATH'" -i /root/scripts/direct.sh
和超级用户工具的其他保留路径。)
为此,更简单的方法是在一切运行良好的环境中打印默认路径:
$PATH
或从命令行修补脚本:
PATH=
这将在脚本的第2行添加当前的sed -e "s/PATH=[^ ]*\( \|$\)/\1/;2aPATH='$PATH'" -i /root/scripts/direct.sh
初始化程序。
或者,这将从您的脚本中删除所有其他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
不需要可执行标志,但您必须添加它们:
growth_t <- function(n0, r, K, b, T) {
n <- n0
for (t in 1:T) {
n <- n + r - exp(n) / K - b - rnorm(1, 0, 0.1)
}
n
}
如果你想跑:
data <- expand.grid(
b = seq(0.01, 0.5, length.out = 5),
K = exp(seq(0.1, 5, length.out = 5)),
r = seq(0.5, 3.5, length.out = 5),
rep = 1:20
)
答案 4 :(得分:1)
您确定自己的脚本正在运行吗?在touch /tmp/cronok
来电之前添加其他命令,例如docker exec
。
不要忘记crontab最后需要换行符。使用crontab -e
进行编辑。
重新启动cron服务并检查日志(grep -i cron /var/log/syslog
)。
如果你的操作系统是redhat / centos / fedora,你应该尝试使用频率和命令之间的用户名(root
)。
使用mail
命令检查邮件。
检查crontab权限。 chmod 644 /etc/crontab
。
也许你不想重新发明the wheel。
答案 5 :(得分:1)
这里有一些我要改变的事情 - 首先,捕获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/
看看是否会产生更好的效果。