使用launchd代理。所有其他方式都會讓你的腦海裏充滿無數細節和隱藏的技巧。一般來說,這是非常複雜的任務,很多角落案例很難正確實施。啓動代理將允許您專注於自己的任務並節省大量時間。
最好的解決方案是重寫代理不要使用命令行,而是連接到launchd守護進程並要求正確的選項/設置。
如果不可能或很難,您可以編寫包裝程序launchd代理程序,該代理程序將在開始連接到守護程序時請求選項,然後使用適當的命令行啓動原始代理程序。
如果您認爲實現「連接到守護進程」機制太困難......也許是這樣,但它比從守護進程啓動其他會話中的代理要容易得多(當實施正確的不同角落支持時) 。
但是,如果你真的沒有什麼事情要骯髒的話,你可以玩「launchctl bsexec」。一些工作示例: Starting/stopping a launchd agent for all users with GUI sessions(而不是「launchctl load」,它可以在會話上下文中啓動任何可執行文件)。
這方面的一些更新。
通過「與launchctl玩bsexec」我的意思是類似的東西:
ps aux | grep loginwindow | grep user | awk '{ system("sudo launchctl bsexec "$2" sudo -u user /Applications/TextEdit.app/Contents/MacOS/TextEdit") }'
查找會議上,一些應用需要,利用其PID和調用「launchctl bsexec」來運行你在想什麼同一屆會議。上面的示例將在登錄「用戶」會話時啓動TextEdit,即使該行在另一個登錄用戶帳戶或服務中執行。
但我在獅子上測試它 - 它不起作用。它對我來說只適用於豹(10.5/10.6)。 我試圖說 - 不使用啓動代理將導致你的屁股不斷痛苦,沒有別的。經過十多次這樣的事情後,我們開始轉向發射代理,現在很高興:)
您可以評論您做了什麼以完全切換到啓動代理?因爲我使用的是我想在安裝後啓動的啓動代理程序,但安裝(特別是postflight腳本)以root用戶身份運行。按照您的說法,bsexec角度用於啓動啓動代理,但不在Lion中。如何讓您的啓動代理首先作爲登錄的每個用戶進行啓動? – devguydavid 2011-07-21 04:31:52
ps aux | grep loginwindow.app | grep -v grep | awk'{system(「sudo launchctl bsexec」$ 2「sudo -u」$ 1「launchctl load -S Aqua /Library/LaunchAgents/com.my.agent.plist」)}' – 2011-08-05 17:33:08
但是如果你想在Lion上有問題展示一些用戶界面。我們還沒有解決。 – 2011-08-05 17:34:19