我有一个wget
无法杀死的进程。这个问题是类似一个问过,但这里的D
中STAT
柱似乎表明,它是在uninterruptible sleep (usually IO)
,而在其他问题的过程中在状态R
。
$ ps -axuf | grep `id -un`
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
biogeek 2833351 0.0 0.0 0 0 ? D Apr12 0:03 [wget]
[...]
Run Code Online (Sandbox Code Playgroud)
试图杀死它不会产生任何输出
$ kill -9 2833351
Run Code Online (Sandbox Code Playgroud)
当我ps -axuf
再次运行 时,该wget
过程仍然存在。
如何找出导致此问题的软件/硬件故障?
由于进程收到了一个 SIGKILL,当它从当前的系统调用返回时它就会死亡。此外,一旦进程进入可以安全地中止系统调用的状态,内核就会让进程返回。D
如果内核内部发生异常情况,进程只会长时间处于不间断睡眠(状态)。有关不可终止进程的更多信息,请参阅如果“kill -9”不起作用怎么办?
调查进程正在做什么的一种方法是运行诊断工具,例如strace或dtrace或其他类似工具,具体取决于您的 unix 风格。这将告诉您进程正在进行什么系统调用以及使用什么参数。例如,您可能会看到如下内容:
strace -p2833351
strace: Process 2833351 attached
read(3,
Run Code Online (Sandbox Code Playgroud)
这告诉您进程当前正在从文件描述符 3 中读取。下一步是找出此文件描述符上的内容,例如使用lsof -p2833351
或ls -l /proc/2833351/fd/3
。这可能指向问题的根源,例如无响应的 NFS 服务器或错误的磁盘控制器使文件系统驱动程序处于意外状态。
您还可以在系统日志中找到线索。线索可能很难找到,因为这是不寻常的行为,可能是由非常不同的事物引起的,这些事物会有非常不同的迹象。它可能是与进程正在执行的操作直接相关的内核错误、损坏了某些内存的无关内核错误、损坏了某些内存的有缺陷的 RAM、有缺陷的外围设备(例如磁盘驱动器在应有的时候没有响应等)。