Ich kann einen Schlafprozess nicht beenden

13

Ich scheine nicht in der Lage zu sein, einen Prozess abzubrechen, der sich in einem unterbrechbaren Schlafzustand befindet:

[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

Wie ist das möglich? Gibt es eine Möglichkeit, den Prozess ohne Neustart abzubrechen?

BOUNTY: Mich interessiert vor allem eine Erklärung, wie dies möglich ist.

UPDATE: Dies ist die Ausgabe von lsof:

[root @ jupiter ~] # lsof -p 16790
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE / OFF NODE NAME
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 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
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 (gelöscht)
yum 16790 root 1u CHR 136,8 0t0 10 / dev / pts / 8 (gelöscht)
yum 16790 root 2u CHR 136,8 0t0 10 / dev / pts / 8 (gelöscht)
yum 16790 root 3u unix 0xffff8104388d2e40 0t0 4675113 socket
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 (gelöscht)
yum 16790 root 7u REG 253,0 12578816 236519970 /var/cache/yum/base/primary.xml.gz.sqlite.old.tmp (gelöscht)
yum 16790 root 8u REG 253,0 17972224 236523993 /var/cache/yum/epel/317109b44f1b0b40d910dc60c9080e62c7f4b16a-primary.sqlite.old.tmp (gelöscht)
yum 16790 root 9u REG 253,0 967680 236524055 /var/cache/yum/extras/primary.sqlite.old.tmp (gelöscht)
yum 16790 root 10u REG 253,0 459776 246415366 /var/cache/yum/pgdg92/primary.sqlite.old.tmp (gelöscht)
yum 16790 root 11u REG 253,0 4927488 236524060 /var/cache/yum/updates/primary.sqlite.old.tmp (gelöscht)
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 Wurzel 20r FIFO 0,6 0t0 4676024 Rohr
Yum 16790 Wurzel 24w FIFO 0,6 0t0 4676024 Rohr
del
quelle
Beenden Sie die anderen Prozesse, die dieselbe Sperre manipulieren, und die Blockierung wird wahrscheinlich aufgehoben.
David Schwartz
@ David - Ich kann keinen der yum-Prozesse in der obigen Prozessliste beenden. Sie haben alle das gleiche Problem.
Del
Ich habe die zusätzlichen Zeilen entfernt, weil sie keine weiteren Informationen hinzugefügt haben und das Lesen Ihres Beitrags erschwert hat.
Terdon
@slm - lsof zeigt TCP-Sockets für riksun.riken.go.jp:80 (ESTABLISHED) und freedom.itsc.cuhk.edu.hk:80 (CLOSE_WAIT) an. Ich denke das könnte es sein?
Del
@slm - Bitte sehen Sie meine aktualisierte Frage.
Del

Antworten:

18

Ein Prozess im S- oder D-Zustand befindet sich normalerweise in einem blockierenden Systemaufruf, z. B. Lesen oder Schreiben einer Datei oder eines Netzwerks, und wartet auf den Abschluss eines aufgerufenen Programms oder auf Semaphoren oder andere Synchronisationsprimitive. Während des Wartens wird es in den Schlafzustand versetzt.

Sie können es nicht "aufwecken" - es wird nur fortgesetzt, wenn die Daten / Ressourcen, auf die es wartet, verfügbar sind. Das ist alles normal und erwartet und nur ein Problem, wenn man versucht, es zu töten.

Sie können versuchen, strace -p pidmit herauszufinden, welcher Systemaufruf gerade für die Prozess-PID ausgeführt wird.

Aus Wikipedia :

Ein unterbrechungsfreier Schlafzustand ist ein Schlafzustand, der ein Signal nicht sofort verarbeitet. Es wird nur aktiviert, wenn eine Ressource verfügbar ist, auf die gewartet wurde, oder wenn während dieser Wartezeit eine Zeitüberschreitung auftritt (sofern dies beim Aktivieren des Ruhezustands angegeben wurde). Es wird hauptsächlich von Gerätetreibern verwendet, die auf Festplatten- oder Netzwerk-E / A (Eingabe / Ausgabe) warten. Wenn der Prozess unterbrechungsfrei in den Ruhezustand versetzt wird, werden die während des Ruhezustands akkumulierten Signale bemerkt, wenn der Prozess vom Systemaufruf oder Trap zurückkehrt.

Ein Prozess, der in einem Systemaufruf blockiert ist, befindet sich im unterbrechungsfreien Ruhezustand, der, wie der Name schon sagt, auch von root nicht unterbrochen werden kann.

Normalerweise können Prozesse SIGKILL nicht blockieren. Aber Kernel-Code kann und Prozesse können Kernel-Code ausführen, wenn sie Systemaufrufe aufrufen, währenddessen Kernel-Code alle Signale blockiert. Wenn also ein Systemaufruf auf unbestimmte Zeit blockiert wird, gibt es möglicherweise keine Möglichkeit, den Prozess zu beenden. Der SIGKILL wird erst wirksam, wenn der Prozess den Systemaufruf abgeschlossen hat.

Harrymc
quelle
2
Ich dachte, nur unterbrechungsfreie Schlafprozesse könnten SIGKILL blockieren. Können auch unterbrechbare Schlafprozesse? Wenn ja, was ist der Unterschied zwischen ihnen?
Del
1
Sowohl der S- als auch der D-Zustand sind praktisch unterbrechungsfrei, weil sie zu komplex sind, um im Kernel programmiert zu werden, und weil sie in der Vergangenheit nur von sehr kurzer Dauer sein sollten. Obwohl sich der Kernel dahingehend weiterentwickelt hat, dass er NFS und andere Fälle umfasst, die möglicherweise viel länger dauern, wurden die Wartezeiten für das Blockieren des Kernels leider nie aufgehoben.
Harrymc
3
Interessant. Haben Sie Referenzen dafür? Alles, was ich bei Google finden kann, scheint zu sagen, dass unterbrechbare Prozesse SIGKILL nicht ignorieren dürfen.
Del
1
Es scheint einfach alles zu widersprechen, was ich über Schlafstörungen gelesen habe, und ich bin ein wenig skeptisch, dass ich auf ein undokumentiertes Verhalten gestoßen bin. zB Überprüfen Sie die folgenden 2 Links. Verstehe ich etwas falsch? (1) "In einem unterbrechbaren Schlaf könnte der Prozess zur Verarbeitung von Signalen aufgeweckt werden." (2) "Wenn in diesem Zustand ein Signal für einen Prozess erzeugt wird, wird der Vorgang unterbrochen und der Prozess durch die Abgabe eines Signals aufgeweckt."
Del
1
Ein Systemaufruf ist nur abhängig von der Programmierung unterbrechbar oder nicht. Sobald man sich im Kernel befindet, geht alles.
Harrymc
10

Hintergrund zu einem Schlafprozess

Vielleicht möchten Sie einen Blick auf diesen Unix- und Linux-Beitrag werfen.

Insbesondere diese Antwort: /unix//a/5648/7453 .

Auszug aus diesem Beitrag

kill -9 (SIGKILL) funktioniert immer, vorausgesetzt, Sie haben die Erlaubnis, den Prozess abzubrechen. Grundsätzlich muss der Prozess entweder von Ihnen gestartet werden und nicht setuid oder setgid sein, oder Sie müssen root sein. Es gibt eine Ausnahme: Selbst Root kann kein schwerwiegendes Signal an PID 1 senden (der Init-Prozess).

Es ist jedoch nicht garantiert, dass kill -9 sofort funktioniert. Alle Signale, einschließlich SIGKILL, werden asynchron geliefert: Der Kernel kann einige Zeit benötigen, um sie zu liefern. Normalerweise dauert das Senden eines Signals höchstens einige Mikrosekunden, genau die Zeit, die das Ziel benötigt, um eine Zeitscheibe zu erhalten. Wenn das Ziel das Signal blockiert hat, wird das Signal in die Warteschlange gestellt, bis das Ziel es entsperrt.

Normalerweise können Prozesse SIGKILL nicht blockieren. Aber Kernel-Code kann und Prozesse können Kernel-Code ausführen, wenn sie Systemaufrufe aufrufen. Kernel-Code blockiert alle Signale, wenn der Systemaufruf unterbrochen wird, was zu einer schlecht geformten Datenstruktur irgendwo im Kernel oder allgemeiner zu einer Verletzung einer Kernel-Invariante führen würde. Wenn ein Systemaufruf (aufgrund eines Fehlers oder eines fehlerhaften Designs) auf unbestimmte Zeit blockiert wird, kann der Prozess möglicherweise nicht abgebrochen werden. (Der Vorgang wird jedoch abgebrochen, wenn der Systemaufruf jemals abgeschlossen wird.)

...

...

Ich empfehle dringend, den Rest dieser Antwort zu lesen!

Prozess beenden, der von einer Ressource (Datei oder Netzwerk) blockiert wurde

Hier sind 2 Dinge zum Ausprobieren.

1. Entfernen der .pid-Datei von yum

Gibt es eine yum lock Datei? Was passiert, wenn Sie diese Sperrdatei entfernen? Ich denke, das könnte es ermöglichen, weiterzumachen.

rm /var/run/yum.pid

2. Erzwingen Sie das Aufhängen CLOSE_WAIT TCP-Verbindungen werden geschlossen

A CLOSE_WAITwird wie folgt beschrieben:

CLOSE_WAIT Zeigt an, dass der Server das erste FIN-Signal vom Client empfangen hat und die Verbindung gerade geschlossen wird

Dies bedeutet also im Wesentlichen, dass es sich um einen Zustand handelt, in dem der Socket auf die Ausführung der Anwendung wartet. Close ()

Ein Socket kann sich auf unbestimmte Zeit im Status CLOSE_WAIT befinden, bis die Anwendung ihn schließt. Fehlerhafte Szenarien wären wie ein Leak des Filedescriptors, bei dem der Server nicht close () auf dem Socket ausführt, was zu einer Häufung von close_wait-Sockets führt

HINWEIS: Auszug aus der Technet-Website .

Sie können versuchen, zwei Tools zu verwenden, um dies zu erreichen.

Diese Tools simulieren den FIN-ACK-RST- Austausch, der erforderlich ist, damit eine TCP-Verbindung vollständig geschlossen wird.

Killcx erstellt ein gefälschtes SYN-Paket mit einem gefälschten SeqNum, fälscht den IP / Port des Remote-Clients und sendet ihn an den Server. Es wird ein untergeordneter Prozess ausgelöst, der die Serverantwort aufzeichnet, die zwei magischen Werte aus dem ACK-Paket extrahiert und zum Senden eines gefälschten RST-Pakets verwendet. Die Verbindung wird dann geschlossen.

HINWEIS: Auszug von der Killcx-Website .

Cutter verwenden

Unterbricht die spezifische Verbindung zwischen den beiden angegebenen IP / Port-Nummernpaaren.

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

Killcx verwenden

Unterbricht Verbindungen zu Remote-IP und -Port.

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

Ressourcen

slm
quelle
Das Entfernen der Sperrdatei hatte keine Auswirkung.
Del
1
Dies ist eine Produktionsmaschine, und leider haben diese beiden Tools Abhängigkeiten, die ich nicht installieren kann. Ich habe versucht, /etc/init.d/networking neu zu starten und es hat nichts getan. Eigentlich bin ich jetzt mehr daran interessiert zu verstehen, warum dies passieren kann (da ich nicht dachte, dass unterbrechbare Schlafprozesse SIGKILL ignorieren können), als wie ich dieses Problem beheben kann.
Del
Ein Neustart des Netzwerks hätte den gleichen Effekt, sodass die Blockierung von E / A, auf die der Prozess tatsächlich wartet, woanders liegt.
Slm
1

Sie können versuchen, den übergeordneten Prozess zu beenden. Verwenden Sie ps, um Folgendes zu überprüfen:

ps xjf -C yum

Dann werden kill -9alle übergeordneten Prozesse ausgeführt.

terdon
quelle
Der übergeordnete Prozess ist init (5. Spalte in meiner Ausgabe).
Del
1

Es kann sich lohnen, mit strace an den Prozess anzuhängen, um festzustellen, ob er wirklich inaktiv ist oder bei einer E / A-Operation hängen bleibt. Vielleicht liefern sie weitere Hinweise auf das Problem.

strace -pPID

Nach dem, was ich gelesen habe, gibt es keine andere Möglichkeit, diesen Prozess abzubrechen, als einen Neustart durchzuführen. Wenn der Prozess keine nennenswerte CPU-Zeit in Anspruch nimmt, ist es unwahrscheinlich, dass sich dies negativ auf den Server auswirkt.


quelle
Vielen Dank für den Vorschlag, aber der übergeordnete Prozess ist init (siehe die 5. Spalte in meiner Ausgabe).
Del
Beziehen Sie sich auf Ihre überarbeitete Antwort, strace hängt an den Prozess an, gibt jedoch nichts aus.
Del
1

Könnte es sein, dass es auf einen untergeordneten Prozess wartet? Ich liebe es, ps fauxweil es Ihnen sagen wird, ob es untergeordnete Prozesse gibt und ob, die Sie möglicherweise töten müssen.

Stefan Seidel
quelle
Nein, dieser Prozess hat keine untergeordneten Prozesse.
Del