crontab的@reboot仅适用于root用户吗?


64

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.

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

@reboot     /home/me/myscript.sh

但是由于某种原因,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

2
您的用户crontab不支持@reboot选项,一旦开始四处浏览,就会有一些crontab布局。
X田

@XTian谢谢。建议以root以外的用户身份在重新启动时运行脚本的建议方式是什么?
2014年

2
您所缺少的还不清楚,但是我们所缺少的是细节。您正在运行什么版本的oracle-linux?您拥有哪个版本的cron?是/home挂载的分区吗?您的内容是/home/me/myscript.sh什么?
Anthon 2014年

1
如果您使用的是Oracle的Lin。版本 5有关于vixie-cron +问题的变更日志@rebootoss.oracle.com/pipermail/el-errata/2012-March/002655.html
slm

1
@Daniel- myscript.sh可执行吗?chmod +x myscript.sh
slm

Answers:


47

这可能是一个令人困惑的话题,因为cron的实现方式不同。另外,还有一些错误破坏了此功能,并且在某些用例中,它根本无法正常工作,特别是在您执行关机/引导还是重新引导时。

虫子

数据点#1

Debian中有一个这样的bug,标题为:cron:@reboot作业未运行。这似乎也使其进入了Ubuntu,我无法直接确认。

数据点#2

在标题为@reboot cronjob not execute的 SO Q&A中,似乎可以确认Ubuntu中的bug的证据。

摘抄

注释#1:...。3)您的crond版本可能不支持@reboot,您使用的是vix的crond吗?...显示crontab -l -u用户的结果

评论#2:...最好将其设置为初始化脚本,而不是依赖cron的特定版本@reboot。

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

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

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

补充证据

数据点#3

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

摘抄

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

引用最初由ceallred发表查看此内容使我丧命...尝试了包装脚本。手动运行会生成日志文件...正在重新启动,作业无法运行或创建日志文件。

Syslog显示CRON运行了任务...但是,再次没有输出,该进程未运行。7月15日20:07:45 RavenWing cron [1026]:(CRON)信息(正在运行@reboot作业)7月15日20:07:45 RavenWing CRON [1053]:(已锁定)CMD(/ home / ceallred / Scripts / run_spideroak。 sh> /home/ceallred/Scripts/SpiderOak.log 2>&1&)

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

好吧...部分解决了。我将其标记为已解决,并以新问题开始一个新线程.....

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

因此,现在看来这是一个难题。进程开始了,但是到启动过程结束时,它已经消失了。由于某种原因,我猜测是崩溃。...有关此问题的新话题。

感谢您的所有帮助!

一旦上述用户发现了他的问题,他就可以解决@reboot用户的crontab条目。

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

数据点#4

我在CentOS 6上进行了以下测试,并且可以正常工作。

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1

然后,我重新启动了系统。

$ sudo reboot

重新启动后。

$ cat reboot.txt 
hi

外卖

  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"

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


有一个评论,昨天看了你的答案,并决定一个良好的睡眠后回答自己。设置一个虚拟机,重试@reboot,想发布我的答案,然后才看到您对您的答案“改写了” :-(
Anthon 2014年

@Anthon-抱歉,昨天我迅速回答了这个问题,然后继续进行研究,发现非常矛盾的细节。当我发现有关Debian和Ubuntu SO的bug时,我意识到了其中的一些问题。我看到它可以在CentOS上运行,并且把它们组合在一起@reboot在某些方面是可行的,而在其他方面显然是越野车/破碎的。因此造成混乱。
slm

除了OP几乎不提供任何细节外,您还可以轻松地在脚本中使用尚无法使用的某些东西(在启动时),这会使其失败或驻留在尚未安装的光盘上。OP也评论了我的回答,也得到了第三方的确认。这是黑天鹅的问题...
Anthon

@Anthon-是的,我的数据点之一就是那个。@reboot一旦您意识到它试图访问一个加密的驱动器(到目前为止尚未安装),就可以正常工作。
slm

3
您可能要指出,通过添加以下延迟可以轻松解决Ubuntu中的错误:@reboot sleep 60; <your command>。引用线程的话,“我的猜测是cron的@reboot指令在引导过程中运行得太早了”
pzkpfw 2015年

12

我发现在我的Ubuntu计算机上,我无法在@reboot时访问dns服务。这使我无法安装远程卷。这个老套但简单的解决方案有效:

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

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


这是唯一可在非root用户的ubuntu 16.04上实际使用的功能!
AleksandarPavić17年

不适用于Debian 8 jessie(gnome 3)。:(
Tadej

在处理将VMWare共享文件夹安装到单独位置时,这对我有用。
jgshawkey

3

我也有mac osx,并且我的脚本未运行时也遇到了同样的问题。但是当我修复脚本喜欢

@reboot   cd /home/me/  && sh myscript.sh

对我来说很好。确保通过运行以下命令使您的外壳文件可执行

chmod +x myscript.sh

2

我不知道您是否已经解决了这个问题,或者上述任何一个是否是您需要的解决方案,但是另一种可能性是:

如果您的/ home目录已加密,则在您登录之前它可能不可用,即,在重新启动时不可用。

在这种情况下,您可以将脚本移动到/ srv或/ opt或/ usr / local / bin /等其他位置。


1

重新安装Ubuntu Gnome 13.10(在我的情况下为默认用户:avanderneut)。

avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h  dom mon dow   command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ sudo reboot
[sudo] password for avanderneut: 

并查看重新启动后文件/var/tmp/xxx是否存在,尽管在重新启动前该文件不存在。

这是使用cron 3.0版完成的。

您必须确保没有使用服务光盘等在脚本运行时可能不可用的光盘。从上面的简单操作开始,并确保它没有终端输出,因为电子邮件可能没有启动并正在运行。

如果这对您不起作用,并且您需要此功能,则可能还需要更新的cron(或从oracle-linux升级)。


我更新了OP,以回答您的问题。原来您的怀疑从一开始就是正确的:重新启动时要运行的脚本位于可挂载的/dev/mapper/VolGroup00-LogVol01分区上。
2014年

@Daniel感谢您让我知道,很高兴您找到了罪魁祸首。我不确定是否可以将cron的启动延迟到挂载分区之前,某些启动是并行完成的,并且您将不得不更改依赖项。我不想搞混,可能会中断cron。您应该以恕我直言的方式采取与crontab&@reboot不同的途径,以用户身份在启动时运行一次。
Anthon 2014年

0

我想对这个问题说是。刚在重新启动(Debian 3.10.70)上运行cron时遇到困难,并设法解决了:

@reboot root /usr/bin/python3 /path/to/script

和换行符 “\ n”到底

这是文件的内容:

/etc/cron.d/runOnReboot

最后,我认为值得一提的是 man 5 crontab

... cron命令的格式非常类似于V7标准,具有许多向上兼容的扩展名。每行都有五个时间和日期字段,后跟一个命令,后跟一个换行符('\ n')。系统crontab(/ etc / crontab)使用相同的格式,除了在时间和日期字段之后且在命令之前指定命令的用户名。这些字段可以用空格或制表符分隔。命令字段的最大允许长度为998个字符。...


-1

prueba:

usuario @ ubuntu:〜$ touch script.sh usuario @ ubuntu:〜$ chmod + x script.sh

usuario @ ubuntu:〜$ $ crontrab -e

@reboot /home/usuario/script.sh

保存并重启电脑

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.