我正在嘗試設置尤追蹤在 OS X Lion Server 上並使用launchd
.我已經下載了 YouTrack jar 文件,我可以使用java -Xmx512m -jar youtrack.jar 8080
.我還將所述運行命令包裝在類似於以下的 shell 腳本中這youtrack start
這基本上讓我可以使用和與活動實例進行互動youtrack stop
。它將進程的進程 ID 儲存java
在檔案中並退出,以便能夠停止正在運行的實例,僅允許一個實例等。
為了在啟動時運行此命令,我創建了一個簡單的 launchd plist 並將其放置在 /Library/LaunchDaemons 中,按照 中給出的說明進行操作man launchd.plist
。使用的主鍵是ProgramArguments
( youtrack start
) 和RunAtLoad
(true)。問題是,當從命令列運行時,youtrack start
將建立一個包含進程 pid 的文件java
,我可以在top
或中看到該進程ps ax
。但是,當 lanuchd ( ) 運行該命令時,sudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist
生成的 pid 將與任何正在運行的進程的 pid 不匹配,且 YouTrack Web 伺服器不會啟動。幾乎就像由 launchd 啟動的 java 進程也會在 launchd 完成後終止。
但是,如果我只是將 java 命令直接放在 launchd plist 中,它將正常工作。我只是想了解這是為什麼 - 我認為 launchd 的想法是啟動守護進程。但這是否意味著守護程式必須在其整個生命週期中在 launchd 內運行?是否有另一種使用(或不使用)launchd 啟動守護程序的方法,這將允許我在啟動時簡單地執行命令一次?基本上就是我們在早期版本的 OS X@roboot
中所使用的方法。cron
答案1
Launchd 不僅啟動程序,還會在程式執行時監控。預設情況下,它希望程式繼續運行(作為守護進程),而不是啟動其他程式(/自身的後台副本/其他程式)並退出。如果程式確實退出,launchd 會做兩件事,這可能會導致運行並退出程式出現問題,例如youtrack start
:它會「清理」剩餘的子進程(如實際的伺服器進程),並且(取決於其他一些設定)重試“失敗”的程序。有兩種方法可以解決這個問題:
以 launchd 方式執行:
java -Xmx512m -jar youtrack.jar 8080
直接執行 launchd 項(請注意,命令的每個「單字」應該是陣列的單獨元素ProgramArguments
)。如果您新增<key>KeepAlive</key><true/>
至 launchd .plist,如果伺服器因任何原因崩潰或退出,它將重新啟動伺服器(請注意,這包括被殺死,因此您應該重寫youtrack stop
以使用launchctl unload ...
並讓 launchd 執行殺死操作)。告訴 launchd 不要期望它繼續運行,也不要終止子進程。將其新增至您的 .plist 以關閉預設行為:
<key>KeepAlive</key> <false/> <key>AbandonProcessGroup</key> <true/>