2011-12-01 23 views
6

我有一個launchd啓動服務器的腳本,然後告訴它在launchd殺死它時(應該在關閉時)正常退出。我的問題是什麼是適當的,慣用的方式來告訴腳本閒置,直到它獲得信號?我應該只使用while-true-sleep-1循環,還是有更好的方法來做到這一點?Bash - 我應該如何閒置,直到我收到信號?

#!/bin/bash 

cd "`dirname "$0"`" 

trap "./serverctl stop" TERM 
./serverctl start 

# wait to receive TERM signal. 
+2

'while:while;做睡1;對我來說似乎沒問題。 – choroba

+1

你能得到'serverctl'產生的進程的PID嗎?用'jobs -p'或'pgrep -P'? –

+0

實際的服務器進程正在「屏幕」會話中運行。等待這可能不是一個壞主意,因此意外退出將導致此腳本結束並警告啓動該進程已關閉。另一方面,它已經過了十五個月,並且它現在工作得很好。 :-P –

回答

2

與旋轉鎖相比,簡單wait的資源密集程度要低得多,即使是在睡眠狀態下也是如此。

+2

我沒有開始任何後臺進程 - 如何在這裏等待工作? –

+0

在讀取虛擬fifo時等待,即創建fifo,然後調用「read Stabledog

+0

或者等待守護進程的PID似乎開始。 – tripleee

2

爲什麼要讓腳本繼續運行?有什麼理由嗎?如果你在信號發生後沒有做任何事情,那麼我沒有看到有什麼理由。

當您從關閉中獲得TERM時,您的serverctl和服務器可執行文件(如果有的話)也同時獲得TERM。

要做到這一點的設計,你必須安裝你的serverctl腳本作爲rc腳本,並讓init(開始和)停止。 Here我描述瞭如何設置最初不是用作服務器的服務器進程。

+0

Serverctl不會收到TERM,因爲它不會持續。實際的持續過程是一個Minecraft服務器,我無法修改它,當它達到TERM時會立即死亡。 另外,在Mac OS上不推薦使用rc(否則這將是執行此操作的顯而易見的方法)。 –

1

您可以簡單地使用「睡眠無限」。如果你想在關機時執行多個動作,並且不希望創建一個函數,另一種可能是:

#!/bin/bash 
sleep infinity & PID=$! 
trap "kill $PID" INT TERM 

echo starting 
# commands to start your services go here 

wait 

# commands to shutdown your services go here 
echo exited 

另一種選擇「休眠無限」(似乎busybox的不支持它例如)可以是「tail -fn0 $ 0」例如。

相關問題