我的 rc.local 出了问题,在服务器启动时它不会自动运行其中包含的命令行。但是,手动运行 rc.local 可以正常工作并启动脚本。
操作系统:Ubuntu 20.04.2 LTS
这是我的 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.
sh '/home/[user]/azerothcore-wotlk/reboot.sh'
exit 0
还有我的reboot.sh
#!/bin/sh
/usr/bin/screen -AmdS world /home/[user]/azerothcore-wotlk/acore.sh run-worldserver
/usr/bin/screen -AmdS auth /home/[user]/azerothcore-wotlk/acore.sh run-authserver
rc.local服务的状态:
$ systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
Loaded: loaded (/lib/systemd/system/rc-local.service; enabled-runtime; vendor preset: enabled)
Drop-In: /usr/lib/systemd/system/rc-local.service.d
└─debian.conf
Active: active (exited) since Wed 2021-05-19 22:01:41 IST; 2 days ago
Docs: man:systemd-rc-local-generator(8)
Process: 500 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
Warning: some journal files were not opened due to insufficient permissions.
rc.local和reboot.sh都具有权限:
$ ls -l /etc/rc.local
-rwxr-xr-x 1 root root 718 May 16 01:13 /etc/rc.local
$ ls -l reboot.sh
-rwxrwxr-x 1 [user] [user] 179 May 16 01:16 reboot.sh
顺便说一下,rc.local 以前可以工作,但突然因为未知原因停止了。我不是一个经验丰富的 Linux 用户,所以我读了很多关于这个问题的帖子,最常见的建议是:检查 rc.local 是否有 shebang 行(检查!);为 rc.local 和脚本设置适当的权限(检查!);检查服务的状态(检查!)。
在使用 rc.local 遇到困难后,我决定尝试一些其他方法。
我尝试使用 crontab:
crontab -e
@reboot sh /home/[user]/azerothcore-wotlk/reboot.sh
服务器启动时不启动。如果手动运行,则可正常启动。
还尝试了 init.d
sudo su
nano /etc/init.d/reboot
内容:
#!/bin/sh
/home/[user]/azerothcore-wotlk/reboot.sh
然后:
chmod ugo+x /etc/init.d/reboot
update-rc.d reboot defaults
同样的结果——启动时不启动。
然后尝试创建一个服务:
sudo nano /usr/bin/acore.sh
内容:
#!/bin/sh
screen -AmdS world /home/[user]/azerothcore-wotlk/acore.sh run-worldserver
screen -AmdS auth /home/[user]/azerothcore-wotlk/acore.sh run-authserver
sudo chmod +x /usr/bin/acore.sh
sudo nano /etc/systemd/system/acore.service
内容:
[Unit]
Description=My daemon
[Service]
ExecStart=/usr/bin/acore.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
$ systemctl start acore.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'acore.service'.
Authenticating as: ,,, ([user])
Password:
==== AUTHENTICATION COMPLETE ===
systemctl enable mydaemon.service
systemctl enable acore.service
也不起作用。
此时我完全不知道该怎么做。正如我上面提到的,我不是经验丰富的 Linux 用户,所以任何帮助我都会很感激!
谢谢你!
编辑:正如@terdon所建议的,我添加了以下几行
/usr/bin/touch /tmp/rc.has.run
到 rc 文件的开头)
和
/usr/bin/touch /tmp/reboot.has.run
到重启脚本的开头
/tmp
重启服务器后,文件夹中已创建这两个文件。
编辑2:感谢@terdon通过在 rc.local 开头添加“sleep 60”可以解决问题。
答案1
问题似乎不是脚本没有运行,而是它在系统完成所有设置之前运行得太早,因此失败了,因为你的机器还没有准备好运行它。所以一个简单的解决方案是给脚本添加一个延迟,让它在启动前等待一段时间。
编辑reboot.sh
脚本并添加sleep
调用:
#!/bin/sh
## wait for 60 seconds
sleep 60
/usr/bin/screen -AmdS world /home/[user]/azerothcore-wotlk/acore.sh run-worldserver
/usr/bin/screen -AmdS auth /home/[user]/azerothcore-wotlk/acore.sh run-authserver
您可以试验该sleep
值来找到可行并且不会感觉缓慢的值。