Cron 作业未执行

Cron 作业未执行

我正在制作一个 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”的用户)。因此,您应该采取以下步骤:

  1. 使用有关如何添加 cron 作业的信息来更新您的问题
  2. 检查系统日志(/var/log/syslog;它们可能指向可能的错误)
  3. 在脚本中添加一些调试输出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 条目中替换它” ;)

相关内容