crontab 的 @reboot 只对 root 有效?

Wit*_*eld 76 cron reboot

man 5 crontab 关于如何使用 crontab 在启动时运行脚本非常清楚:

   These special time specification "nicknames" are supported, which replace the 5 initial time and date
   fields, and are prefixed by the `@` character:
   @reboot    :    Run once after reboot.
Run Code Online (Sandbox Code Playgroud)

所以我很高兴地在我的 crontab 中添加了一行(在我的用户帐户下,而不是 root 下):

@reboot     /home/me/myscript.sh
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,myscript.sh 不会在机器重新启动时运行。(如果我从命令行调用它,它运行良好,所以这不是权限问题)

我错过了什么?


更新以回答@Anthon 的问题:

  1. Oracle-linux 版本:5.8(uname:2.6.32-300.39.2.el5uek #1 SMP)
  2. Cron 版本:vixie-cron-4.1-81.el5.x86_64
  3. 是的,/home 挂载分区。看起来这就是问题所在。我该如何解决这个问题?
  4. 目前,myscript.sh仅将文本消息回显到/home/me.

slm*_*slm 56

这可能是一个令人困惑的话题,因为 cron 有不同的实现。还有一些错误会破坏此功能,并且还有一些用例根本无法工作,特别是如果您执行关机/启动与重新启动。

错误

数据点 #1

此处介绍了 Debian 中的一个此类错误,标题为:cron: @reboot jobs are not run。这似乎也进入了 Ubuntu,我无法直接确认。

数据点 #2

Ubuntu 中的错误的证据似乎在此 SO Q&A 中得到确认:@reboot cronjob not execution

摘抄

评论 #1: .... 3) 你的 crond 版本可能不支持 @reboot 你在使用 vix 的 crond 吗?... 显示 crontab -l -u user 的结果

评论 #2: ... 将其设置为 init 脚本而不是依赖特定版本的 cron 的 @reboot 可能是个好主意。

评论 #3: ... @MarkRoberts 删除了重启并将 1 * * * * 修改为 */1 * * * * ,问题解决了!我应该将代表 pts 发送到哪里?谢谢!

该问答中接受的答案也有以下评论:

在我看来 Lubuntu 不支持 @Reboot Cron 语法。

补充证据

数据点 #3

作为额外的证据,有一个线程表明有人正在尝试同样的事情并且因为它不起作用而感到沮丧。它的标题是:线程:Cron - @reboot 作业不起作用

摘抄

回复:Cron - @reboot 作业不起作用

Quote 最初由ceallred 发表 View Post 这让我很伤心... 尝试了包装脚本。手动运行会生成日志文件...重新启动,作业不会运行或创建日志文件。

Syslog 显示 CRON 运行了作业......但同样,没有输出并且进程没有运行。7 月 15 日 20:07:45 RavenWing cron[1026]:(CRON)信息(运行 @reboot 作业)7 月 15 日 20:07:45 RavenWing CRON[1053]:(ceallred)CMD(/home/ceallred/Scripts/run_spiderak. sh > /home/ceallred/Scripts/SpiderOak.log 2>&1 &)

似乎 cron 不喜欢 @reboot 命令......还有其他想法吗?

好的...部分解决。我会将这个标记为已解决,并针对新问题开始一个新线程.....

我认为答案是当 CRON 尝试运行脚本(存储在 /home/username/scripts 中)时,我的加密主目录没有挂载。移动到 /usr/scripts 并且作业按预期运行。

所以现在它似乎是一个spideroak问题。进程开始了,但是当启动进程完成时,它就消失了。我猜是出于某种原因崩溃了……要问这个的新线程。

感谢所有的帮助!

一旦上述用户解决了他的问题,他就能够解决@reboot用户的 crontab 条目。

我不完全确定 Ubuntu 上使用的是哪个版本的 cron,但这似乎表明用户也可以使用@reboot,或者该错误在后续版本的 cron 中已修复。

数据点 #4

我在 CentOS 6 上测试了以下内容并且它有效。

例子

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

然后我重新启动了系统。

$ sudo reboot
Run Code Online (Sandbox Code Playgroud)

重启后。

$ cat reboot.txt 
hi
Run Code Online (Sandbox Code Playgroud)

带走

  1. 系统和用户 crontab 条目似乎都支持此功能。
  2. 您必须确保它在您的特定发行版和/或 cron 包版本中受支持/工作。

有关实际机制如何工作的更多信息,@reboot我确实遇到了这篇讨论内脏的博客文章。它的标题是:@reboot - 解释简单的 cron 魔法

调试crond

您可以crond通过在基于 RHEL/CentOS/Fedora 的发行版上的此配置文件中添加以下内容来提高详细程度。

$ more crond 
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-L 2"
Run Code Online (Sandbox Code Playgroud)

有效级别为 0、1 或 2。要将此文件恢复为其默认日志记录级别,只需"-L 2"在完成调试情况后删除。

  • 您可能想指出,通过添加延迟可以轻松解决 Ubuntu 中的错误:`@reboot sleep 60; <您的命令>`。引用该线程,“我的猜测是 cron 的 @reboot 指令在启动过程中运行得太早” (4认同)

小智 21

我发现在我的 Ubuntu 机器上,我无法访问 dns 服务,但在 @reboot 时。这阻止了我安装远程卷。这个陈词滥调但简单的解决方案有效:

@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log

(在 root cron 中;最后部分仅用于调试)