为什么启动期间未执行/etc/rc.local中的命令?


39

我的/etc/rc.local脚本中有一个命令,该命令应该在启动过程中启动Tiny Tiny RSS的更新守护程序,但是在启动过程中不会执行该脚本。为什么?

整个/etc/rc.local文件:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local 是可执行的:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local 存在并且可执行:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local 应该在启动时为此运行级别执行:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

如果我从命令行手动调用/etc/rc.local,则update_daemon会加载...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

...我必须记住,每次服务器重新启动时都必须这样做,直到解决此问题为止。

类似的 问题 已经存在,但是到目前为止,我还无法将信息应用于我的特定问题。

为什么在启动过程中不执行rc.local中的命令?


可能是由于该requiretty设置。登录时,您正在TTY中执行脚本,但是在系统引导期间,它不在TTY中。该链接可能对您有帮助shell-tips.com/2014/09/08/…谢谢。
KICT

Answers:


23

rc.local如果执行任何命令时发生任何错误,脚本都会退出(提及中的-e标志#!/bin/sh -e)。

当您在rc.local执行执行时尝试运行命令时,可能没有满足某些先决条件,因此命令执行失败。

我在手动设置cpu调控器时遇到了同样的事情,而在中却没有这样做rc.local。这是我的自定义解决方法,update-rc.d用于使您的命令在启动时运行:

  1. myscript.sh在目录中创建一个/etc/init.d带有标题的文件:#!/bin/sh
  2. 将自定义命令作为内容
  3. 使它可执行: sudo chmod +x /etc/init.d/myscript.sh
  4. 为各种运行级别的脚本创建符号链接: sudo update-rc.d myscript.sh defaults

另外,您可以检查/etc/network/if-up.d脚本并查看在网络启动时是否可以触发命令。


谢谢你的回答。自发布问题以来,我的设置已更改,因此我无法测试您的答案是否可以解决问题。
2014年

请告诉我第四步是什么?我是第一次接触update-rc.d
Mohith7548

7

我在启动时没有执行rc.local中有一些类似的问题

sshades为我提供了以下答案:

Ubuntu现在使用systemd,并且rc.local现在被认为是默认情况下“关闭”的服务。您可以通过输入以下命令并重新启动来将“ rc.local”打开。

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498

尽管我尚未测试过他的解决方案,但我认为这听起来合乎逻辑并且可以正常工作。但是:

我还找到了一种解决方案,可以在./.config/autostart-scripts/中添加脚本来解决问题


7
得到这个错误。单元文件没有安装配置(WantedBy,RequiredBy,此外,[Install]部分中的Alias设置以及模板单元的DefaultInstance)。这意味着不打算使用systemctl启用它们。拥有此类单元的可能原因如下:1)一个单元可以通过与另一个单元的.wants /或.requires /目录进行符号链接来静态启用。2)一个单元的目的可能是充当某个其他依赖于它的单元的帮助者。
特·埃德姆·萨欣(RıfatErdem Sahin)'11

我也收到此错误。如果rc.local关闭,有什么选择?

5

尝试sudo sysv-rc-conf检查是否rc.local已启用

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]

是的,它已启用。
xx

该命令是否需要安装?
jcollum

1
@jcollum是的,它是一个来自相同名称的程序包。要安装,请键入sudo apt install sysv-rc-conf
banan3'14

rc.local甚至不在我的服务列表中!

4

确保rc.local脚本是可执行的:

sudo chmod +x /etc/rc.local

然后,启用它:

sudo systemctl enable rc-local.service

重新启动系统或通过运行以下命令手动启动脚本:

sudo systemctl start  rc-local.service

通过运行以下命令可以显示服务状态:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service

您无需手动启用该服务。如果该文件存在且可执行,则systemd将自动启用该rc-local服务。
muru

3

在某些加载固件规则的托管服务器上,我们遇到了此问题。

在这些机器上,它们可以非常快速地重新启动,我们发现只是在load语句似乎可以解决此问题之前,将“ sleep 1”放在rc.local中。我猜这为接口在加载固件规则之前花了一些时间解决了。


1
谢谢。sleep 1解决了我的问题。有趣的是,我有很多服务器,但是只有一个服务器有此问题。
钱琛

1

我曾经rc.local在Windows中使用记事本进行编辑,然后开始出现此问题。

在这种情况下,使用文本编辑器支持EOL转换(例如Notepad ++)将EOL样式转换为“ Unix”可能会解决。

您也可以:set ff=unix在Vim中执行此操作。


1

我在Ubuntu lxc容器中发现,如果rc.local具有完全正确的shebang,例如

#!/bin/sh

它会失败,但是如果您删除shebang,它将起作用。

我不知道它为什么使用或使用哪种壳,我认为它也会在第一个非零爆炸。(在其他Ubuntu中安装适当的shebang不是问题)


0

您必须/etc/rc.local使用以下命令确保在服务器启动期间执行该命令:

sudo systemctl enable rc-local.service

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.