我有一个正在运行的守护进程,它下载安装程序(pkg)并使用install命令进行安装。安装程序将UI plist文件复制到/ Library/LaunchAgent中,因此UI可以在用户登录后启动。 但安装结束后,安装应该启动UI。由于osx窗口服务器架构,我知道UI不能从守护进程启动,守护进程无法直接启动任何UI进程。任何有关从OSX守护进程启动UI的工作
请问您能否提出任何解决办法,因此可以在不询问重新启动或注销的情况下启动UI?
问候, 阿南德Choubey
我有一个正在运行的守护进程,它下载安装程序(pkg)并使用install命令进行安装。安装程序将UI plist文件复制到/ Library/LaunchAgent中,因此UI可以在用户登录后启动。 但安装结束后,安装应该启动UI。由于osx窗口服务器架构,我知道UI不能从守护进程启动,守护进程无法直接启动任何UI进程。任何有关从OSX守护进程启动UI的工作
请问您能否提出任何解决办法,因此可以在不询问重新启动或注销的情况下启动UI?
问候, 阿南德Choubey
您正在寻找launchctl bsexec
,见man launchctl
和OS X技术说明上引导命名空间的更多信息。
选择一个已登录的用户,您希望为其执行操作;请注意,可能有几个或没有。当前控制台用户是拥有/dev/console
的用户;如果所有者UID为0(根),则没有人登录。
查找loginwindow
进程属于该用户的UID。
Exec /bin/launchctl bsexec PID_OF_THAT_LOGINWINDOW_PROCESS command args ...
执行命令,就好像它已经由用户自己运行一样。这允许启动GUI进程,执行launchctl setenv/start/load
等。不要忘记到目标用户UID的sudo
/setuid
。
如果需要启动一个LaunchAgent,你应该做的是与launchctl load
,而不是直接运行的代理,否则它不会出现在launchd
像它应该。
因此,有足够的时间来提供替代答案,但很难打败你的优秀答案。 +100,感谢您的信息! – DarkDust