从命令行中删除持久的僵尸进程

4

我经常使用adb,但有时它会停止工作。

$ ps aux

user1  4175  0.0  0.0      0     0 ?        Zl   Feb27   0:03 [adb] <defunct>

这个僵尸进程阻止了adb工作,我无法在不重启计算机的情况下重新启动adb。我已经尝试发送命令“kill-server”,但这并没有解决问题。
kill 4175
kill -9 4175 
kill-17 4175 

但是没有什么可以消灭僵尸进程。

我怎样才能在不重启电脑的情况下重新启用adb?

此外,我正在使用:

Linux user1 2.6.32-38-generic #83-Ubuntu SMP Wed Jan 4 11:12:07 UTC 2012 x86_64 GNU/Linux

使用最新版本的ADB(1.0.29)可以降低僵尸进程发生的频率。 - Stu
使用最新版本($ adb version:Android Debug Bridge版本1.0.29),它仍然容易出现失效的情况。 - Zenexer
有关此事是否有更新?请记住,杀死父进程不是可行的选择,因为它是 init 进程。 - Zenexer
我们自从更新了ADB版本后,就再也没有遇到过这个问题了。 - Stu
2个回答

0

我也经常看到这个问题。这是由于程序退出时线程被卡在内核模式中引起的。你可以通过 ps mx 命令来查看:

# ps mx
  17188 ?        -      1:49 [adb] <defunct>
      - -        Zl     0:01 -
      - -        Dl     1:46 -

第二个线程的“D”状态表示该线程处于内核模式,无法被终止。您可以在此处阅读更多信息:

http://ntucsie2007.wikidot.com/linux-defunct-zombie-processes

很遗憾,我认为adb必须被更改以便能够干净地退出。


-1

唯一能消灭僵尸进程的kill命令是杀死其父进程,因为它将重新分配到init,然后继续清除它。

但当它是内核线程时,这并不是真正可能的...


@Neeraj:...杀死父进程。 - Ignacio Vazquez-Abrams
@Stu adb 不应该需要调试。即使它异常终止,操作系统也应该能够恢复。顺便说一下,我在最新版本的adb中遇到了这个问题。 - Zenexer
@Zenexer - 是的,但如果操作系统无法正确处理某种情况,调试应用程序可能比调试操作系统更容易(取决于您的技能水平)。潜在地,可以修改应用程序以以操作系统可以处理或解决该条件并自我恢复的方式退出。使用ADB 1.0.29,在过去3个月中我没有看到僵尸进程,因此我没有进一步研究这个问题。 - Stu
我认为这可能与USB资源未关闭有关。 - Zenexer
@IgnacioVazquez-Abrams 正确,init 没有清除僵尸进程,可能是因为 USB 资源仍然保持打开状态。 - Zenexer
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接