スリープ状態のプロセスを強制終了できません


13

割り込み可能なスリープ(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 root mem REG 253,0 144776 346128569 /lib64/ld-2.5.so
yum 16790 root mem REG 253,0 1718232 346128573 /lib64/libc-2.5.so
yum 16790 root mem REG 253,0 23360 346128599 /lib64/libdl-2.5.so
yum 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
yum 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
yum 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
yum 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
yum 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
yum 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
yum 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
yum 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
yum 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
yum 16790 root mem 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 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
yum 16790 root mem REG 253,0 35984 336177832 /usr/lib64/libkrb5support.so.0.1
yum 16790 root mem REG 253,0 9472 346128681 /lib64/libkeyutils-1.2.so
yum 16790 root mem REG 253,0 92816 346128730 /lib64/libresolv-2.5.so
yum 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
yum 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
yum 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
yum 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
yum 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
yum 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
yum 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
yum 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
yum 16790 root mem REG 253,0 53880 346128424 /lib64/libnss_files-2.5.so
yum 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 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 / 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(ESTABLISHED)
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 root 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パイプ

同じロックを操作する他のプロセスを強制終了すると、おそらくジャムが解除されます。
デビッドシュワルツ

@David-上記のプロセスリスト内のyumプロセスを強制終了できません。それらはすべて同じ問題を抱えています。
デル

余分な行を削除したのは、それ以上情報が追加されておらず、投稿を読みにくくしているためです。
テルドン

@slm-lsofはriksun.riken.go.jp:80(ESTABLISHED)およびfreedom.itsc.cuhk.edu.hk:80(CLOSE_WAIT)へのTCPソケットを表示します。それができると思いますか?
デル

@slm-最新の質問をご覧ください。
デル

回答:


18

SまたはD状態のプロセスは、通常、ファイルまたはネットワークへの読み取りまたは書き込み、呼び出されたプログラムの終了の待機、またはセマフォまたは他の同期プリミティブの待機など、ブロッキングシステムコールにあります。待機中にスリープ状態になります。

「起動」することはできません-待機しているデータ/リソースが利用可能になった場合にのみ続行します。これはすべて正常で予想されるものであり、強制終了しようとした場合にのみ問題になります。

strace -p pidプロセスpidで現在発生しているシステムコールを見つけるために使用できます。

ウィキペディアから:

割り込み不可能なスリープ状態は、信号をすぐには処理しないスリープ状態です。待機中のリソースが使用可能になった場合、またはその待機中にタイムアウトが発生した場合(スリープ状態に指定されている場合)にのみ起動します。ディスクまたはネットワークIO(入力/出力)を待機しているデバイスドライバーによって主に使用されます。プロセスが無停止でスリープしている場合、スリープ中に蓄積されたシグナルは、プロセスがシステムコールまたはトラップから戻ったときに通知されます。

システムコールでブロックされたプロセスは、その名前が示すように、rootでさえも実際に中断できない無停止のスリープ状態にあります。

通常、プロセスはSIGKILLをブロックできません。ただし、カーネルコードは、システムコールを呼び出すとカーネルコードを実行できます。その間、カーネルコードはすべての信号をブロックします。したがって、システムコールが無期限にブロックされると、プロセスを強制終了する方法が実質的になくなる可能性があります。SIGKILLは、プロセスがシステムコールを完了するたびに有効になります。


2
無停止のスリーププロセスだけがSIGKILLをブロックできると思った。割り込み可能なスリーププロセスも可能ですか?もしそうなら、それらの違いは何ですか?
デル

1
SとDの両方の状態は、カーネルでプログラムするには複雑すぎるため、かつては非常に短い期間であると考えられていたため、実質的に割り込み不可能です。カーネルは進化し、NFSなど、さらに時間がかかる可能性のある他のケースも含まれるようになりましたが、残念ながらカーネルブロッキング待機は廃止されませんでした。
ハリーマク

3
面白い。これに関する参考資料はありますか?Googleで見つけることができるすべてのことは、割り込み可能なプロセスがSIGKILLを無視することはできないと言っているようです。
デル

1
割り込み可能な睡眠について私が読んだことすべてに矛盾しているようで、文書化されていない行動につまずいたのは少し懐疑的です。たとえば、次の2つのリンクを確認します。私は何かを誤解していますか?(1)「割り込み可能なスリープでは、信号処理のためにプロセスが起動される可能性があります。」(2)「この状態のプロセスに対してシグナルが生成されると、操作が中断され、シグナルの配信によってプロセスがウェイクアップされます。」
デル

1
システムコールは割り込み可能であるか、プログラムされた方法だけに依存しません。1つがカーネル内に入ると、すべてが実行されます。
harrymc

10

スリーププロセスの背景

このUnix&Linuxの投稿をご覧ください。

具体的に、この答えは、/unix//a/5648/7453

その投稿からの抜粋

kill -9(SIGKILL)は、プロセスを強制終了する許可があれば常に機能します。基本的に、プロセスはsetuidまたはsetgidではなく、ユーザーが開始するか、rootでなければなりません。例外が1つあります。rootでさえ、PID 1(initプロセス)に致命的なシグナルを送信できません。

ただし、kill -9がすぐに機能するとは限りません。SIGKILLを含むすべての信号は非同期に配信されます。カーネルはそれらの配信に時間がかかる場合があります。通常、信号の配信には最大で数マイクロ秒かかり、ターゲットがタイムスライスを取得するのにかかる時間だけです。ただし、ターゲットがシグナルをブロックしている場合、ターゲットがブロックを解除するまでシグナルはキューに入れられます。

通常、プロセスはSIGKILLをブロックできません。しかし、カーネルコードは、システムコールを呼び出すときにカーネルコードを実行できます。カーネルコードは、システムコールを中断すると、カーネル内のどこかで、またはより一般的にはいくつかのカーネル不変式に違反する不正なデータ構造になる場合、すべての信号をブロックします。そのため、(バグや設計ミスのために)システムコールが無期限にブロックされた場合、プロセスを強制終了する方法は事実上ありません。(ただし、システムコールを完了すると、プロセスは強制終了されます。)

...

...

その答えの残りを読むことを強くお勧めします!

リソース(ファイルまたはネットワーク)によってブロックされているプロセスを強制終了する

試してみる2つのことを次に示します。

1. yumの.pidファイルを削除する

yumロックファイルが存在しますか?そのロックファイルを削除するとどうなりますか?私はそれが進むことを可能にするかもしれないと思います。

rm /var/run/yum.pid

2.ハングしているCLOSE_WAITTCP接続を強制的に閉じる

A CLOSE_WAITは次のように説明されます。

CLOSE_WAITサーバーがクライアントから最初のFIN信号を受信し、接続が閉じられようとしていることを示します

したがって、これは本質的に、彼がソケットがアプリケーションがclose()を実行するのを待っている状態であることを意味します

ソケットは、アプリケーションが閉じるまで無期限にCLOSE_WAIT状態になります。障害のあるシナリオは、ファイル記述子リークのようなものであり、サーバーがソケットでclose()を実行せず、close_waitソケットの蓄積につながります

注:technet Webサイトからの抜粋。

これを実現するために使用できる2つのツールがあります。

これらのツールは、TCP接続を完全に閉じるために必要なFIN-ACK-RST交換をシミュレートすることにより機能します。

Killcxは、偽のSeqNumを持つ偽のSYNパケットを作成し、リモートクライアントのIP /ポートを偽装してサーバーに送信することで機能します。サーバーの応答をキャプチャする子プロセスをフォークし、ACKパケットから2つのマジック値を抽出し、それらを使用してスプーフィングされたRSTパケットを送信します。その後、接続が閉じられます。

注:Killcx Webサイトからの抜粋。

カッターを使用する

指定された2つの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
これは実稼働マシン上にあり、残念ながらこれらの2つのツールには依存関係があり、インストールできません。/etc/init.d/networking restartを試しましたが、何もしませんでした。実際、私はこの問題を解決する方法よりも、なぜこれが発生するのか(割り込み可能なスリーププロセスがSIGKILLを無視できるとは思わなかったため)を理解することに興味があります。
デル

ネットワークを再起動しても同じ効果が得られるため、I / Oのブロックは、実際にプロセスが待機している場合は別の場所にあります。
slm

1

親プロセスを強制終了してみてください。psを使用して以下を確認します。

ps xjf -C yum

次にkill -9、親プロセス。


親プロセスはinit(出力の5列目)です。
デル

1

プロセスが本当にアイドル状態であるか、IO操作でスタックしているかどうかを確認するために、straceでプロセスにアタッチする価値があるかもしれません。おそらく問題のさらなる手がかりを提供するかもしれません。

strace -pPID

私が読んだことから、再起動する以外にこのプロセスを強制終了する方法はありません。プロセスが目立ったCPU時間を消費していない場合、サーバーに悪影響を与えることはほとんどありません。


提案に感謝しますが、親プロセスはinitです(出力の5列目を参照)。
デル

修正された回答を再度参照すると、straceはプロセスにアタッチしますが、何も出力しません。
デル

1

子プロセスを待機している可能性がありますか?ps faux子プロセスが存在するかどうか、また、それを殺す必要があるかもしれないかどうかを教えてくれるので、大好きです。


いいえ、このプロセスには子プロセスはありません。
デル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.