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

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

我的脚本中有一个命令/etc/rc.local,用于启动更新守护进程微小的 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里的命令?

答案1

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

答案2

确保 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

答案3

我在 rc.local 中遇到了类似的问题,启动时无法执行

sshades 为我提供了以下答案:

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

sudo systemctl enable rc-local.service

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

虽然我还没有测试过他的解决方案,但我认为它听起来合乎逻辑,而且可行。然而:

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

答案4

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

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

相关内容