正确的自定义 systemd 服务的推荐约定是什么?

Kir*_*kan 2 selinux centos systemd

我有一个二进制文件,没有任何内置命令来重新启动或关闭它创建的进程。在查看了一些内置的 CentOS 服务后,我得出的结论是我不能将它们用作模板,因为它们中的很多都尊重便捷性SIGHUP等。这意味着我需要创建 .sh 脚本来运行和控制它,这就是我遇到的一些问题。单元模板有一个名为PIDFile的东西,但我在文档中找不到任何信息,如果 systemd 管理并跟踪PID它启动的进程,或者它只是指出PID file服务将自行创建的一种方式。如果它是第一个,那么如果它是通过 /bin/sh 而不是二进制文件本身执行的脚本,它将如何正确跟踪它?难道它不会捕获 的sh processPID 吗?

查看 HTTPD (Apache) 服务单元:

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
Run Code Online (Sandbox Code Playgroud)

如果 ${MAINPID} 没有在任何地方声明,他们如何在这里引用它?

我当前的假设是我必须传递给我的 .sh 脚本参数来处理启动/停止/终止重新启动操作。这是普遍接受的做法吗?如果我要以有限用户身份运行它(这是一个我根本不敢碰的页面),那么它如何与 SElinux 一起工作 - sh 脚本也会以指定的有限用户身份运行吗?

Jde*_*eBP 6

\n

我当前的假设是我必须传递给我的 .sh 脚本参数来处理启动/停止/终止重新启动操作。

\n
\n

这是一种常见的做法。这是一种常见的不良做法。这是一个穷人的 D\xc3\xa6mon 主管,用 shell 脚本写得很糟糕(一如既往)。这是完全没有必要的。事实上,您所询问的几乎所有内容都是完全不必要的。不要使用 Poor Man 的 D\xc3\xa6mon Supervisor 和 Bad Logger 编写包装器 shell 脚本。不要乱搞不稳定且危险的 PID 文件机制。您正在使用服务管理器,它不需要任何这些

\n

设立Type=simple服务单位。您可以systemctl使用startstoprestartreload、来实现enable,而且无需愚蠢的包装脚本disable即可完美实现。像 systemd 和其他服务管理器只记住进程 ID,因为它首先分叉了它。

\n

如果你的程序有一些“d\xc3\xa6monization”机制,请将其关闭并且不要使用它。感谢 daemontools 等人。这是很长一段时间以来的要求,许多程序在过去 20 多年里已经发展了这样的机制,而其他程序则根本不首先默认为“d\xc3\xa6monizing”,因此可以在他们的默认操作模式。

\n

切勿使用Type=forking. 这应该是绝望中的最后手段,因为几乎没有程序真正使用该协议。你的程序无疑不会。选择Type=simple为标准。使用早期套接字打开(使用套接字单元配置),或者Type=notify,如果程序支持它们。回到程序的作者那里,LISTEN_FDS如果没有的话,鼓励支持早期套接字打开(协议),并且它是一个侦听套接字连接的程序。ExecStop如果TERM信号停止你的程序,不要使用任何显式的,这是应该的。不用担心${MAINPID},您的单元文件中不会有它。

\n

看在上帝的份上,不要把 Apache 作为一个供新手复制的简单而直接的服务示例。Apache 认为WINCH应该终止进程。找点别的东西看看。

\n

进一步阅读

\n\n