2013-05-14 78 views
2

由於啓動項目和rc命令在OS X上都被棄用(並且在許多情況下根本無法工作),因此受到launchd的支持,我想知道哪些方法是正確的可以設置一個在註銷/關機時運行的shell腳本。通過launchd在關機時運行Shell腳本

對於一個啓動項有可能創建一個看起來像一個shell腳本:

#!/bin/sh 
StartService() { 
    echo "Started." 
} 

StopService() { 
    echo "Stopped." 
} 

RunService "$1" 

但從launchd運行腳本時不支持RunService命令,我不知道這是無論如何,這意味着已經被使用了。

如果可能,我想創建一個shell腳本作爲按需服務提供給launchd,該服務將在關機時啓動並以某種方式通知系統正在關閉。

或者,我可能需要一個在登錄/系統啓動時打開的shell腳本,並保持運行(或者說,睡着)直到收到一個SIGTERM或其他kill信號,以便它可以在關閉之前運行一些命令。

+1

查看(http://apple.stackexchange.com/questions/16825/make-a-script-app-run-on-logout)查看類似的答案,並且「man launchd.plist」提供了有關變體的詳細信息您可以使用。請注意手冊頁的**期望**部分。 – gaige 2013-05-14 12:30:17

回答

1

@gaige謝謝你的回覆!最後我去了以下內容:

#!/bin/sh 
StartService() { 
    echo "Started" 
} 

StopService() { 
    echo "Stopped" 
    exit 0 
} 

StartService 
trap StopService SIGTERM 
while true; do 
    sleep 86400 & 
    wait $! 
done 

睡了整整一天應防止其浪費任何的處理能力,雖然它不完全我最喜歡的解決方案有東西跑這樣。然而,launchd實際上並沒有任何標準,似乎它會允許我的腳本只能在關機時運行。上面的代碼在加載(登錄)時運行,然後在終止,註銷或關閉時捕獲SIGTERM。請注意異步使用sleep,因爲有些環境在執行陷阱之前會等待睡眠完成,這是不好的,因爲launchd只允許在發送SIGKILL之前幾秒鐘響應SIGTERM

據我所知launchd只支持點播服務,如果它們是由套接字或觀看路徑觸發的,或者其他什麼,這對我來說實際上並沒有解決方案,因爲它仍然需要某種外部影響。

然而,一個有益的副作用是,我在StartService中獲得的任何結果(如文件指針等)都可以通過StopService輕鬆訪問,因爲它只是在內存中,不需要文件保存。只是不覺得是最優雅的解決方案,但嘿,如果它工作的很好!