代码之家  ›  专栏  ›  技术社区  ›  Thomi

在用户上下文中从后台程序启动代理

  •  4
  • Thomi  · 技术社区  · 14 年前

    我有一个在mac osx 10.6机器的登录上下文中运行的启动守护程序。我想从该代理为每个用户启动一个代理,并在用户的登录上下文中运行该代理。但是,我需要非常小心地控制代理应用程序的精确参数,这就是为什么我不能像对守护进程那样使用launchd代理。

    如何创建在登录用户上下文中运行的进程?我相信 seteuid setuid 调用,但这些调用不会更改代理应用程序的执行上下文。

    我知道这并不是苹果推荐的做法,但在这件事上我没有选择余地——守护程序应用程序的设计非常不灵活(它必须运行在许多不同的系统上)。是否有一种解决方法允许我从在登录上下文中运行的守护进程在登录用户的gui上下文中运行应用程序?

    我用的是C++,碳可可。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Community Lee Campbell    7 年前

    使用launchd代理。所有其他的方法都会让你的脑子里充满无用的细节和隐藏的诡计。总的来说,这是一项非常复杂的任务,有许多角落的情况下,是很难实现正确的。launchd代理可以让您集中精力完成任务并节省大量时间。

    最好的解决方案是重写代理以不使用命令行,而是连接到launchd守护进程并请求适当的选项/设置。

    如果不可能或很难,可以编写将在启动时连接到守护进程的包装器launchd代理,询问选项,然后使用正确的命令行启动原始代理。

    如果您认为实现“连接到守护进程”机制太难了…也许是这样,但它比从daemon在其他会话中启动代理要容易得多(当在不同的角落案例支持下实现时)。

    但是,如果你真的真的不管你想要什么肮脏的方式,你可以玩“launchctl bsexec”。一些有效的例子: Starting/stopping a launchd agent for all users with GUI sessions (它可以在会话上下文中启动任何可执行文件,而不是“launchctl load”)。

    一些最新消息。

    “play with 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,即使该行在另一个登录的用户acount或from service下执行。

    但我在狮子身上做了测试-没用。它只对我的豹子有效(10.5/10.6)。 我想说的是-不使用发射代理会让你屁股不停地痛。在经历了十几件这样的事情之后,我们完全转向了发射代理,现在很高兴:)