这是我的计划:
crontab -l
30 2 * * * /usr/sbin/stime&
32 2 * * * /usr/sbin/rtc -s
30 2 2 * * /usr/sbin/rtc -c
00 5 * * * /path/to/script/backup.sh >/dev/null 2>&1
这是我的脚本:
备份文件
#!/bin/sh
rsync -e"ssh -i /path.to/id_rsa" -aP MyUsername@HostIP:/path/to/host/backup/ /path/to/local/backup --exclude '*.sql'
如果我跑备份文件从命令行执行。Cron 不会运行它。
我认为这可能是一个权利问题,所以我修改了 crontab 中的命令,如下所示:
00 5 * * * su - root -c /path/to/script/backup.sh >/dev/null 2>&1
crontab 仍未执行。时间和日期正确。有什么想法吗?
答案1
不要丢弃可能有用的信息
每当一个 cron 作业神秘失败时,我的第一个动作通常是将 STDOUT 和 STDERR 重定向到 /tmp 中的文件中,以便我可以看到任何错误消息和其他可能有用的输出。
因此 cron 条目将是
00 5 * * * /path/to/script/backup.sh >/tmp/backup.out 2>&1
使脚本自文档化
我通常还通过向脚本添加诊断输出来确保其中写入了一些有用的内容:
#!/bin/sh
echo "Backup starting..."
date
rsync -e"ssh -i /path.to/id_rsa" \
-aP MyUsername@HostIP:/path/to/host/backup/ \
/path/to/local/backup \
--exclude '*.sql'
echo "Backup ended"
检查手册页
rsync 的手册页显示
-q, --quiet
This option decreases the amount of information you are given during the
transfer, notably suppressing information messages from the remote server.
This option is useful when invoking rsync from cron.
因此,当 rsync 输出被定向到 /dev/null 时,rsync 可能会注意到 STDOUT 未连接到终端或常规文件并以错误情况终止。
您可以通过将 cron 命令更改为来验证这一点
00 5 * * * /path/to/script/backup.sh >/dev/null 2>/tmp/backup.err
然后查看内容/tmp/backup.err
然而,添加该-q
选项将是一个合适的解决方案。
批处理 shell 不同于交互式 shell
一般来说,从 cron 运行时与交互运行存在一些主要区别
- 您不能依赖所设置的环境变量(主要问题)
- 该进程没有附加 TTY(某些程序依赖于此)
- ETC
因此,当事情没有按预期进行时,您应该重新考虑所有这些因素可能会如何影响您正在做的事情。
答案2
cron 程序(Red Hat)无法正常工作的一个非常棘手的原因是当您使用:crontab -e
编辑 cron 文件,
您必须退出,而不仅仅是保存。
因此 :w 然后留在文件中不会实例化更改。您必须使用 :wq ( VIM 命令)