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