从launchd中删除进程而不重新启动

我有一台机器,我不希望发现者运行,所以最初我使它无法执行:

sudo chmod -R ax /System/Library/CoreServices/Finder.app 

但是后来意识到launchd仍然在试图每秒多次发现finder,导致巨大的日志文件包含数百万行:

 com.apple.launchd.peruser.502[109] (com.apple.Finder[93799]) <Error>: posix_spawn("/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder", ...): Permission denied com.apple.launchd.peruser.502[109] (com.apple.Finder[93799]) <Warning>: Exited with exit code: 1 

所以我编辑/System/Library/LaunchAgents/com.apple.Finder.plist这样它就不会启动了。 我现在的问题是迫使launchd重新加载plist,因此停止尝试发现finder。 但是,我无法重新启动机器。

我已经尝试使用launchctl来删除和卸载进程,但似乎不工作:

 $ sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Finder.plist launchctl: Error unloading: com.apple.Finder $ sudo launchctl remove com.apple.Finder launchctl remove error: No such process 

无论如何,我可以停止启动不断尝试加载取景器,而无需重新启动机器?

Finder是一个LaunchAgent,而不是一个LaunchDaemon,这意味着它被加载为login会话的一部分。 要么使用launchctl unload而不使用sudo ,要么退出并重新login。

您的日志显示Finder正在为用户502运行,但是您正在使用sudo运行launchctl ,并且root没有运行Finder。 尝试launchctl unload没有sudo

正如Gordon所说,您需要在用户的相同mach引导程序环境中执行您的launchctl unload ...命令。 launchctl本身有一个工具可以通过bsexec来做到这一点,你只需要提供一个在该用户上下文中运行的任何进程的PID,Finder就不会运行,所以select一个不同的进程。 用户相关的根进程是loginwindow console ,所以这是最有意义的:

 USERNAME=yourusername;export USERNAME; sudo launchctl bsexec "$(ps auxww | grep loginwindow\ console | grep "$USERNAME" | grep -v grep | awk '{print $2}')" sudo -u "$USERNAME" launchctl unload -wF /System/Library/LaunchAgents/com.apple.Finder.plist 

用你正在影响的用户名replaceyourusername ,瞧。

系统
Mac OS X,版本:10.6.8(Snow Leopard)

任务
我想禁止,主要是最初的自动启动,但也可以自动重新启动Finder(作为一个“简单的”解密encryption磁盘的解决scheme)之前Finder会尝试(和失败)加载(并在该过程丢弃)旧的(preferences'd)列表的以前打开的位置..

可靠性
我很less重新启动我的电脑(并没有太多与Finder崩溃),所以
我很多次都没有看到这个configuration的效果(感觉更像是一个黑客)。

我现在也看到,我还没有支持我原来的,所以我不能看到我做了什么改变。

程序
无论如何,通过在Finder的launchctl (1)/ launchd (8)属性列表launchctl <key>KeepAlive</key>设置为<false/> ,似乎删除了重新启动
但是,设置<key>RunAtLoad</key> (再次, <false/> )似乎没有效果(在Finder上,因为它可能启动〜硬编码)。

在一个侧面说明,我可以说创build一个LaunchAgent – for /与任何其他常规应用程序 – 与<key>RunAtLoad</key>设置为<true/>如果你像我一样,有一个应用程序(共享 -服务)经常崩溃。


参考

  • 文件:///System/Library/LaunchAgents/com.apple.Finder.plist
  • 我正在寻找的财产清单指令清单我发现引用(适当的)作为
    苹果公司关于这个问题的技术说明#2083 (2011-12-28:“最后更新:2007-11-05”)上的launchd.plist (5)手册页

还有一点实用
如果我可以为这些LaunchAgents / LaunchDaemons推荐一个graphics应用程序来configuration我想推广的任务​​(没有任何从属关系,除了发展中国籍) Lingon (注意不同的(Snow)Leopard和Lion版本)。


最后
对于这个相当微不足道的问题,很抱歉。
希望在10.7 Lion版本中,大部分情况也是如此。 虽然Finder的行为可能会更好(不知何故,build议不要总是丢弃不可实现的位置),符合“恢复”狮子function以及“自动保存”。
现在我只是还有一个小的mac(文件大小)在unix.stackexchange注释)。

一些评论中给出的错误信息:

 Bug: launchctl.c:2325 (23930):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1 

显示launchctl正试图打开文件并失败。 这可能是由于权限,但这似乎不太可能,因为使用sudo -u 。 与O_EXLOCK标志相关的O_EXLOCK 。 在开始工作时可能会launchdlocking数据库,可能是检查作业是否被禁用,并且会频繁地重试作业,以致大部分时间数据库文件被locking。

运行一个不断尝试卸载作业的循环应该在launchd没有locking文件时最终进入:

 for ((i = 0; i < 100; i++)) do echo -n "$i " launchctl unload ... && break done 

我知道从ssh卸载工作通常是可行的,因为我已经做了很多次了,所以我认为这个问题一定是由于失败/重载周期的频率所致。

我得到了你想要做的,但你完全错误地做了这件事。

使用家长控制设置受限制的帐户。 将其设置为使用简单查找器