8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

docker exec 在 cron 中不起作用

Wernfried Domscheit 1月前

92 0

我有一个非常简单的命令,它可以作为命令或 bash 脚本独立运行,但当我将它放在 crontab40 05 * * * bash /root/scripts/direct.sh >> /root/cron.log 中时却不行

我有一个非常简单的命令,它可以作为命令或 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、本帖标题:docker exec 在 cron 中不起作用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Wernfried Domscheit在本站《bash》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 不起作用并不是一个非常有用的错误描述。请检查您的系统日志,并将任何错误消息和/或 /root/cron.log 的内容添加到您的问题中。

  • 你能解释一下哪个文件包含哪些代码吗?我真的不明白哪个先出现,甚至不知道它写在哪里……顺便说一句,尝试将输出写入用户文件(而不是 root/cron.log),我曾经成功过一次

  • 如果您足够关心并愿意发布赏金,那么您当然也应该足够关心将 stderr 重定向到文件并将这些日志包含在您的问题中。

  • 您的 docker exec 命令表明它需要“伪终端并以交互模式运行”( -it 标志 ),而 cron 不附加到任何 TTY。

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

    docker exec mongodb mongodump -d meteor -o /dump/
    
  • 对于使用 docker-compose 的用户,您需要添加 -T 标志,其记录为:\'禁用伪 tty 分配。默认情况下,docker-compose exec 会分配一个 TTY。\'

  • 不管怎么说,我也遇到过同样的问题。修复 PATH、更改权限以及确保您以适当的 docker 用户身份运行都是不错的选择,但这还不够。它将继续失败,因为您使用的是 \'docker exec -it\',它告诉 docker 使用交互式 shell。将其更改为 \'docker exec -t\',它将正常工作。但是,不会有任何日志输出告诉您这一点。尽情享受吧!

  • 将 docker exec -it 更改为 docker exec -t 对我有用!

  • cron调试

    1. /var/log sendmail

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

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

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

    2. crond 和 $PATH

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

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

    echo $PATH
    

    或者从命令行修补你的脚本:

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

    这将 $PATH 在脚本的第 2 行添加当前初始化程序。

    或者这样,将从你的脚本中删除所有其他内容 PATH=

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

  • 谢谢您的回复,但是您的两个建议似乎都没有起到作用,而且我在日志文件中也没有看到任何内容。

  • 之前 touch /tmp/cronok 添加其他命令 docker exec

    不要忘记 crontab 末尾需要一个换行符。使用 crontab -e 来编辑它。

    重新启动 cron 服务并检查日志( grep -i cron /var/log/syslog )。

    在频率和命令之间 root 使用用户名 (

    使用命令检查您的邮件 mail

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

    也许你只是不想重新发明 轮子 .

  • 以下是我想改变的几件事 - 首先,捕获 STDERR 和 STDOUT,并删除 cron 中的 shell 规范 - 在脚本中使用 #! 代替。

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

    接下来,您以相反的顺序设置 PATH,并且缺少 shbang。我不知道为什么在运行 bash 时将 SHELL 定义为 /bin/sh,而不是 dash。将您的脚本更改为此。

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

    看看是否能产生更好的结果。

返回
作者最近主题: