Linux
為什麼在服務的單元文件中使用分叉?
我的 nginx 單元文件如下,
[root@arif ~]# cat /usr/lib/systemd/system/nginx.service [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid # Nginx will fail to start if /run/nginx.pid already exists but has the wrong # SELinux context. This might happen when running `nginx -t` from the cmdline. # https://bugzilla.redhat.com/show_bug.cgi?id=1268621 ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true [Install] WantedBy=multi-user.target
這裡,在該
[Service]
部分中,的值Type
等於forking
從這裡開始的意思,以 ExecStart 啟動的程序會生成一個子程序,該子程序將成為服務的主程序。啟動完成後父程序退出。
我的問題是,
- 為什麼服務會這樣做?
- 這樣做有什麼好處?
- 出了什麼問題
Type=simple
或其他類似的選擇?
為什麼服務會這樣做?
事實上,服務通常不會那樣做。除了這不是一個好的做法,而且“dæmonization”的想法確實是錯誤的之外,服務所做的並不是
forking
協議所要求的。他們弄錯了協議,因為他們實際上是在做其他事情forking
,這通常是不必要地被硬塞到協議中的。這樣做有什麼好處?
沒有。存在更好的準備通知協議,實際上沒有人正確地使用該協議。這個服務單位沒有這樣做,因為它是有利的。
出了什麼問題
Type=simple
或其他類似的選擇?沒有。事實上,通常是使用
forking
準備協議是錯誤的。正如其他答案所聲稱的那樣,這不是最佳實踐。恰恰相反。一個簡單的事實是,這是一個糟糕的工作中最好的一個,它可以應對仍然無法關閉的 nginx 行為。現在的大多數服務軟體,多虧了來自 IBM SRC、daemontools 和其他嚴肅的服務管理領域的 25 年的鼓勵,已經獲得了選項,甚至改變了它們的預設行為,而不是試圖愚蠢地“dæmonize”某些東西已經在 dæmon context 中。
但是,對於 nginx,情況仍然不是這樣。
daemon off
不工作,可悲的是。就像許多軟體錯誤地將“non-dæmonize”模式與調試模式混為一談一樣(但現在通常不再這樣做),nginx 不幸地將其與其他事情混為一談,例如不處理其控制信號。到目前為止,人們已經為此努力了 5 年。進一步閱讀
- 喬納森·德博因·波拉德 (2015)。Unix 守護程序的就緒協議問題。經常給出答案。
- 阿德里安·克萊爾 (2013-10-27)。*nginx:不要
type=forking
在 systemd 服務文件中*使用。Debian 錯誤 #728015。- runit 和 nginx
- 喬納森·德博因·波拉德 (2001)。“不要 fork() 為了‘把守護程序放到後台’。 ”。 設計 Unix 守護程序時要避免的錯誤。經常給出答案。
- 喬納森·德博因·波拉德 (2015)。你真的不需要守護程序。真的。. 系統化的恐怖屋。
- StackExchange 上的許多就緒協議不匹配範例:
- https://unix.stackexchange.com/a/401611/5132
- https://unix.stackexchange.com/a/200365/5132
- https://unix.stackexchange.com/a/194653/5132
- https://unix.stackexchange.com/a/211126/5132
- https://unix.stackexchange.com/a/336067/5132
- https://unix.stackexchange.com/a/283739/5132
- https://unix.stackexchange.com/a/242860/5132