Centos

適當的自定義 systemd 服務的推薦約定是什麼?

  • November 16, 2021

我有一個二進製文件,它沒有任何內置命令來重新啟動或關閉它創建的程序。在查看了一些內置的 CentOS 服務後,我得出結論我不能將它們用作模板,因為它們中的很多都尊重方便SIGHUP之類的。這意味著我需要創建 .sh 腳本來執行和控制它,這就是我遇到一些問題的地方。單元模板有一個叫做PIDFile的東西,但如果 systemd 管理和跟踪它啟動的程序,或者它只是指出服務將自行創建的一種方式,我在文件中找不到任何資訊。如果它是第一個,那麼如果它是一個將通過 /bin/sh 而不是二進製文件本身執行的腳本,它將如何正確跟踪它?它不會抓住PID``PID file``sh process的 PID 代替?

查看 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}

如果沒有在任何地方聲明,他們如何在這裡引用 ${MAINPID}?

我目前的假設是我必須將處理啟動/停止/終止重啟操作的 .sh 腳本參數傳遞給我。這是普遍接受的做法嗎?如果我要以受限使用者的身份執行 SElinux(這是一個我根本不敢接觸的頁面),它將如何與 SElinux 一起工作 - sh 腳本也會以指定的受限使用者身份執行嗎?

我目前的假設是我必須將處理啟動/停止/終止重啟操作的 .sh 腳本參數傳遞給我。

這是一種常見的做法。這是一種常見的不良做法。這是一個窮人的守護程序,用 shell 腳本寫得很糟糕(他們總是這樣)。這是完全沒有必要的。實際上,您所詢問的幾乎所有內容都是完全不必要的。不要使用Poor Man’s Dæmon Supervisors 和Bad Loggers 編寫包裝外殼腳本。不要亂用搖搖晃晃和危險的 PID 文件機制。您正在使用服務管理器,它不需要任何.

做一個Type=simple服務單元。您可以systemctl使用start, stop, restart, reload, enable, 並且disable完全沒有愚蠢的包裝腳本。像 systemd 和其他服務管理器這樣的服務管理器只記住程序 ID,因為它首先對它進行了分叉。

如果您的程序有一些“dæmonization”機制,請將其關閉並且不要使用它。感謝 daemontools 等人。長期以來,這一直是一個要求,在過去的 20 多年中,許多程序已經發展了這種機制,而其他程序根本不首先預設“dæmonizing”,因此可以在其預設操作模式下使用。

永遠不要使用Type=forking. 這應該是萬不得已的最後手段,因為幾乎沒有程序實際使用該協議。你的程序無疑不會。選擇Type=simple為標準。使用早期套接字打開(使用套接字單元配置),或者Type=notify,如果程序支持它們。回到程序的作者LISTEN_FDS那裡,如果不支持早期套接字打開(協議),則鼓勵支持,它是一個偵聽套接字連接的程序。ExecStop如果TERM信號停止你的程序,不要使用任何顯式,它應該。不用擔心${MAINPID},你的單元文件中不會有它。

看在上帝的份上,不要將 Apache 視為一個簡單直接的服務範例,供新手複製。Apache 認為WINCH應該終止程序。找點別的東西看。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/590860