macos - 使用 GUI session 为所有用户启动/停止启动代理

标签 macos daemon agent launchd launchdagent

我需要能够从根级守护程序启动/停止每个 session 的 GUI 代理。

讨论类似问题here , herehere .

我想要做的基本上是

for num in `ps ax | grep [s]bin/launchd | cut -c 1-5`; 
do 
    if [ $num -ne 1 ]; 
    then 
        sudo launchctl bsexec $num launchctl (un)load -S Aqua /Library/LaunchAgents/com.mycompany.mydaemon.plist; 
    fi; 
done

但这只会启动/停止一个实例,并且它在当前 GUI session 中以 root 身份运行。如果我离开 sudo 那里开始我得到
task_for_pid() (os/kern) failure
Couldn't switch to new bootstrap port: (ipc/send) invalid port right

我试过弄乱 bsexec 的各种其他排列(包括使用加载/卸载命令从 bsexec 调用辅助脚本),但我永远无法让实例以 root 以外的任何其他方式启动,也永远不会在另一个 GUI session 中启动.

我也试过弄乱 su - <user> ...sudo -u <user> ... ,但也没有运气(正如许多人在上面链接的文章和其他地方所讨论的那样)。

有人有什么想法吗?

编辑:
我尝试使用以下 Graham Lee 建议的包装器工具执行此操作,但出现以下错误:
launch_msg(): Socket is not connected

这是我正在使用的命令行命令、包装器和脚本(501 是用户 ID,63093 是登录到系统的另一个用户的 launchd 的 pid):

命令行:
sudo launchctl bsexec 63093 /path/TestSetUIDAndExecuteTool 501 /path/LoadBillingDialogAgent

包装:
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  if (argc != 3) {
    NSLog(@"Tool called with improper arguments");
    return -1;
  }

  int uid = [[NSString stringWithUTF8String:argv[1]] intValue];
  // TODO: REMOVE
  NSLog(@"Setting uid to |%i|", uid);

  setuid(uid);
  // TODO: REMOVE
  char *command = (char *)argv[2];
  NSLog(@"Executing command |%s|", command);
  system(command);

  [pool drain];
  return 0;
}

脚本:
/bin/launchctl load -S Aqua /Library/LaunchAgents/com.company.agent.plist

最佳答案

使用 launchctl bsexec是正确的,但您需要启动一个包装工具,在运行“真实”代理可执行文件之前将 UID 发送给目标用户。哦,最好找 loginwindow进程,因为它们是登录 session 的领导者(尽管 launchd 也很可能起作用)。

关于macos - 使用 GUI session 为所有用户启动/停止启动代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1106638/

相关文章:

c# - 扩展 SNMP 代理 C#

java - 方法被拦截两次,即使它被调用一次

linux - 可执行文件中的相对路径

c++ - 如果我在 Mac 上使用 ofstream 写入文件,我的文件存储在哪里?

java - 如何询问 CompletableFuture 使用非守护线程?

docker - docker-desktop安装后在Windows 10中找不到daemon.json文件

objective-c - 从 Safari 显示 : Do you want to allow this page to open "(null)"? 启动的应用程序

cocoa - Mac应用程序中轻松切换 "View Controllers"(与iOS类似)

linux - 在 Linux 中将 Rexster 作为守护进程运行的脚本