2012-08-07 85 views
2

我正在爲OS X上的守護進程實現一個自更新程序。該更新以.pkg文件形式發佈,所以我正在嘗試的操作如下: 當通知守護程序有更新可用時,它會通過system()調用呼叫installer來安裝程序包。該軟件包包含一個較新版本的守護程序,一個用於停止守護程序的預升級腳本(launchctl unload /Library/LaunchDaemons/foo.plist)以及一個postflight腳本,可在安裝新版本後啓動備份。我遇到的問題是安裝程序過早退出。它懷疑這可能是因爲安裝程序爲了更新它而殺死它的父進程,然後被自殺而不是繼續作爲它自己的孤立進程。我試過,沒有運氣以下:C++在殺死父進程後保持進程有效

  • Postpending與「&」安裝程序命令在 背景
  • 結束語安裝命令nohup

運行install命令完成當我從命令行運行它時一貫沒有錯誤,並且從安裝程序運行時始終失敗。當從安裝程序調用時,我將輸出傳遞給一個文件,有時它沒有任何內容,有時它會顯示安裝在輸出停止前達到大約41%的完成。關於如何弄清楚過程中發生了什麼或確保它在沒有父母的情況下保持活力的任何想法?

+0

如果守護進程需要被卸載和裝載這樣呢?看起來你可以直接替換守護進程的可執行文件,然後讓守護進程自行終止,這樣launchd只會重啓它,但會得到新的版本。 – bames53 2012-08-07 03:59:04

回答

1

當您致電launchctl unload時,它會殺死整個過程組(與簡單的kill不同)。你想將你的子進程移動到一個單獨的進程組中。最簡單的方法是撥打電話setsid()

如果你在shell腳本的中間,你應該看看下面的方法。因爲我正在處理一個C程序,我沒有嘗試過這些,可能setsid()

  • 之前要調用安裝,使用set -m。這應該打開監視器模式,其中說:「後臺進程運行在一個單獨的進程組,並在完成後打印一個包含退出狀態的行。」
  • 試試這個子交互shell中招:New process group in shell script
+1

啊,我沒有意識到發射殺死了整個過程組。這是解決我的問題的關鍵。我最終做的是將以下密鑰添加到plist文件中: 'AbandonProcessGroup 當作業死亡時,啓動殺死任何剩餘的進程,其作業具有相同的進程組ID。設置- 將此鍵設置爲true將禁用該行爲.' [http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html#// apple_ref/doc/man/5/launchd.plist] – Cody 2012-08-07 19:59:01

+0

謝謝;這也是有用的信息。就我而言,我幾乎總是想要殺死整個pgrp,但很高興知道如何關閉它。 – 2012-08-07 21:07:03