我對 *nix 相當陌生,並且遇到過需要刪除多個進程的情況,這些進程應該 100% 運行。到後台使用&
.
我在 init.d 腳本中使用以下行來執行此操作(以使用者身分執行user
:
su -c 'process arg1 arg2 -w - | process2 arg1 -r - &' user
(其中 -w 寫入 STDOUT、STDIN,-r 讀取 STDOUT、STDIN)
具體來說,我知道這通常是不可接受的,因為這些過程沒有很好地免受外部影響。
為「服務」建立後台作業是否可以接受?
我應該使用 FIFO/命名管道來處理進程間通訊嗎?
如果是這樣,我是否仍然應該將這兩個進程建立為後台作業?這樣穩定嗎?
具體請參考這個郵件清單主題。
謝謝,
馬特
答案1
具體來說,我知道這通常是不可接受的,因為這些過程沒有很好地免受外部影響。
為「服務」建立後台作業是否可以接受?
如果沒有其他方法(即服務不會自行分叉),那麼可能是的。 Debianstart-stop-daemon
有一個--background
針對這種情況的參數:
-b, --background
Typically used with programs that don't detach on their own.
This option will force start-stop-daemon to fork before starting
the process, and force it into the background. WARNING:
start-stop-daemon cannot check the exit status if the process
fails to execute for any reason. This is a last resort, and is
only meant for programs that either make no sense forking on
their own, or where it's not feasible to add the code for them
to do this themselves.
答案2
由於第一個問題已經得到解答,我將集中討論最後兩個問題。
幾天前,我遇到了類似的問題:我必須透過/etc/init.d
腳本中的管道啟動一些進程。為了解決這個問題,我研究了 RHEL6(daemon
以及killproc
)/etc/init.d/functions
和 Debian(start-stop-daemon
)。我了解到,兩者都不能很好地處理管道。即使以某種方式有可能啟動它們,但阻止它們卻存在重大問題。因此我寫了一個小工具pipexec
。該程序啟動了一系列程序,但其行為就像一個程序。例:當SIGTERM
發送a 時pipexec
,它會殺死所有子級,然後再殺死它自己。也支援 pid 檔案處理 - 這讓您在與 RHEL6daemon
和killproc
.
我應該使用 FIFO/命名管道來處理進程間通訊嗎?如果是這樣,我是否仍然應該將這兩個進程建立為後台作業?這樣穩定嗎?
我也考慮過這一點- 但對我來說這太複雜了,而且當涉及到fifos 的穩定性和可靠性時,我沒有很好的經驗(也許這是我的問題- 但因此我很少使用它們;-))
我pipexec
用RHEL6集成沒有問題;它只是運行。
親切的問候 - 安德烈亞斯