Objective c OS X Yosemite:从用户上下文中的launchDaemon启动launchAgent

Objective c OS X Yosemite:从用户上下文中的launchDaemon启动launchAgent,objective-c,macos,launchd,Objective C,Macos,Launchd,我有一个launchdaemon,它在安装应用程序后成功加载。我希望launchdaemon在用户上下文中加载launchagent。如何在10.10上实现这一点?以下方法准确无误,并经苹果公司批准 sudo launchctl bsexec "$PID" sudo -u "$USER" launchctl load /Library/LaunchAgents/pathto.plist 关注事项: 以上是苹果批准的方式吗?我希望它不会因为操作系统升级而中断 同样为了确认,launchdaemo

我有一个launchdaemon,它在安装应用程序后成功加载。我希望launchdaemon在用户上下文中加载launchagent。如何在10.10上实现这一点?以下方法准确无误,并经苹果公司批准

sudo launchctl bsexec "$PID" sudo -u "$USER" launchctl load /Library/LaunchAgents/pathto.plist
关注事项:

  • 以上是苹果批准的方式吗?我希望它不会因为操作系统升级而中断
  • 同样为了确认,launchdaemon如何获取PID和用户的值。在根上下文中从launchdaemon运行以下命令是否会获取准确的登录用户:/usr/bin/who |/usr/bin/awk'/console/{print$1;exit}'

  • 任何帮助都是值得的。

    这是我主要做的事。我不确定这是否是苹果认可和接受的编码

    sudo launchctl bsexec "$PID" sudo -u "$USER" launchctl load /Library/LaunchAgents/pathto.plist
    
    我使用下面给出的命令获取登录的n用户名。如果有多个用户登录,它会给出活动用户的名称,我指的是活动控制台用户

    stat -f%Su /dev/console
    
    可以使用su-l从LaunchDaemon加载LaunchAgent。您只需要登录的用户名作为参数

        NSString *userName;
        NSTask *task = [[NSTask alloc]init];
        NSPipe *pipe = [NSPipe pipe];
    
        [task setLaunchPath:@"/usr/bin/stat"];
        [task setArguments:[NSArray arrayWithObjects:@"-f%Su", @"/dev/console", nil]];
        [task setStandardOutput:pipe];
        [task launch];
        [task waitUntilExit];
        userName = [[NSString alloc] initWithData:[[pipe fileHandleForReading] readDataToEndOfFile]
                                            encoding:NSUTF8StringEncoding];
    
    
        NSString *loggedInUserName = [userName stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
    
        NSString *loadScript = [NSString stringWithFormat: @"su -l %@ -c \"/bin/launchctl load /Library/LaunchAgents/com.abc.appname.plist\"", loggedInUserName];
        system([loadScript UTF8String]);
    

    一句警告的话。当我们在OS版本10.9及以下版本中将RunAtLoad设置为YES时,我发现这会导致LaunchAgent访问UI(与WindowsServer相关的任何内容)时出现问题。我在10.10中从未遇到过这个问题。

    谢谢你的回复。是否存在任何事件或机制,您可以利用这些事件或机制来了解用户是否已登录,因为启动时会自动加载LaunchDaemon。请查看-。