是否有办法在删除 plist 文件后禁用守护进程?

我试图永久禁用一个第三方守护进程,所以我从 /Library/LaunchDaemons 删除了它的 plist 文件-然后我意识到我之前没有对它执行 launchctl unload;事后尝试会显示“找不到该文件或目录/没有找到要卸载的内容”。当然,这个守护进程是可重新启动的,所以当我杀死它时,它会重新创建。 我尝试使用 launchctl list 以获取一个适用于 launchctl remove 的标签,但守护进程已经不再列出。 除了重新启动,是否有办法让 launchd 忘记这个守护进程和/或重新扫描配置文件?

文档不清楚,但是“launchctl kill com.example.product”似乎有效。 - Abhi Beckert
2个回答

要查看当前运行的所有守护进程,你需要输入以下命令:
sudo launchctl list
或者将它们排序,以便清晰地区分出com.apple的部分:
sudo launchctl list | sort

然后你可以将其移除,例如:

sudo launchctl remove com.sassafras.KeyAccess.daemon
重要提示:如果您不希望在机器重新启动时出现守护进程,请删除相关的plist文件。

嗯,我猜如果你不是root用户,它只会显示为该用户启动的守护进程? - jhfrontz
6这对我实际上没有用。重新启动后,这些条目会再次出现。 - Dmitry Minkovsky
4@dimadima 你删除了相关的plist文件吗?Dan提供的命令只操作当前状态(下一次启动时将重置为/Library/LaunchDaemons中的内容)。 - jhfrontz
@jhfrontz 是的,我现在已经学会了你必须这样做。谢谢。 - Dmitry Minkovsky
@jhfrontz 所以流程应该是先执行 launchctl unload,然后删除 .plist 文件,对吗? - JohnnyQ
@JohnnyQ -- 是的,我认为这是正确的顺序。看看bmike在这里说了什么:http://apple.stackexchange.com/a/37195/10389 - jhfrontz
在Mac OS X Server上,我发现在Server.app本身路径下有一个隐藏的LaunchDaemons目录,它会触发Xcode。因此,对于其他人来说,通过简单的命令:find / -name LaunchDaemons 2> /dev/null 可以列出所有.plist文件的可能位置...希望对你有所帮助... - Robert Swift
1如果有人需要帮助,实际上总是有多个独特的列表可用。目录中的所有用户都有自己的列表,尽管根用户和登录用户可能是最相关的。您可以使用sudo ps aux或其他您喜欢的方式查看具有进程的所有用户,然后使用sudo launchctl asuser [UniqueID] launchctl list来查看每个用户的列表。 - David Smith

今天遇到了同样的问题,即使在重新命名 plist 文件后,服务仍然继续运行于旧标签之下。该服务一直出现在 ps 列表和 sudo launchctl list 中。

解决此问题的命令是 bootout

sudo launchctl bootout system/<label-obtained-from-launchctl-list>
显然,如果服务不在 /Library/LaunchDaemons 中,则可以不用 sudo 和 system/ 前缀(似乎 system/ 是 launchd 术语中的一个 domain)。