Kurze Antwort : Senden SIGTERM
, 30 Sekunden später SIGKILL
. Das heißt, senden SIGTERM
, etwas warten (es kann von Programm zu Programm variieren, Sie kennen Ihr System vielleicht besser, aber 5 bis 30 Sekunden reichen aus. Wenn Sie eine Maschine herunterfahren, wird sie möglicherweise automatisch bis zu 1'30 Sekunden warten. Warum doch die Eile?), Dann senden SIGKILL
.
Angemessene Antwort : SIGTERM
, SIGINT
, das SIGKILL
ist mehr als genug. Der Prozess wird sehr wahrscheinlich vorher beendet SIGKILL
.
Lange Antwort : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Dies ist nicht erforderlich, aber zumindest führen Sie den Prozess in Bezug auf Ihre Nachricht nicht in die Irre. Alle diese Signale haben meinen Sie den Prozess stoppen soll , was es tut und beenden.
Egal welche Antwort Sie aus dieser Erklärung wählen, denken Sie daran!
Wenn Sie ein Signal senden, das etwas anderes bedeutet, kann der Prozess (auf der einen Seite) auf sehr unterschiedliche Weise damit umgehen. Wenn der Prozess das Signal jedoch nicht verarbeitet, spielt es keine Rolle, was Sie senden, der Prozess wird trotzdem beendet (wenn die Standardaktion natürlich das Beenden ist).
Sie müssen also als Programmierer denken. Würden Sie einen Funktionshandler codieren, SIGHUP
um beispielsweise ein Programm zu beenden, das eine Verbindung zu etwas herstellt, oder würden Sie eine Schleife ausführen, um erneut zu versuchen, eine Verbindung herzustellen? Das ist hier die Hauptfrage! Deshalb ist es wichtig, nur Signale zu senden, die genau das bedeuten, was Sie beabsichtigen.
Fast dumme lange Antwort :
Die folgende Tabelle enthält die relevanten Signale und die Standardaktionen, falls das Programm sie nicht verarbeitet.
Ich habe sie in der Reihenfolge bestellt, in der ich sie verwenden möchte (übrigens, ich empfehle Ihnen, die vernünftige Antwort zu verwenden , nicht diese hier), wenn Sie sie wirklich alle ausprobieren müssen (es würde Spaß machen zu sagen, dass die Tabelle in Bezug auf bestellt ist die Zerstörung, die sie verursachen können, aber das ist nicht ganz richtig).
Die mit einem Sternchen (*) gekennzeichneten Signale werden NICHT empfohlen. Das Wichtigste dabei ist, dass Sie möglicherweise nie wissen, wofür es programmiert ist. Speziell SIGUSR
! Es kann die Apokalipse starten (es ist ein freies Signal für einen Programmierer, zu tun, was er / sie will!). Wenn dies jedoch nicht behandelt wird ODER in dem unwahrscheinlichen Fall, dass es zum Beenden behandelt wird, wird das Programm beendet.
In der Tabelle bleiben die Signale mit den Standardoptionen zum Beenden und Generieren eines Core-Dumps am Ende kurz davor SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Dann würde ich für diese vorschlägt fast dumm lange Antwort :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
Und schließlich die
Auf jeden Fall dumm lange lange Antwort :
Versuchen Sie das nicht zu Hause.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
Und wenn nichts funktioniert, SIGKILL
.
SIGUSR2
sollte vorher versucht werden, SIGUSR1
da wir besser dran sind, wenn das Programm das Signal nicht verarbeitet. Und es ist viel wahrscheinlicher, dass es damit umgeht, SIGUSR1
wenn es nur mit einem von ihnen umgeht.
Übrigens, der KILL : Es ist nicht falsch, SIGKILL
an einen Prozess zu senden , wie andere Antworten sagten. Überlegen Sie, was passiert, wenn Sie einen shutdown
Befehl senden ? Es wird versuchen SIGTERM
und SIGKILL
nur. Warum ist das Ihrer Meinung nach der Fall? Und warum brauchen Sie andere Signale, wenn der shutdown
Befehl nur diese beiden verwendet?
Zurück zur langen Antwort : Dies ist ein netter Oneliner:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Zwischen den Signalen wird 30 Sekunden lang geschlafen. Warum sonst brauchen Sie einen Oneliner ? ;)
Empfohlen wird auch: Versuchen Sie es nur mit Signalen 15 2 9
aus der vernünftigen Antwort .
Sicherheit : Entfernen Sie die zweite, echo
wenn Sie bereit sind. Ich nenne es mein dry-run
für Onliner . Verwenden Sie es immer zum Testen.
Skript killgracefully
Eigentlich war ich von dieser Frage so fasziniert, dass ich mich entschied, ein kleines Skript zu erstellen, um genau das zu tun. Bitte laden Sie es hier herunter (klonen):
GitHub-Link zum Killgracefully-Repository