Cron 作业未执行

1 server command-line cron minecraft

我正在做一个 cron 工作,每 5 分钟从我的 ram 中拯救我的 Minecraft 世界。我测试了脚本,它似乎工作正常。

这是脚本的样子:

#!/bin/sh


VOLATILE="/home/jonathan/Games/Minecraft/Server/world/"
PERMANENT="/home/jonathan/Games/Minecraft/Server/world_storage/"
rsync -r -t -v "$VOLATILE" "$PERMANENT"
Run Code Online (Sandbox Code Playgroud)

所以然后我去添加一个cron作业每5分钟运行一次脚本,它似乎没有运行它。

这是我使用的脚本:

*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

Izz*_*zzy 5

您没有指定如何添加您的 cronjob。这有很大的不同:如果您crontab -e在自己的帐户中使用过,脚本会与您的用户一起运行(因此 crontab 条目少了一个字段——运行它的用户,众所周知)。如果您只是将上面的代码片段复制到/etc/cron.d,它将失败,因为您没有指定用户(或者更确切地说,它没有找到名为“bash”的用户)。所以你应该采取以下步骤:

  1. 使用有关您如何添加 cron 作业的信息更新您的问题
  2. 检查系统日志(/var/log/syslog;它们可能指出可能的错误)
  3. 将一些调试输出添加到您的Backup.sh脚本中以查看它是否已启动

第三点可以通过多种方式实现:

  • >>/tmp/testlog.log在 crontab 条目的末尾添加 a (将输出重定向到您可以调查的文件;此外,a2>&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
Run Code Online (Sandbox Code Playgroud)

这会将所有输出重定向到系统中最大的存储空间,即“黑洞”:/dev/null吃掉所有东西(但从不返回任何东西)。以这种方式重定向 STDOUT 和 STDERR 会剥夺您的任何错误报告——因此您根本不知道它们发生了,更不用说细节了。为了测试,您应该&>/dev/null完全省略该部分。即使它有效,你也应该只抑制不必要的输出——否则你永远不知道什么时候出了问题。所以最好至少去掉 & 号,这样 Cron 就可以报告任何发生的错误。

此外:一旦输出被重定向(如您的情况为/dev/null),将另一个重定向附加到末尾将不会产生任何结果,因为一切都已经消失了。因此,我必须将上述建议从“添加 ... 到您的 crontab 条目的末尾”调整为“在您的 crontab 条目中替换它”;)