![Cron 作业未执行](https://linux22.com/image/821229/Cron%20%E4%BD%9C%E4%B8%9A%E6%9C%AA%E6%89%A7%E8%A1%8C.png)
我正在制作一个 cron 任务,每 5 分钟从内存中保存一次我的 Minecraft 世界。我测试了脚本,它似乎有效。
脚本如下:
#!/bin/sh
VOLATILE="/home/jonathan/Games/Minecraft/Server/world/"
PERMANENT="/home/jonathan/Games/Minecraft/Server/world_storage/"
rsync -r -t -v "$VOLATILE" "$PERMANENT"
因此我添加了一个 cron 作业来每 5 分钟运行一次脚本,但它似乎并没有运行。
这是我使用的脚本:
*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh
有人能帮帮我吗?
答案1
您没有指定如何添加 cronjob。这会产生很大的不同:如果您crontab -e
在自己的帐户中使用,脚本将以您的用户身份运行(因此 crontab 条目少了一个字段——运行它的用户,这是众所周知的)。如果您只是将上面的代码片段复制到/etc/cron.d
,它会失败,因为您没有指定用户(或者说找不到名为“bash”的用户)。因此,您应该采取以下步骤:
- 使用有关如何添加 cron 作业的信息来更新您的问题
- 检查系统日志(
/var/log/syslog
;它们可能指向可能的错误) - 在脚本中添加一些调试输出
Backup.sh
以查看它是否已启动
第三点可以通过多种方式实现:
>>/tmp/testlog.log
在 crontab 条目末尾添加一个(将输出重定向到您可以调查的文件;此外,2>&1
还会包括来自错误控制台的输出)- 在脚本中添加几行,例如
echo "Backup.sh started">/tmp/testlog.log
此外:由于您打算使用 运行脚本bash
,因此您不应告诉它使用/bin/sh
(这会使它dash
在默认的 Ubuntu 安装上使用),而是/bin/bash
。然后使其可执行,您甚至可以从 crontab 条目中省略“bash”。
更新:
根据您对我的回答的评论,您曾经crontab -e
创建过该作业,并且根据您的系统日志,该作业已执行,但定义却是
*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh &>/dev/null
这会将所有输出重定向到系统中最大的存储,即“黑洞”:/dev/null
吞噬一切(但从不返回任何内容)。以这种方式重定向 STDOUT 和 STDERR 会剥夺您的任何错误报告——因此您根本不知道它们发生了,更不用说详细信息了。为了进行测试,您应该&>/dev/null
完全省略该部分。即使它有效,您也应该只抑制不必要的输出——否则您永远不知道什么时候出错。所以最好至少省略 & 符号,这样 Cron 就可以报告任何发生的错误。
此外:一旦输出被重定向(如您的情况/dev/null
),在末尾附加另一个重定向将不会产生任何结果,因为所有内容都已消失。因此,我必须调整上述建议,从“将 ... 添加到 crontab 条目末尾”改为“在 crontab 条目中替换它” ;)