C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 在OS X中使用NSTask在特定用户下运行“launchctl”命令大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的应用程序是在root下启动的,我需要能够使用NSTask和launchctl卸载进程
这是我做的代码

NSPipe *pipe = [NSPipe pipe];

    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath: @"/bin/launchctl"];
    [task setCurrentDirectoryPath:@"/"];
    [task setStandardError:pipe];

    NSLog(@"/bin/launchctl unload %@",plistAutostartLOCATIOn);

    NSArray *arguments;
    arguments = [NSArray arrayWithObjects: enableCommand,plistAutostartLOCATIOn,nil];
    [task setArguments: arguments];

    NSFileHandle * read = [pipe fileHandleForReading];

    [task launch];
    [task waitUntilExit];

如果需要卸载的进程在“root”下启动,那么如果失败则成功卸载.
问题是如何在特定用户(例如“myusername”)下运行“launchctl”?

编辑:
在终端,如果我想在特定用户下运行一些命令,我​​接下来做的很好:

但是当我尝试在特定用户下运行“launchctl”时,它失败了:

它说:“没有发现任何东西加载”

解决方法

您的上一个命令失败与引导名称空间有关,您试图在错误的引导程序命名空间中加载代理程序.系统正在创建两个不同的引导名称空间,摘录自 Apple documentation

su命令不是在launchd使用的同一个bootsrap命名空间中启动的.

有两种方法可以运行您想要在正确的引导程序命名空间中运行的命令:

> 10.10及以上:使用launchctl asuser.这将运行由指定的< myusername>启动的任何命令.值得一提的是,您必须以root身份运行它,否则命令将失败.您的上一个命令应该像这样运行:

launchctl asuser <myusername> launchctl load "/Library/LaunchAgents/com.google.keystone.agent.plist"

> 10.10及以下(自10.11起,SIP阻止此方法):使用launchctl bsexec.这需要一个进程id来检索正确的命名空间,在该命名空间中运行另一个命令.此外,您必须手动更改命令的UID,如下所示:

launctl bsexec <pid> su -u <myusername> launchctl load "/Library/LaunchAgents/com.google.keystone.agent.plist"

大佬总结

以上是大佬教程为你收集整理的objective-c – 在OS X中使用NSTask在特定用户下运行“launchctl”命令全部内容,希望文章能够帮你解决objective-c – 在OS X中使用NSTask在特定用户下运行“launchctl”命令所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。