无法终止休眠进程

无法终止休眠进程

我似乎无法杀死处于可中断睡眠(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 类型 设备大小/关闭节点名称
yum 16790 root cwd DIR 1166,56842 4096 16886249 /home/del
yum 16790 root rtd DIR 253,0 4096 2 /
yum 16790 root 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 根内存 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 root mem 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 root 3u unix 0xffff8104388d2e40 0t0 4675113 套接字
yum 16790 root 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-primary.sqlite.old.tmp (已删除)
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/软件包
yum 16790 root 13r REG 253,0 45056 236519438 /var/lib/rpm/名称
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/软件包
yum 16790 root 17r REG 253,0 45056 236519438 /var/lib/rpm/名称
yum 16790 root 18r REG 253,0 12288 236519440 /var/lib/rpm/Pubkeys
yum 16790 root 20r FIFO 0,6 0t0 4676024 管道
yum 16790 root 24w FIFO 0,6 0t0 4676024 管道

答案1

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

您无法“唤醒它”——只有当它等待的数据/资源可用时,它才会继续运行。这都是正常且预期的,只有在试图杀死它时才会出现问题。

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

维基百科

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

在系统调用中被阻塞的进程处于不可中断的睡眠状态,顾名思义,即使是 root 也无法中断。

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

答案2

睡眠过程的背景

您可能想看看这篇 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

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

ACLOSE_WAIT描述如下:

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

所以这本质上意味着他的套接字正在等待应用程序执行 close()

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

笔记:摘录自technet 网站

您可以尝试使用 2 种工具来实现此目的。

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

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

资源

答案3

您可以尝试终止父进程。使用 ps 检查:

ps xjf -C yum

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

答案4

是不是它在等待子进程?我喜欢它,ps faux因为它会告诉你是否有子进程,如果有,你可能需要终止哪个子进程。

相关内容