docker exec不在cron中工作

时间:2016-05-07 13:16:47

标签: bash meteor docker cron meteor-up

我有一个非常简单的命令,它可以单独作为命令或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文件中看不到任何错误

6 个答案:

答案 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)

cron debugging

1。 crondcron

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

对于某些邮件,请查看/etc/aliases$PATH,也许

并在$PATH查看root用户邮件的位置。

2。 crond和*/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

3。强制记录

在脚本顶部添加:

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

看看是否会产生更好的效果。