根 crontab 未运行

由于某种原因,我的根crontab似乎没有运行。
每天午夜尝试重新启动设备。
应该是以下内容作为根用户:
crontab -e

然后添加:
0 0 * * * /sbin/shutdown -r now

当我使用一些接近当前时间的值进行测试时,没有任何反应。我安装了NTP并确保时区正确。我还指定使用24小时制时钟。例如,要测试此行(下午5:35),我尝试输入以下内容:
36 17 * * * /sbin/shutdown -r now

我已经用日期-R检查了时间。定时任务的运行时间来了又走,但系统没有重启。我在这里漏掉了什么?

只是为了确保一下,你在编辑完之后关闭了crontab,对吧?另外,你是如何以"root"身份运行的?sudo crontab -l | grep -v '#'的输出是什么? - terdon
为什么这被标记为 [tag:debian]?如果这是关于 Debian 而不是 Ubuntu,请在 [unix.se] 上提问。 - muru
1因为Debian是Ubuntu的核心,所以我相信。 - Atomiklan
3个回答

我有三个解决方案建议给您。

  1. 使用 crontab -e -u root 调用 crontab。

  2. 确保在 cronjob 文件末尾有一行空行,即每行以换行符结尾。

  3. 您可能需要将输出重定向到 devnull: shutdown -r now > /dev/null

以下是两个关于 cronjobs 的有用网页:

CRON Tester

CRON Generator

您还可以使用 webmin 来整洁地处理 cronjobs。

除此之外,您至少还有两种方法可以在午夜重启计算机。

一种是在登录时自动运行关机命令作为脚本,但将特定时间作为参数而不是 "now":

shutdown -r 00:00

然而,这将在每次登录时产生一个即将关闭的广播消息(这可能一点也不坏)。你也可以通过将脚本添加到init.d中,在启动时运行它,尽管仍会产生该消息。
另一种方法是使用at命令:
at 0am
输入命令shutdown -r now并用ctrl+d保存,或者为该命令创建一个脚本并执行以下操作:
at -f restart_script.sh 0am
希望这些对你有所帮助,以达到你想要的结果。

1解决方案是输出到/dev/null。我想知道为什么? - Atomiklan
1这是因为cron job有自己的环境,没有像你期望的那样的标准输入/输出系统,所以进程失败了,因为它试图将消息流式传输到一个缺失的输出管道中。与在终端上作为任何用户运行某个命令相比,cron job实际上是一件完全不同的事情。很高兴听到最终你解决了这个问题。 - Ahti Komu

系统的 Cron 作业列在 /etc/crontab 文件中。因此直接编辑此文件将帮助您以 root 用户身份运行重启命令。

因此,

$ sudo vi /etc/crontab

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
  23 20 *  *  *  root  shutdown  -r  now

确保在编辑crontab后检查Cron日志文件,它会告诉您cron是否成功安装。
我已经测试过了,对我有效。系统在晚上8:23重新启动。
祝好运!

36 17 * * * 等等..

36 17 不是在你的cron中指定正确时间的方式。

通过date命令检查系统是否使用美国时间或欧洲时间。

如果系统使用欧洲时间和24小时制,请使用17 36; 或者 如果系统使用美国时间和12小时制,请使用5 36。


不对!Cron不使用12小时制的时间格式,而且格式始终是mm hh DD MM WD。 - Ahti Komu
请下次阅读整篇帖子。 - Atomiklan