gpt4 book ai didi

macos - 当您的代码作为 LaunchDaemon 运行时,如何在不重新启动的情况下首次启动 LaunchAgent?

转载 作者:行者123 更新时间:2023-12-03 14:02:14 25 4
gpt4 key购买 nike

我有一个 LaunchDaemon。当它运行时,它会检查是否安装了 SIMBL。如果未安装 SIMBL,它会使用 NSTask 在 SIMBL.pkg 上运行/usr/sbin/installer。

SIMBL 的 postflight 脚本然后尝试运行 launchctl load 命令以立即启动 SIMBL 的 LaunchAgent:

sudo -u "$USER" -- /bin/launchctl load -F -S Aqua -D user "${LAUNCHD_PLIST}"

这失败了,因为我的 LaunchDaemon 的 NSTask 环境没有设置 $USER。

如果我的守护进程使用系统配置框架检测当前用户并使用 setEnvironment 将其传递给 NSTask,launchctl 就会出错:
Bug: launchctl.c:2325 (23930):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1

我意识到守护进程,根据定义,不应该在用户 session 中运行。出于同样的原因,Apple 似乎推荐 LaunchAgents 作为 LaunchDaemons 的帮助对象,以完成用户 session 工作。有没有办法让这样的代理立即启动并运行?

我将所有 .plist 放在正确的位置(它们在重新启动后开始运行,下次 launchctl 进行常规加载时)所以我的第一个想法是告诉 launchctl 重新加载。但是 all the code to do that is commented out in launchctl.c :
//  { "reload",         reload_cmd,             "Reload configuration files and/or directories" },

...
 * In later versions of launchd, I hope to load everything in the first pass,
* then do the Bonjour magic on the jobs that need it, and reload them, but for now,
* I haven't thought through the various complexities of reloading jobs, and therefore
* launchd doesn't have reload support right now.

最佳答案

哦怎么样launchd让我发狂....

切入正题,经过大量研究和实验,这就是我在 10.5+ 上的做法:

# If possible, tell launchd to start the LaunchAgent. This will fail on 10.4.
# $F[0] is the pid
# $F[1] is the username
# $F[2] is the first word of the command
ps -ww -A -opid,user,command | \
perl -nae 'if($F[2] =~ /\bloginwindow\b/) { system(
qq(launchctl bsexec $F[0] su $F[1] -c "launchctl load -w <your_plist>"))
}'

我发现无法直接在 10.4 上实现这一点。我在 10.4 上作弊,只是运行 LaunchAgent 会运行的东西,即使它有一个 GUI 并且你不应该能够这样做(无论如何你可以在 10.4-10.6 中;你不能在 10.7 中)。在 10.4 上,LaunchAgent 在下次重新启动后正常工作。

上面的代码寻找 loginwindow加工和使用 bsexec在这些上下文中运行命令。请记住,使用快速用户切换,可以有多个上下文。

一些有用的链接:
  • Daemons and Services Programming Guide .你必须阅读它,但它实际上不会回答任何困难的问题。但它至少会给你提示所有东西的位置。
  • TN2083 .这是一份令人发狂的文件,提出的问题和答案一样多,但对于任何进入 launchd 深渊的人来说,这是福音和必读的书。 .
  • Starting/stopping a launchd agent for all users with GUI sessions .这还有其他几个有用的链接和解释。

  • 海事组织, launchd是苹果有史以来最糟糕的“伟大创意”之一。这个想法非常有用,但 API 很糟糕。

    关于macos - 当您的代码作为 LaunchDaemon 运行时,如何在不重新启动的情况下首次启动 LaunchAgent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896274/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com