2013-04-10 67 views
1

我有一個關於在OS X上執行軟件更新的正確方法的常見問題。我的應用程序以root身份運行兩個守護進程。其中一個守護進程可以從網絡下載軟件更新包。下載時,它必須安裝新的二進制文件,其中包括兩個二進制文件,用於替換守護進程的當前文件。由於這兩個守護進程正在運行,因此替換它們可能是一個問題。因此,我沒有什麼想法,但是就同樣的問題得到專家意見會有所幫助。方法1:下載更新後,它可以保存在某個位置。更新後臺程序可以將bash腳本放置在另一個指定位置,並創建一個plist,放置在LaunchDaemons目錄中,以便在下次重新引導時觸發。腳本在啓動之前簡單地替換這兩個二進制文件。這隻有在我們可以確保兩個守護進程在我的腳本執行之前不啓動的情況下才有可能。在啓動守護進程之前,我沒有找到一個好方法來告訴launchd先運行我的腳本。所以我不太確定這是否是一個好的解決方案。方法2:下載後,立即使用launchd以編程方式啓動腳本。這應該是可能的,對吧?腳本等待TERM信號,如https://discussions.apple.com/thread/3636062?start=0&tstart=0所示,以實際替換二進制文件並正常退出。問題再次出現,當我的腳本啓動時,我必須確定在更換二進制文件之前我的守護進程已關閉。我不知道如何做到這一點。管理守護進程的軟件更新 - 確保它們沒有運行

任何人都可以建議哪個更好的方法,並讓我知道任何更好的方法嗎?

回答

1

我用它來更新後臺程序的解決方案是推出獨立的shell腳本,做了下:通過launchctl unload -w path.to.plist

  • 卸載守護程序,它會等待作業完成。
  • 刪除舊文件
  • 安裝新的文件(這裏我實際安裝包,這將啓動我的守護在飛行後的腳本)
  • 可選:啓動守護進程與launchctl load -w path.to.plist

要執行你只需要腳本叉(),setsid()和execv()

您可以使用AppleScript的在你的shell腳本優雅地退出應用程序:

osascript << EOF 
if application "Your Application" is running then 
    -- Force application to quit 
    tell application "Your Application" to quit 
    -- Wait until it quits 
    repeat 
     if application "Your Application" is not running then exit repeat 
     delay 1 
    end repeat 
end if 
EOF 
killall -15 your_app # just in case 
+0

如果有一個正在運行的.app應用程序,該怎麼辦?如何更新?這不會由啓動發起?我們是否突然殺了它?對我來說似乎不是很好。另外,如果用戶在更新守護進程啓動時實際使用應用程序並執行此操作? – user2085689 2013-04-10 07:38:42

+0

我已更新我的帖子以退出應用程序。並且您可以向用戶顯示一些通知,該更新將立即執行。 – cody 2013-04-10 07:43:41

+0

感謝科迪!如果應用程序出於某種原因拒絕關閉,會發生什麼情況。我們確實看到只掛起而不關閉的應用程序?這個腳本會繼續等下去嗎?我試了一下,它運作良好,但我的應用程序沒有掛。我試圖從我沒有管理權限的應用程序調用腳本來查看發生的事情。我用這裏寫的方法http://stackoverflow.com/questions/6841937/authorizationexecutewithprivileges-is-deprecated從程序運行腳本,而不需要fork和exec。我得到了提示符,但失敗,錯誤 – user2085689 2013-04-11 00:37:22