systemd托管服务的几种启动类型
simple
使用场景:
-
适用于前后台进程
-
服务不需要任何特殊的启动顺序,不需要在报告启动完成之前执行初始化任务
例如:
一些见到的脚本一般就采用simple这种启动方式
启动成功:
只要 ExecStart 指定的命令被成功执行并产生了一个进程,systemd 通常会认为该服务已成功启动。
启动失败:
如果 ExecStart 指定的命令没有被成功执行或很快终止,则systemd 会认为服务启动失败。
forking
使用场景
适用于传统的守护进程。
例如:
redis服务、apache服务等
启动成功:
当父进程(由ExecStart启动的原始进程)退出,并且返回退出码0时,systemd会认为该服务已成功启动
启动失败:
主进程没有退出,systemd会认为该服务仍在启动过程中。这会持续到达到TimeoutStartSec指定的超时时间。如果在此时间内主进程没有退出,systemd会认为服务启动失败。
notify
使用场景:
-
适用于前后台进程
-
需要进行一些初始化操作并在完成后通知 systemd 的服务。
这种类型允许服务在其内部完成所有必要的启动步骤后显式地发送一个通知给 systemd 表示它已经完成初始化并且正在运行。
例如:
mysql服务、sshd服务等
工作原理:
- systemd 使用 ExecStart 选项启动服务的主进程。
- 服务进程开始执行,并进行所需的初始化操作。在此过程中,systemd 等待来自服务的通知。
- 一旦服务完成其初始化并且准备好接受请求或其他操作,它使用 sd_notify 或类似机制向 systemd 发送一个“准备好了”的通知。
- systemd 在 TimeoutStartSec 指定的时间内等待这个通知。
- 如果 systemd 在超时时间内收到了“准备好了”的通知,它就认为服务已成功启动。如果在这个时间内没有收到任何通知,systemd 则认为服务启动失败。
启动成功:
如果 systemd 在超时时间内收到了 "READY=1" 的通知,它会认为服务成功地启动。
启动失败:
如果超时时间过去了,但 systemd 仍然没有收到 "READY=1" 的通知,它会认为服务启动失败。