rc.local 在服务器启动时未运行

rc.local 在服务器启动时未运行

我的 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值来找到可行并且不会感觉缓慢的值。

相关内容