为什么启动时不执行/etc/rc.local中的命令?

x-x*_*x-x 44 server startup boot scripts tt-rss

我的/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
Run Code Online (Sandbox Code Playgroud)

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

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

如果我从命令行手动调用 /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
Run Code Online (Sandbox Code Playgroud)

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

类似的 问题 已经存在,但到目前为止,我一直无法将其中的信息应用于我的具体问题。

为什么启动时没有执行rc.local中的命令?

小智 25

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脚本并查看是否可以在网络启动时触发您的命令。


小智 13

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

sudo chmod +x /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

然后,启用它:

sudo systemctl enable rc-local.service
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl start  rc-local.service
Run Code Online (Sandbox Code Playgroud)

可以通过运行来显示服务状态:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 您无需手动启用该服务。如果文件存在且可执行,systemd 将自动启用 `rc-local` 服务。 (3认同)

Die*_*Bos 8

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

sshades 为我提供了以下答案:

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

sudo systemctl enable rc-local.service
Run Code Online (Sandbox Code Playgroud)

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

虽然我还没有测试过他的解决方案,但我认为这听起来合乎逻辑并且会奏效。然而 :

我还找到了一个解决方案,将脚本添加到 ./.config/autostart-scripts/ 即可解决问题

  • 得到这个错误。单元文件没有安装配置(WantedBy、RequiredBy 和 [Install] 部分中的 Alias 设置,以及模板单元的 DefaultInstance)。这意味着它们不打算使用 systemctl 启用。使用这种单元的可能原因是: 1) 一个单元可以通过从另一个单元的 .wants/ 或 .requires/ 目录进行符号链接来静态启用。2) 一个单元的目的可能是作为其他一些依赖它的单元的助手。 (13认同)
  • 我也收到此错误。如果关闭`rc.local`,有什么替代方法? (2认同)

zub*_*uba 5

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

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]
Run Code Online (Sandbox Code Playgroud)


小智 5

我们在一些加载 FW 规则的托管服务器上遇到了这个问题。

在这些机器上,它们重新启动非常快,我们发现在加载语句似乎可以解决问题之前,只需在 rc.local 中放置一个“sleep 1”。我想在加载 FW 规则之前,它给了接口一些时间来解决。

  • 谢谢你。`sleep 1` 解决了我的问题。有趣的是我有很多服务器,但只有一个有这个问题。 (2认同)