Answers:
当您从命令行手动启动服务时(不使用nohup
前缀命令或&
后缀在后台运行该服务,换句话说,只需运行您将ExecStart=
在.service
文件行中放置的命令),会发生什么?
a)如果服务启动并保持运行,并且直到您按Control-C或以其他方式停止该服务时,提示才返回:这Type = simple
是正确的选择。
b)如果提示返回但服务仍在后台运行(即服务自行守护自身),则Type = forking
是正确的选择。
c)如果服务完成其工作并返回提示而没有任何运行(例如,该服务只是调整某些内核设置,向其他命令发送命令或执行类似操作),则Type = oneshot
可能是正确的选择。在这种情况下,ExecStart
服务的命令可能是“设置”某项的命令,并且ExecStop
可能是“取消设置”该命令的相应命令。这种类型通常有益于RemainAfterExit=true
,因此systemd将根据事物是最近“置入”还是“未置入”来跟踪该服务的“状态”。
其他Type
值是特殊情况。例如,如果服务使用D-Bus连接,则Type = dbus
可能是最佳选择。它systemd
意识到了这一事实,然后systemd将通过D-Bus上该服务的存在来跟踪该服务(及其相关的任何内容)。
要使用Type = notify
,该进程必须能够连接到环境变量中指定的Unix套接字,$NOTIFY_SOCKET
并在必要时通过向该套接字写入消息来报告其状态。同样,服务文件应指定相应的NotifyAccess
选项以授予对通知套接字的访问权限。
您可以使用命令行实用程序systemd-notify
和C库函数sd_notify(3)
来发送这些消息,但是如果这些都不适合您的要求,则可以实现自己的消息发送者。所需的消息非常简单,并且看起来像shell变量分配:例如,要通知服务已成功完成启动并准备服务任何传入请求,则该服务应将等效于的输出的字符串发送printf "READY=1\n"
到套接字。请参阅man 3 sd_notify
以获取有关已识别消息的更多详细信息。
注意:许多设计为可移植到许多Unix风格的系统上的服务应用程序在默认情况下可能会表现为b),但可以通过添加一个选项(通常称为“请勿分叉”,“保持运行”)来像a)一样工作。在前台”,“请勿守护”或类似内容)。在这种情况下,如果该选项没有其他副作用,则添加该选项并使用a)类型的行为将是更可取的systemd
。
apachectl start
以root身份运行,也许吗?尝试做,看看会发生什么。然后从我的答案中选择a),b)或c)。我敢打赌提示会返回并且Apache仍在运行,所以b)将是答案。
Type=notify
?
Type=notify
添加的说明。
apache
,应该使用哪种类型?