2010-03-25 84 views
4

我有一個啓動守護進程,它在Mac OSX 10.6機器的登錄環境中運行。我想爲該代理中的每個用戶啓動代理,並讓代理在用戶的登錄上下文中運行。但是,我需要非常仔細地控制代理應用程序的精確參數,這就是爲什麼我不能使用launchd代理,就像我守護進程一樣。從用戶環境中的守護進程啓動代理

如何創建一個在登錄用戶上下文中運行的進程?我已經修理了seteuidsetuid調用,但這些不會更改代理應用程序的執行上下文。

我知道這不是Apple推薦的做事方式,但我並沒有真正的選擇 - 守護程序的設計非常不靈活(它必須運行許多不同的系統)。有沒有一種解決方法可以讓我在登錄用戶的GUI上下文中運行一個應用程序,該應用程序來自登錄上下文中運行的守護程序?

我正在使用C++,Carbon & Cocoa。

回答

0

使用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)。 我試圖說 - 不使用啓動代理將導致你的屁股不斷痛苦,沒有別的。經過十多次這樣的事情後,我們開始轉向發射代理,現在很高興:)

+0

您可以評論您做了什麼以完全切換到啓動代理?因爲我使用的是我想在安裝後啓動的啓動代理程序,但安裝(特別是postflight腳本)以root用戶身份運行。按照您的說法,bsexec角度用於啓動啓動代理,但不在Lion中。如何讓您的啓動代理首先作爲登錄的每個用戶進行啓動? – devguydavid 2011-07-21 04:31:52

+0

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

+0

但是如果你想在Lion上有問題展示一些用戶界面。我們還沒有解決。 – 2011-08-05 17:34:19