我有一个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]
[...]
尝试杀死它不会产生任何输出
$ kill -9 2833351
当我 ps -axuf
再次运行时,该wget
过程仍然存在。
如何找出导致此问题的软件/硬件故障?
答案1
由于进程已收到 SIGKILL,因此当它从当前系统调用返回时,它将死亡。此外,一旦进程进入可以安全中止系统调用的状态,内核就会让进程立即返回。如果内核内部发生异常情况,进程只会D
长时间保持不间断睡眠(状态)。有关不可终止进程的更多信息,请参阅如果“kill -9”不起作用怎么办?
研究进程正在做什么的一种方法是运行诊断工具,例如斯特雷斯或者跟踪或其他类似的工具,具体取决于您的 Unix 风格。这将告诉您该进程正在进行什么系统调用以及使用什么参数。例如,您可能会看到这样的内容:
strace -p2833351
strace: Process 2833351 attached
read(3,
这告诉您该进程当前正在从文件描述符 3 读取。下一步是找出该文件描述符上的内容,例如 withlsof -p2833351
或 with ls -l /proc/2833351/fd/3
。这可能指出问题的根源,例如无响应的 NFS 服务器或有缺陷的磁盘控制器导致文件系统驱动程序处于意外状态。
您还可以在系统日志中找到线索。线索可能很难找到,因为这是一种不寻常的行为,可能是由非常不同的事情引起的,而这些事情会有非常不同的迹象。它可能是与进程正在执行的操作直接相关的内核错误、损坏了某些内存的不相关的内核错误、损坏了某些内存的有缺陷的 RAM、有缺陷的外围设备(例如磁盘驱动器在应该响应时没有响应)等。
答案2
给定状态D
,您唯一的选择是等待阻塞的磁盘 I/O 操作wget
完成(成功或失败)、重新启动或忽略卡住的进程。您可以查看进程树以查找该wget
进程的父进程或子进程(如果有),或者查看该进程的/proc/PID/fd
数据以查看任何打开的文件句柄并戳出可能也保持这些文件句柄打开的任何进程。
答案3
尝试一下:sudo kill {pid_process}