2012-10-27 27 views
1

我有使用daemon命令(RHEL 6.2)一個Java過程進程化。我使用下面的行啓動進程和線下阻止它:如何使守護進程停止 - 直到底層進程死亡?

工作的事情,直到我將嘗試使用停止重新開始我的進程/啓動方式:

daemon --stop --name=my-service --verbose 
daemon --command "/opt/my-service" --respawn --name=my-service --verbose 

它該過程在執行上述命令之前運行,然後現有過程將停止,但不會創建新過程。相反,下面的線將被記錄到/var/log/messages

Oct 27 07:59:46 myhostname my-service: my-service: fatal: failed to become a daemon: Resource temporarily unavailable

其中,據我瞭解意味着我們試圖對pid文件獲取鎖,但另一個進程佔用其上的鎖。或者換句話說:原始流程仍在運行。

有趣的是它無法通過即下面的命令被複制:

daemon --command "sleep 30s" --respawn --name=sleeper --verbose 
daemon --stop --name=sleeper --verbose 
daemon --command "sleep 30s" --respawn --name=sleeper --verbose 

那麼就必須有東西在我的過程中引起/戰功--stop異步特性。

我怎樣才能讓--stop攔截?

+0

有你嘗試:'守護進程 - 名稱=我的服務 - 運行「? –

+0

我還沒試過。你的意思是說我可以編寫一個循環,直到進程終止(有一些超時),然後啓動進程? – Lucas

+0

嗯,我不能重現你的Java應用程序的行爲,但是,嘗試一些像...我將它發佈爲解決方案... –

回答

0

這可能幫助:

while true; do 
    daemon --name=my-service --running --verbose | grep not 
    [ $? -eq 0 ] && exit 
    sleep 1 
done 

描述爲p代碼: 永遠{ 檢查,如果daemon --name=my-service --running --verbose返回包含單詞not 如果是,exit 否則sleep a second 一些事情}

+0

謝謝。我會調整它在幾秒鐘後超時。 – Lucas

+0

請勿使用'grep'。 'daemon --running'提供退出狀態,所以你可以等價寫:'while daemon --name = my-server --running;做睡1; done' –