我让 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
以查找可用于更细粒度控制的其他可用目标。