无法杀死睡眠进程

del*_*del 15 linux centos kill process

我似乎无法杀死 -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
Run Code Online (Sandbox Code Playgroud)

这怎么可能?有没有办法在不重新启动的情况下终止进程?

BOUNTY:我真的对解释这种情况是如何发生的更感兴趣。

更新:这是 lsof 的输出:

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

har*_*ymc 20

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

你不能“唤醒它”——它只会在它等待的数据/资源可用时继续。这都是正常的,也是意料之中的,只有在试图杀死它时才会出现问题。

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

来自维基百科

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

被系统调用阻塞的进程处于不可中断的睡眠状态,正如它的名字所说,即使被 root 也确实是不可中断的。

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

  • 有趣的。你有这方面的参考吗?我在谷歌上能找到的一切似乎都在说可中断的进程不应该忽略 SIGKILL。 (3认同)
  • 我认为只有不间断的睡眠进程才能阻止 SIGKILL。可中断的睡眠过程也可以吗?如果是,它们之间有什么区别? (2认同)

slm*_*slm 10

休眠进程的背景

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

特别是这个答案,https://unix.stackexchange.com/a/5648/7453

摘自那个帖子

kill -9 (SIGKILL) 始终有效,前提是您有权终止该进程。基本上,该进程必须由您启动,而不是 setuid 或 setgid,或者您必须是 root。有一个例外:即使是 root 也不能​​向 PID 1(init 进程)发送致命信号。

但是 kill -9 不能保证立即起作用。所有信号,包括 SIGKILL,都是异步传递的:内核可能需要一些时间来传递它们。通常,传递一个信号最多需要几微秒,只是目标获得时间片所需的时间。但是,如果目标阻止了信号,则信号将排队等待,直到目标解除阻止为止。

通常,进程不能阻塞 SIGKILL。但是内核代码可以,并且进程在调用系统调用时会执行内核代码。内核代码在中断系统调用时会阻塞所有信号,这将导致内核中某处的数据结构格式错误,或者更常见的是违反某些内核不变量。因此,如果(由于错误或错误设计)系统调用无限期阻塞,则可能实际上无法终止该进程。(但是如果进程完成了系统调用,它就会被终止。)

...

...

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

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

这里有两件事可以尝试。

1. 删除 yum 的 .pid 文件

是否存在 yum 锁定文件?当您删除该锁定文件时会发生什么?我认为这可能允许它继续进行。

rm /var/run/yum.pid
Run Code Online (Sandbox Code Playgroud)

2. 强制CLOSE_WAIT关闭任何挂起的TCP 连接

ACLOSE_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
Run Code Online (Sandbox Code Playgroud)

使用 Killcx

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

# killcx remote-ip-address:port
% killcx 120.121.122.123:1234
Run Code Online (Sandbox Code Playgroud)

资源


ter*_*don 2

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

ps xjf -C yum
Run Code Online (Sandbox Code Playgroud)

然后是kill -9任何父进程。