问题描述
我在/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
使您的命令在启动时运行:
-
在目录
/etc/init.d
中创建文件myscript.sh
,标题为:#!/bin/sh
-
将自定义命令作为内容
-
使其可执行:
sudo chmod +x /etc/init.d/myscript.sh
-
为各种运行级别的脚本创建符号链接:
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
虽然我还没有测试过他的解决方案,但我认为这听起来合乎逻辑且有效。但是:
我还找到了一个解决方案,即添加脚本到./.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