为什么启动期间/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
…每次我的服务器重新启动时都必须记住这一点,直到修复此问题为止。
类似的 问题 已经存在,但到目前为止,我一直无法将信息应用于我的具体问题。
为什么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] [ ] [ ] [ ]
我们在加载FW规则的某些托管服务器上遇到此问题。
在这些盒子上,他们很快就重新启动,我们发现在load语句似乎解决了这个问题之前,只需在rc.local中放入一个“sleep 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
我在rc.local中有一些类似的问题没有在启动时执行
sshades给了我以下答案:
Ubuntu现在正在使用systemd,而rc.local现在被认为是默认情况下“关闭”的服务。 您可以通过输入以下命令并重新启动来打开rc.local“on”:
sudo systemctl enable rc-local.service
虽然我还没有测试过他的解决方案,但我认为这听起来合乎逻辑且有效。 但是:
我还找到了一个解决方案,即添加脚本到./.config/autostart-scripts/就可以了
我曾经在Windows中用记事本编辑过rc.local
,但它开始出现这个问题。
在这种情况下,使用文本编辑器支持EOL转换(如Notepad ++)将EOL样式转换为“Unix”,可以解决它。
你也可以这样做:set ff=unix
在Vim中:set ff=unix
。
您必须确保在服务器启动期间使用以下命令执行/etc/rc.local
:
sudo systemctl enable rc-local.service