OS X Yosemite:在用户上下文中从launchDaemon启动launchAgent

时间:2015-04-22 06:56:11

标签: objective-c macos launchd

我有一个在安装应用程序后成功加载的launchdaemon。我希望launchdaemon在用户上下文中加载启动。如何在10.10实现?以下方式是否准确并获得Apple批准。

sudo launchctl bsexec "$PID" sudo -u "$USER" launchctl load /Library/LaunchAgents/pathto.plist

关注:

  1. 上述方式Apple是否获得批准?我希望它不会破坏操作系统升级吗?
  2. 同样为了确认,launchdaemon如何获取PID和USER的值。将从root上下文中的launchdaemon运行以下命令获取准确的登录用户:/ usr / bin / who | / usr / bin / awk' / console / {print $ 1; exit}'
  3. 任何帮助都会很明显。

1 个答案:

答案 0 :(得分:1)

这是我最常做的事情。我不确定这是否是Apple批准和接受​​的编码。

我使用下面给出的命令来记录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(与WindowServer相关的任何内容)出现问题。我在10.10中从未遇到过这种情况。