我需要能够启动/从根级守护停止在每个会话GUI代理。
类似的问题进行了讨论这里 , 这里和这里 。
我希望能够做的基本上是
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会话根。 如果我离开须藤过那里开始,我得到
task_for_pid() (os/kern) failure
Couldn't switch to new bootstrap port: (ipc/send) invalid port right
我试着瞎搞与各种bsexec的其他排列(包括bsexec调用次级脚本加载/卸载命令),但我永远不能获得实例开始作为根用户以外,从来没有在其他GUI会话什么。
我也试图与乱搞su - <user> ...
和sudo -u <user> ...
,但没有运气有两种(如很多人在上面链接的文章和其他地方的讨论)。
没有任何人有什么想法?
编辑:我试着用如Graham李以下建议的包装工具这样做,但我得到以下错误:
launch_msg(): Socket is not connected
这是命令行命令,包装和脚本我使用(501是用户标识和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