无法杀死一个睡眠过程


13

我似乎无法杀死-9处于可中断睡眠(S)状态的进程:

[root@jupiter ~]# ps -elf | grep yum
4 S root     16790     1  0  75   0 - 73779 -      Jan15 ?        00:00:04 /usr/bin/python /usr/bin/yum -y install python-pip
[root@jupiter ~]# kill -9 16790
[root@jupiter ~]# ps -elf | grep yum
4 S root     16790     1  0  75   0 - 73779 -      Jan15 ?        00:00:04 /usr/bin/python /usr/bin/yum -y install python-pip

这怎么可能?有什么方法可以在不重新启动的情况下终止该进程?

赏金:我对解释这种情况如何发生的真正兴趣更大。

更新:这是lsof的输出:

[root @ jupiter〜]#lsof -p 16790
命令PID用户FD类型设备尺寸/关闭节点名称
百胜16790 root cwd DIR 1166,56842 4096 16886249 / home / del
百胜16790根rtd DIR 253,0 4096 2 /
yum 16790 root txt REG 253,0 8304 336177337 / usr / bin / python
百胜16790 root mem REG 253,0 144776 346128569 /lib64/ld-2.5.so
百胜16790 root mem REG 253,0 1718232 346128573 /lib64/libc-2.5.so
百胜16790 root mem REG 253,0 23360 346128599 /lib64/libdl-2.5.so
百胜16790 root mem REG 253,0 145872 346128584 /lib64/libpthread-2.5.so
yum 16790 root mem REG 253,0 615136 346128602 /lib64/libm-2.5.so
yum 16790 root mem REG 253,0 1244792 336171087 /usr/lib64/libpython2.4.so.1.0
yum 16790 root mem REG 253,0 95464 346128744 /lib64/libselinux.so.1
百胜16790 root mem REG 253,0 53448 346128750 /lib64/librt-2.5.so
yum 16790 root mem REG 253,0 13960 336187564 /usr/lib64/libplds4.so
百胜16790 root mem REG 253,0 58400 346128752 /lib64/libgcc_s-4.1.2-20080825.so.1
yum 16790 root mem REG 253,0 78384 336173796 /usr/lib64/libelf-0.137.so
yum 16790 root mem REG 253,0 1139672 336187570 /usr/lib64/librpmdb-4.4.so
yum 16790 root mem REG 253,0 407792 336187568 /usr/lib64/librpmio-4.4.so
百胜16790 root mem REG 253,0 233144 336171420 /usr/lib64/libnspr4.so
yum 16790 root mem REG 253,0 375656 336187569 /usr/lib64/libsqlite3.so.0.8.6
yum 16790 root mem REG 253,0 17992 336187563 /usr/lib64/libplc4.so
yum 16790 root mem REG 253,0 386784 336187571 /usr/lib64/librpm-4.4.so
yum 16790 root mem REG 253,0 154776 336170228 /usr/lib64/librpmbuild-4.4.so
百胜16790 root mem REG 253,0 647608 346128759 /lib64/libglib-2.0.so.0.1200.3
yum 16790 root mem REG 253,0 1297136 336176959 /usr/lib64/libxml2.so.2.6.26
百胜16790 root mem REG 253,0 15584 346128756 /lib64/libtermcap.so.2.0.8
yum 16790 root mem REG 253,0 1234328 336187566 /usr/lib64/libnss3.so
百胜16790 root mem REG 253,0 18152 346128670 /lib64/libutil-2.5.so
yum 16790 root mem REG 253,0 34240 336177071 /usr/lib64/libpopt.so.0.0.0
yum 16790 root mem REG 253,0 67792 336187567 /usr/lib64/libbz2.so.1.0.3
yum 16790 root mem REG 253,0 143144 346128763 /lib64/libexpat.so.0.5.0
yum 16790 root mem REG 253,0 56434416 336184082 / usr / lib / locale / locale-archive
yum 16790 root mem REG 253,0 132656 336560181 /usr/lib64/python2.4/site-packages/rpm/_rpmmodule.so
百胜16790 root mem REG 253,0 154016 336187565 /usr/lib64/libnssutil3.so
yum 16790 root mem REG 253,0 96885 345638632 /usr/local/greenplum-loaders-3.3.0.0-build-3/lib/libz.so.1.2.3
yum 16790 root mem REG 253,0 247496 346128741 /lib64/libsepol.so.1
百胜16790 root mem REG 253,0 369144 336168883 /usr/lib64/libsoftokn3.so
yum 16790 root mem REG 253,0 312336 336178453 /usr/lib64/libfreebl3.so
yum 16790 root mem REG 253,0 20240 336530067 /usr/lib64/python2.4/lib-dynload/timemodule.so
yum 16790 root mem REG 253,0 25048 336529953 /usr/lib64/python2.4/lib-dynload/stropmodule.so
yum 16790 root mem REG 253,0 18984 336530051 /usr/lib64/python2.4/lib-dynload/cStringIO.so
yum 16790 root mem REG 253,0 21816 336529943 /usr/lib64/python2.4/lib-dynload/collectionsmodule.so
百胜16790 root mem REG 253,0 52152 336530044 /usr/lib64/python2.4/lib-dynload/_socketmodule.so
yum 16790 root mem REG 253,0 17200 336530045 /usr/lib64/python2.4/lib-dynload/_ssl.so
yum 16790 root mem REG 253,0 315080 346128749 /lib64/libssl.so.0.9.8e
yum 16790 root mem REG 253,0 1366912 346128748 /lib64/libcrypto.so.0.9.8e
yum 16790 root mem REG 253,0 190976 336187552 /usr/lib64/libgssapi_krb5.so.2.2
yum 16790 root mem REG 253,0 613928 336184245 /usr/lib64/libkrb5.so.3.3
yum 16790 root mem REG 253,0 11760 346128747 /lib64/libcom_err.so.2.1
yum 16790 root mem REG 253,0 153720 336181723 /usr/lib64/libk5crypto.so.3.1
百胜16790 root mem REG 253,0 35984 336177832 /usr/lib64/libkrb5support.so.0.1
百胜16790 root mem REG 253,0 9472 346128681 /lib64/libkeyutils-1.2.so
百胜16790 root mem REG 253,0 92816 346128730 /lib64/libresolv-2.5.so
百胜16790 root mem REG 253,0 75384 336530050 /usr/lib64/python2.4/lib-dynload/cPickle.so
yum 16790 root mem REG 253,0 23736 336530064 /usr/lib64/python2.4/lib-dynload/structmodule.so
百胜16790 root mem REG 253,0 27336 336528958 /usr/lib64/python2.4/lib-dynload/operator.so
yum 16790 root mem REG 253,0 21520 336529958 /usr/lib64/python2.4/lib-dynload/zlibmodule.so
百胜16790 root mem REG 253,0 37944 336528952 /usr/lib64/python2.4/lib-dynload/itertoolsmodule.so
yum 16790 root mem REG 253,0 21528 336528929 /usr/lib64/python2.4/lib-dynload/_localemodule.so
百胜16790 root mem REG 253,0 21208 336529939 /usr/lib64/python2.4/lib-dynload/binascii.so
yum 16790 root mem REG 253,0 12080 336530062 /usr/lib64/python2.4/lib-dynload/shamodule.so
yum 16790 root mem REG 253,0 13168 336530058 /usr/lib64/python2.4/lib-dynload/md5module.so
yum 16790 root mem REG 253,0 18000 336529947 /usr/lib64/python2.4/lib-dynload/mathmodule.so
yum 16790 root mem REG 253,0 12504 336529934 /usr/lib64/python2.4/lib-dynload/_randommodule.so
yum 16790 root mem REG 253,0 15320 336528948 /usr/lib64/python2.4/lib-dynload/fcntlmodule.so
yum 16790 root mem REG 253,0 32816 336530049 /usr/lib64/python2.4/lib-dynload/bz2.so
yum 16790 root mem REG 253,0 8608 336529946 /usr/lib64/python2.4/lib-dynload/grpmodule.so
yum 16790 root mem REG 253,0 38696 336529819 /usr/lib64/python2.4/site-packages/cElementTree.so
百胜16790 root mem REG 253,0 42672 336530047 /usr/lib64/python2.4/lib-dynload/arraymodule.so
yum 16790 root mem REG 253,0 9368 336528915 /usr/lib64/python2.4/lib-dynload/_bisect.so
yum 16790 root mem REG 253,0 74992 336529944 /usr/lib64/python2.4/lib-dynload/datetime.so
yum 16790 root mem REG 253,0 372912 336560510 /usr/lib64/python2.4/site-packages/M2Crypto/__m2crypto.so
百胜16790 root mem REG 253,0 7120 336529937 /usr/lib64/python2.4/lib-dynload/_weakref.so
yum 16790 root mem REG 253,0 17496 336528966 /usr/lib64/python2.4/lib-dynload/selectmodule.so
百胜16790 root mem REG 253,0 46448 336528961 /usr/lib64/python2.4/lib-dynload/pyexpat.so
yum 16790 root mem REG 253,0 33896 336529820 /usr/lib64/python2.4/site-packages/_sqlite.so
yum 16790 root mem REG 253,0 41784 336530075 /usr/lib64/python2.4/site-packages/_sqlitecache.so
百胜16790 root mem REG 253,0 25104 336530066 /usr/lib64/python2.4/lib-dynload/termios.so
yum 16790 root mem REG 253,0 7280 336530065 /usr/lib64/python2.4/lib-dynload/syslog.so
yum 16790 root mem REG 253,0 25464 336265457 /usr/lib64/gconv/gconv-modules.cache
yum 16790 root mem REG 253,0 66544 336528926 /usr/lib64/python2.4/lib-dynload/_cursesmodule.so
yum 16790 root mem REG 253,0 380336 336181932 /usr/lib64/libncurses.so.5.5
yum 16790 root mem REG 253,0 405880 336529957 /usr/lib64/python2.4/lib-dynload/unicodedata.so
yum 16790 root mem REG 253,0 24576 236520047 /var/lib/rpm/__db.001
百胜16790 root mem REG 253,0 53880 346128424 /lib64/libnss_files-2.5.so
百胜16790 root mem REG 253,0 23736 346128408 /lib64/libnss_dns-2.5.so
yum 16790 root mem REG 253,0 1318912 236520050 /var/lib/rpm/__db.002
yum 16790 root mem REG 253,0 663552 236520051 /var/lib/rpm/__db.003
yum 16790 root mem REG 253,0 769074 336174965 /usr/share/locale/en_US/LC_MESSAGES/redhat-dist.mo
yum 16790 root 0u CHR 136,8 0t0 10 / dev / pts / 8(已删除)
yum 16790根1u CHR 136,8 0t0 10 / dev / pts / 8(已删除)
百胜16790根2u CHR 136,8 0t0 10 / dev / pts / 8(已删除)
百胜16790根3u Unix 0xffff8104388d2e40 0t0 4675113套接字
yum 16790根4w REG 253,0 0 236522326 /var/log/yum.log
yum 16790根5u REG 253,0 605184 236520025 /var/cache/yum/WANdisco-dev/primary.xml.gz.sqlite
yum 16790根6u REG 253,0 20480 236524002 /var/cache/yum/addons/primary.sqlite.old.tmp(已删除)
yum 16790根7u REG 253,0 12578816 236519970 /var/cache/yum/base/primary.xml.gz.sqlite.old.tmp(已删除)
yum 16790根8u REG 253,0 17972224 236523993 /var/cache/yum/epel/317109b44f1b0b40d910dc60c9080e62c7f4b16a-primary.sqlite.old.tmp(已删除)
yum 16790根9u REG 253,0 967680 236524055 /var/cache/yum/extras/primary.sqlite.old.tmp(已删除)
yum 16790根10u REG 253,0 459776 246415366 /var/cache/yum/pgdg92/primary.sqlite.old.tmp(已删除)
yum 16790根11u REG 253,0 4927488 236524060 /var/cache/yum/updates/primary.sqlite.old.tmp(已删除)
百胜16790根12r REG 253,0 65204224 236519434 / var / lib / rpm / Packages
百胜16790根13r REG 253,0 45056 236519438 / var / lib / rpm /名称
百胜16790根14u IPv4 4675317 0t0 TCP jupiter.example.com:33597->riksun.riken.go.jp:http(已建立)
yum 16790根15u IPv4 4675939 0t0 TCP jupiter.example.com:52708->freedom.itsc.cuhk.edu.hk:http(CLOSE_WAIT)
百胜16790根16r REG 253,0 65204224 236519434 / var / lib / rpm / Packages
百胜16790根17r REG 253,0 45056 236519438 / var / lib / rpm /名称
百胜16790根18r REG 253,0 12288 236519440 / var / lib / rpm / Pubkeys
百胜16790根20r FIFO 0,6 0t0 4676024管道
百胜16790根24w FIFO 0,6 0t0 4676024管道

杀死其他操作相同锁的进程,可能会造成阻塞。
David Schwartz 2013年

@David-我无法杀死上面进程列表中的任何yum进程;他们都有同样的问题。
德尔

我删除了多余的行,因为它们没有添加任何更多信息,并且使您的帖子阅读更加困难。
terdon 2013年

@slm-lsof显示riksun.riken.go.jp:80(已建立)和Liberty.itsc.cuhk.edu.hk:80(CLOSE_WAIT)的TCP套接字。我想那可能是吗?
德尔

@slm-请参阅我更新的问题。
删除

Answers:


18

处于S或D状态的进程通常处于阻塞的系统调用中,例如读取或写入文件或网络,等待被调用的程序完成或等待信号量或其他同步原语。等待时它将进入睡眠状态。

您无法“唤醒”-它只会在等待的数据/资源可用时继续进行。这都是正常现象,是正常现象,只是试图杀死它时的一个问题。

您可以尝试使用strace -p pid来找出进程pid当前正在发生哪个系统调用。

来自维基百科

不间断的睡眠状态是不会立即处理信号的睡眠状态。它仅在等待的资源可用或在等待期间发生超时(如果在进入睡眠状态时指定)后才唤醒。它通常由等待磁盘或网络IO(输入/输出)的设备驱动程序使用。当进程不间断地休眠时,当进程从系统调用或陷阱返回时,将注意到休眠期间累积的信号。

顾名思义,系统调用中阻塞的进程处于不间断的睡眠状态,即使通过root用户也是如此。

通常,进程无法阻止SIGKILL。但是内核代码可以并且进程在调用系统调用时执行内核代码,在此期间内核代码会阻塞所有信号。因此,如果系统调用无限期地阻塞,则可能实际上没有办法终止该进程。仅当进程完成系统调用时,SIGKILL才会生效。


2
我认为只有不间断的睡眠过程才能阻止SIGKILL。中断睡眠过程也能够做到吗?如果是这样,它们之间有什么区别?
2013年

1
实际上,S状态和D状态都是不可中断的,这仅仅是因为太复杂而无法在内核中进行编程,并且因为过去它们的持续时间很短。尽管内核已发展为包括NFS以及可能需要更长时间的其他情况,但不幸的是,内核阻塞等待从未取消。
harrymc

3
有趣。您对此有任何参考吗?我可以在Google上找到的所有内容似乎都表明可中断的进程不应忽略SIGKILL。
2013年

1
这似乎与我所读到的有关可中断睡眠的所有内容相矛盾,并且我有点怀疑我偶然发现了一些无证的行为。例如,检查以下2个链接。我误会了吗?(1)“在可中断的睡眠中,该过程可能会被唤醒以处理信号。” (2)“如果在这种状态下为过程生成信号,则操作会中断,并且通过传递信号将过程唤醒。”
2013年

1
系统调用是否可中断,仅取决于其编程方式。一旦进入内核,一切都会进行。
harrymc

10

睡眠过程的背景

您可能想看一下这篇Unix&Linux帖子。

具体来说,这个答案是/unix//a/5648/7453

该帖子的节选

如果您具有杀死该进程的权限,则kill -9(SIGKILL)始终有效。基本上,该过程必须由您启动而不是setuid或setgid,或者您必须是root用户。有一个例外:即使root也无法向PID 1发送致命信号(初始化过程)。

但是,kill -9不能保证立即起作用。包括SIGKILL在内的所有信号都是异步传递的:内核可能会花一些时间来传递它们。通常,传递信号最多需要几微秒的时间,这恰好是目标获得时间片的时间。但是,如果目标已阻止该信号,则该信号将排队,直到目标将其取消阻止为止。

通常,进程无法阻止SIGKILL。但是内核代码可以并且进程在调用系统调用时执行内核代码。当中断系统调用时,内核代码会阻塞所有信号,从而导致内核中某个地方的数据结构格式错误,或更普遍地,某些内核不变式会受到侵犯。因此,如果(由于错误或错误设计)系统调用无限期地阻塞,则可能实际上没有办法终止该过程。(但是,如果该进程完成了系统调用,它将被杀死。)

...

...

我强烈建议阅读其余的答案!

杀死被资源(文件或网络)阻止的进程

这里有2种方法可以尝试。

1.删​​除yum的.pid文件

是否存在yum锁定文件?删除该锁定文件会怎样?我认为这可能会使其继续进行。

rm /var/run/yum.pid

2.强制CLOSE_WAIT关闭所有挂起的TCP连接

A CLOSE_WAIT描述如下:

CLOSE_WAIT表示服务器已从客户端收到第一个FIN信号,并且连接正在关闭中

因此,这实质上意味着他的状态是套接字正在等待应用程序执行close()

套接字可以无限期处于CLOSE_WAIT状态,直到应用程序将其关闭为止。错误的情况就像文件描述符泄漏,服务器未在套接字上执行close()导致堆积close_wait套接字

注意:摘录自technet网站

您可以尝试使用2种工具来完成此任务。

这些工具通过模拟完全关闭TCP连接所需的FIN-ACK-RST交换来工作。

Killcx通过使用伪造的SeqNum创建虚假的SYN数据包,欺骗远程客户端IP /端口并将其发送到服务器来工作。它将派生一个子进程,该子进程将捕获服务器响应,从ACK数据包中提取2个魔术值,然后使用它们发送欺骗的RST数据包。然后将关闭连接。

注意:摘自Killcx网站

使用切纸器

切断给定的两个IP /端口号对之间的特定连接。

# cutter ip-address-1 port-1 ip-address-2 port-2
% cutter 200.1.2.3 22 10.10.0.45 32451

使用Killcx

切断与远程IP和端口的连接。

# killcx remote-ip-address:port
% killcx 120.121.122.123:1234

资源资源


删除锁定文件无效。
德尔

1
这是在生产机器上,不幸的是这两个工具具有我无法安装的依赖项。我确实尝试过/etc/init.d/networking restart,但是它什么也没做。实际上,我现在更想了解为什么会发生这种情况(因为我不认为可中断的睡眠进程能够忽略SIGKILL),而不是如何解决此问题。
删除

重新启动网络将具有相同的效果,因此,如果实际上正是进程在等待的内容,则对I / O的阻止将位于其他位置。
slm 2013年

1

您可以尝试杀死父进程。使用ps检查:

ps xjf -C yum

然后kill -9任何父进程。


父进程是init(输出中的第5列)。
2013年

1

可能值得使用strace附加到该进程,以查看它是否真正空闲或卡在IO操作上。也许可以为该问题提供进一步的线索。

strace -pPID

根据我所读的内容,除了重新启动之外,没有其他方法可以终止该过程。如果该过程没有消耗任何明显的cpu时间,则不太可能对服务器造成任何负面影响。


感谢您的建议,但是父进程是init(请参见输出中的第5列)。
2013年

重新修改后的答案,strace附加到该过程,但不输出任何内容。
2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.