在 OS X 10.7 上强制收割 java 僵尸进程

Mec*_*zmo 5 mac java osx-lion crashplan

我在 MacBook Pro 上运行了 CrashPlan,但它有点失控。从本质上讲,它引起了一个叉子炸弹。幸运的是,我有一个打开的终端窗口并且能够运行这个命令:

sudo launchctl unload /Library/LaunchDaemons/com.crashplan.engine.plist
Run Code Online (Sandbox Code Playgroud)

所以不断的重新产卵已经停止。但是,我仍然有超过 900 个 Java 进程,除了将我推向最大进程数之外,它们什么也没做。我不想重启我的电脑,因为我有很多打开的代码文件、网页等。有没有一种简单的方法来强制系统收割这些僵尸?我会杀死父进程,但它们都是由 launchd 又名 PID 1 启动的。此时,最好重新启动。

我试过了:

sudo kill -9 <PID>
sudo kill -9 java
sudo killall -9 java    
Run Code Online (Sandbox Code Playgroud)

有没有办法一劳永逸地杀死僵尸而不必杀死launchd来做到这一点?还是我必须重新启动才能在这场僵尸启示录中幸存下来?

Mec*_*zmo 2

不幸的是,没有办法做到这一点。僵尸进程通常是良性的,因为它们的父进程最终会收获它们,并且它们不会消耗资源......但它们确实会增加系统允许的最大进程数(我认为这取决于计算机中安装的 RAM 量) ,但我在 Lion 中找不到这方面的文档)。JVM 实例由 launchd(Mac 上的 PID 1)拥有,并且没有安全的方法可以杀死 launchd 并使其重新启动,而不杀死所有 launchd 的子项。这将是减去内核的一切。

这可能适用于任何失控的 LaunchAgent;这些进程都将是 launchd 的子进程,这将带来与我遇到的相同问题。我不相信每段 Java 代码启动的每个 JVM 实例都是由 launchd 生成的,但碰巧 CrashPlan 使用 Java,所以我的系统里到处都是这些东西。

我想这里要吸取的教训是:不要分叉炸弹,并在手边保留一个终端窗口。重启清除了僵尸,所以一切都很好。