Ich habe nur Ctrlczweimal auf meine Muschel geschlagen, um einen Prozess anzuhalten, dessen Abschluss lange dauert.
^C
wurde zweimal wiederholt, aber der Prozess ging einfach weiter.
Warum wurde Ctrlcder Prozess nicht wie gewohnt beendet?
shell
keyboard-shortcuts
der Spiegel
quelle
quelle
kill -9 %
zu beenden. Signal 9 kann nicht ignoriert werden, ebenso wenig wie das Suspend-Signal. Die Tastenfolge STRG + Z kann theoretisch ignoriert werden - in der Praxis jedoch nicht.perl -E '$SIG{TSTP} = sub { say "ha ha" }; sleep 1 while 1'
. Sie denken wahrscheinlich an SIGSTOP, was ein anderes Signal ist.Antworten:
Prozesse können wählen:
trap '' INT
in einer Shell), oder verfügen Sie über einen eigenen Handler, der entscheidet, nicht zu beenden (oder nicht rechtzeitig zu beenden).stty int '^K'
in einer Shell).stty -isig
einer Shell).Oder sie können unterbrechungsfrei sein, beispielsweise während eines Systemaufrufs, der nicht unterbrochen werden kann.
Unter Linux (mit einem relativ neuen Kernel) können Sie anhand der Ausgabe von feststellen, ob ein Prozess SIGINT ignoriert und / oder verarbeitet
SIGINT ist 2. Das zweite Bit von SigIgn oben ist 1, was bedeutet, dass SIGINT ignoriert wird.
Sie können dies automatisieren mit:
So überprüfen Sie, was das aktuelle
intr
Zeichen ist oder obisig
es für ein bestimmtes Terminal aktiviert ist:(über dem
intr
Zeichen steht^C
(das Zeichen, das normalerweise von Ihrem Terminal (Emulator) gesendet wird, wenn das Drücken CTRL-Cund die Eingangssignale nicht deaktiviert sind.(
intr
Zeichen ist^K
undisig
ist deaktiviert für/dev/pts/1
).Der Vollständigkeit halber gibt es zwei weitere Möglichkeiten, wie ein Prozess etwas tun kann, um den Empfang von SIGINTs zu beenden, obwohl dies normalerweise nicht der Fall ist.
Anschließend Ctrl+Cwird das SIGINT-Signal an alle Prozesse in der Vordergrundprozessgruppe des Terminals gesendet . In der Regel platziert die Shell Prozesse in Prozessgruppen (die Shell- Jobs zugeordnet sind ) und teilt dem Endgerät mit, welches das Vordergrundgerät ist .
Jetzt könnte ein Prozess:
Verlassen Sie die Prozessgruppe. Wenn es zu einer anderen Prozessgruppe wechselt (zu einer anderen Prozessgruppe als der Vordergrundgruppe ), wird das SIGINT nicht mehr empfangen Ctrl-C(und auch nicht die anderen tastaturbezogenen Signale wie SIGTSTP, SIGQUIT). Es kann jedoch angehalten werden, wenn versucht wird, vom Endgerät zu lesen (möglicherweise auch zu schreiben, abhängig von den Einstellungen des Endgeräts) (wie dies bei Hintergrundprozessen der Fall ist).
Als Beispiel:
konnte nicht unterbrechbar sein mit Ctrl-C. Oben
perl
wird versucht, der Prozessgruppe beizutreten, deren ID mit der übergeordneten Prozess-ID übereinstimmt. Im Allgemeinen gibt es keine Garantie dafür, dass es eine solche Prozessgruppe mit dieser ID gibt. Im Fall diesesperl
Befehls, der an der Eingabeaufforderung einer interaktiven Shell alleine ausgeführt wird, ist die ppid der Prozess der Shell, und die Shell wurde normalerweise in einer eigenen Prozessgruppe gestartet.Wenn der Befehl noch kein Prozessgruppenleiter ist (der Anführer dieser Vordergrundprozessgruppe), hat das Starten einer neuen Prozessgruppe den gleichen Effekt.
Zum Beispiel, abhängig von der Shell,
hätte den gleichen Effekt.
ps
undperl
werden in der Vordergrund-Prozessgruppe gestartet, aber in den meisten Shellsps
wäre der Anführer dieser Gruppe (wie in derps
obigen Ausgabe zu sehen, wo die pgid von beidenps
undperl
die pid vonps
),perl
kann also eine eigene Prozessgruppe starten.Oder es könnte die Vordergrundprozessgruppe ändern. Weisen Sie das tty-Gerät grundsätzlich an, das SIGINT an eine andere Prozessgruppe zu sendenCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) oder die $!; Schlaf 5 '
Dort
perl
bleibt in der gleichen Prozeßgruppe , sondern wird das Endgerät mitteilt , dass der Vordergrundprozess Gruppe ist derjenige , der ID das gleiche ist wie seine Eltern - Prozess - ID (siehe Anmerkung oben darüber).quelle
hdparm
odersmartctl
auf einer defekten Festplatte , die nicht reagiert sie für immer hängen, und Sie können sie mit STRG + C nicht töten. Sie können feststellen, ob sich ein Prozess im ununterbrochenen Schlaf befindet, indem Sie auf die stat-Spalte vonps aux
oder auf die S-Spalte vontop
/htop
- schauen,D
was ununterbrochenen Schlaf bedeutet. Dies ist jedoch nicht unbedingt eine schlechte Sache, es könnte nur bedeuten, dass der Prozess viel IO ausführt.