如何防止一个进程自动重新启动?(具体来说,Sophos杀毒软件)

我需要根据我的VPN软件要求安装和运行Sophos防病毒软件。然而,当我不使用VPN时,我不希望它运行 - 我希望它完全关闭。 然而,直接结束任务是无效的:
ps -ax | grep -i soph
40972 ??         0:07.34 /Library/Sophos Anti-Virus/SophosAutoUpdate.app/Contents/MacOS/SophosAutoUpdate -d
41069 ??        28:08.48 /Library/Sophos Anti-Virus/InterCheck.app/Contents/MacOS/InterCheck -d
41078 ??         0:02.42 /Library/Sophos Anti-Virus/SophosAntiVirus.app/Contents/MacOS/SophosAntiVirus -d
$ sudo kill 40972 41069 41078 41084
$ ps -ax | grep -i soph
44344 ??         0:00.03 /Library/Sophos Anti-Virus/SophosAutoUpdate.app/Contents/MacOS/SophosAutoUpdate -d
44345 ??         0:00.02 /Library/Sophos Anti-Virus/SophosAntiVirus.app/Contents/MacOS/SophosAntiVirus -d
44347 ??         0:03.03 /Library/Sophos Anti-Virus/InterCheck.app/Contents/MacOS/InterCheck -d
它只是自动重新启动。我需要做什么来防止这种情况发生?

有可能Sophos软件中有一个偏好设置可以关闭它吗? - daviesgeek
据我所知,没有;如果有的话,那就是隐藏起来了。 - keflavich
5个回答

这意味着有另一个监控进程在重新启动它。 您可以查看父进程是谁:在活动监视器中选择该进程并使用“信息”按钮,或者通过终端使用ps -ax -O ppid(如果我没记错的话)。
  • 可能是Sophos的另一个具有隐形名称的进程,或者甚至是您的VPN软件。在这种情况下,您可以直接kill它们。

  • 另一种可能性是该进程由启动守护程序launchd保持活动状态。在这种情况下,您将在~/Library/LaunchAgents/Library/LaunchAgents(可能)或/System/Library/LaunchAgents(希望不是)中找到与您的防病毒软件相关的条目(plist XML文件)。

如果是第二种情况,您可以选择:

  • 编辑文件,并更改KeepAlive参数,要么删除它,要么更改它(你可以做一些巧妙的事情,详见文档)。

  • 只需请求launchd来为您停止。不幸的是,您不能只告诉launchtl stop,因为进程会重新启动。您需要使用sudo launchctl unload /path/to/the/plist file


谢谢Agos,那正是我在寻找的建议。然而,我找不到该死的东西!我找不到与(已终止的)Sophos反病毒程序相关联的任何带有数字的进程ID。在LaunchAgents目录中没有找到任何东西(虽然我只是在/System/中进行了简单的正则表达式检查)。是否有任何日志文件可以记录launchd重新启动一个进程?我检查了system.log和其他文件,但没有找到。 - keflavich
这个文件对我来说在这里 /Library/LaunchDaemons/com.sophos.common.servicemanager.plist - 你可以通过 mdfind -name Sophos 找到。移除保持运行参数即可解决问题。 - Dhruv Ghulati
不适用于/System/Library/LaunchDaemons中的进程 - OSX会显示错误信息"找不到指定的服务"。 - Adam

我想评论Agos的帖子,但我太新了无法这样做。所以:

据我记得,他们应该在/Library/LaunchAgents中有一个启动代理。我只是想让你执行ls /Library/LaunchAgentsls /Library/LaunchDaemonsls /System/Library/LaunchDaemons。一定会有东西出现。

此外,您可以打开/Applications并使用Show Package Contents检查Uninstall Sophos.app,然后查看卸载脚本。


1谢谢Ghost。Agos遗漏的目录是/Library/LaunchDaemons,其中有plist文件。我给你一个+1,但是答案还是由Agos提供,因为他大部分都搞定了。非常感谢你的帮助! - keflavich
确保你运行Spotlight来寻找在“卸载”之后留下的Sophos文件。使用mdfind -name Sophos命令。 - chiggsy
@chiggsy 为什么他要这样做?他不想卸载该应用程序,而是希望阻止它在每次被关闭后重新启动。 - GhostLyrics
就这样?他只想要这些吗? - chiggsy

man launchctl


launchctl list |grep -i 'sophos'
卸载一个守护进程以永久停用,但不将其卸载。
launchctl unload -w /full/path/to/file.plist

1这是“更好”的答案,因为它还将防止其永远加载(-w)。 - Dustin
Sophos隐藏。这在Sophos上不起作用。 - Ben

要找出是哪个launchd任务在重新生成进程,可以使用tail -f /var/log/system.log命令,并使用sudo kill -9 <pid>终止你感兴趣的进程。 突然间,launchd会告诉你具体是哪个任务负责此事:
com.apple.launchd[1] (com.sophos.managementagent[83911]): Exited: Killed: 9
你还可以尝试增加日志级别以精确确定发生了什么:launchctl log level debug 请记住,某些作业将以root身份运行,因此sudo launchctl list可能会显示一些在您的计算机上运行的额外作业。

您还可以通过实用的应用程序Lingon来控制Launch Agent和Daemons的运行时间和顺序,该应用程序可在Mac App Store和在线获取。