当前位置: 首页>>技术问答>>正文


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

, , , , ,

问题描述

我在/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

…每次我的服务器重新启动时都必须记住这个问题,直到修复此问题为止。

Similar questions already存在,但到目前为止,我无法将信息应用于我的具体问题。

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

最佳解决方法

如果在执行任何命令时发生任何错误,rc.local脚本将退出(请参阅#!/bin/sh -e中的-e标志)。

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

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

  1. 在目录/etc/init.d中创建文件myscript.sh,标题为:#!/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脚本,看看是否可以在网络启动时触发命令。

次佳解决方法

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

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

第三种解决方法

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

sshades给了我以下答案:

Ubuntu is now using systemd, and rc.local is now considered a service which is turned “off” by default. You can turn rc.local “on” by entering the following command and rebooting:

sudo systemctl enable rc-local.service

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

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

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

第四种方法

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

在这些盒子上,他们非常快速地重启,我们发现只需在rc.local中放入一个“睡眠1”,然后加载语句就可以解决问题。我想在加载FW规则之前,它为接口提供了一点时间。

第五种方法

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6408.html,未经允许,请勿转载。