崩溃时自动重启 rc.local 脚本

崩溃时自动重启 rc.local 脚本

我让 rc.local 在启动时加载一个脚本。想知道如果此服务崩溃,有没有办法让它自动重启?

答案1

不要使用/etc/rc.local长期运行的服务,而是创建systemd 服务。例如,创建/etc/systemd/system/foo.service包含以下内容的:

[Unit]
Description=Foo

[Service]
Type=simple
ExecStart=/usr/bin/sleep 10
Restart=always

[Install]
WantedBy=default.target

这将创建一个服务,当命令终止时它将重新启动该命令。将其替换ExecStart为您的命令。

创建此文件后,执行以下操作:

sudo systemctl daemon-reload
sudo systemctl enable foo.service
sudo systemctl start foo.service

第一个命令将指示systemctl查找新的服务定义。第二个命令根据服务的启动条件启用服务(在本例中,以 开始default.target,以便它在启动时启动)。最后一个命令启动服务会议。


为了Type

如果设置为simple(如果未指定Type=BusName=,则为 默认值ExecStart=),则预期配置的进程ExecStart=是服务的主进程。在此模式下,如果进程向系统上的其他进程提供功能,则应在守护进程启动之前安装其通信通道(例如,由 systemd 通过套接字激活设置的套接字),因为 systemd 将立即启动后续单元。

如果设置为forking,则预期配置为 的进程 ExecStart=将在其启动过程中调用fork()。预期在启动完成且所有通信通道都设置好后,父进程将退出。子进程继续作为主守护进程运行。这是传统 UNIX 守护进程的行为。如果使用此设置,建议也使用 选项PIDFile= ,以便 systemd 可以识别守护进程的主进程。一旦父进程退出,systemd 将继续启动后续单元。

因此,如果您的命令分叉,那么请尽可能使用Type=forking并设置。PIDFile


对于WantedBy,运行systemctl list-units | grep target以查找可用于更细粒度控制的其他可用目标。

相关内容