In einem Bash-Skript möchte ich Folgendes tun (im Pseudocode):
if [ a process exists with $PID ]; then
kill $PID
fi
Was ist der passende Ausdruck für die bedingte Anweisung?
Verwenden Sie, um die Existenz eines Prozesses zu überprüfen
kill -0 $pid
Aber genau wie @unwind sagte, wenn du es trotzdem töten willst, einfach
kill $pid
oder Sie haben eine Rennbedingung.
Wenn Sie die Textausgabe von ignorieren kill
und etwas basierend auf dem Exit-Code tun möchten , können Sie dies tun
if ! kill $pid > /dev/null 2>&1; then
echo "Could not send SIGTERM to process $pid" >&2
fi
kill
ist etwas falsch benannt, da es den Prozess nicht unbedingt beendet. Es sendet dem Prozess nur ein Signal.kill $PID
ist äquivalent zukill -15 $PID
, was das Signal 15 SIGTERM an den Prozess sendet, der eine Anweisung zum Beenden ist. Es gibt kein Signal 0, das ist ein spezieller Wert,kill
der nur prüft, ob ein Signal an den Prozess gesendet werden kann, was für die meisten Zwecke mehr oder weniger der Überprüfung entspricht, ob es existiert. Siehe linux.die.net/man/2/kill und linux.die.net/man/7/signalkill -0
, muss ich tatsächlich Folgendes tun:kill -0 25667 ; echo $?
- und wenn ich dann eine0
Rückgabe bekomme , kann der Prozess mit dieser PID abgebrochen werden; und wenn die Prozess-PID (sagen wir) nicht existiert,$?
ist dies ein1
Hinweis auf einen Fehler. Ist das korrekt?Der beste Weg ist:
Das Problem mit:
ist, dass der Exit-Code ungleich Null ist, auch wenn die PID ausgeführt wird und Sie keine Berechtigung haben, sie zu beenden. Beispielsweise:
und
Sie haben einen nicht unterscheidbaren Exit-Code (ungleich Null) für einen normalen Benutzer, aber der Init-Prozess (PID 1) wird mit Sicherheit ausgeführt.
DISKUSSION
Die Antworten zu Kill- und Race-Bedingungen sind genau richtig, wenn der Testkörper ein "Kill" ist. Ich suchte nach dem allgemeinen " Wie testest du eine PID-Existenz in Bash?" ".
Die / proc-Methode ist interessant, bricht aber in gewissem Sinne den Geist der "ps" -Befehlsabstraktion, dh Sie müssen nicht in / proc suchen, denn was ist, wenn Linus beschließt, die "exe" -Datei etwas anderes aufzurufen?
quelle
-p
ist zumindest in diesem Fall unnötig.ps $PID
hat genau das gleiche Ergebnis.oder
In der letzteren Form
-o pid=
ist ein Ausgabeformat, um nur die Prozess-ID-Spalte ohne Kopfzeile anzuzeigen. Die Anführungszeichen sind erforderlich, damit ein nicht leerer Zeichenfolgenoperator-n
ein gültiges Ergebnis liefert.quelle
if ps -p"$PID" -o "pid=" >/dev/null 2>&1; then echo "Process is running..."; fi
ps
variieren die Optionen und Funktionen in der Regel zwischen den Plattformen, sodass sie immer noch nicht vollständig portierbar sind.$PID
leer ist,[ -e /proc/$PID ]
wird immer noch true zurückgegeben, da das/proc/
Verzeichnis noch vorhanden ist.ps
Befehl mit-p $PID
kann dies tun:quelle
Sie haben zwei Möglichkeiten:
Beginnen wir mit der Suche nach einer bestimmten Anwendung in meinem Laptop:
Alle Beispiele suchen jetzt nach PID 3358.
Erster Weg : Führen Sie "ps aux" aus und suchen Sie in der zweiten Spalte nach der PID. In diesem Beispiel suche ich nach Firefox und dann nach PID:
Ihr Code lautet also:
Zweiter Weg : Suchen Sie einfach nach etwas im
/proc/$PID
Verzeichnis. Ich verwende in diesem Beispiel "exe", aber Sie können alles andere verwenden.Ihr Code lautet also:
Übrigens: Was ist los mit
kill -9 $PID || true
?BEARBEITEN:
Nachdem ich ein paar Monate darüber nachgedacht habe ... (ungefähr 24 ...), ist die ursprüngliche Idee, die ich hier gegeben habe, ein netter Hack, aber höchst unportabel. Während einige Implementierungsdetails von Linux vermittelt werden, funktioniert es unter Mac, Solaris oder * BSD nicht. Es kann sogar auf zukünftigen Linux-Kerneln fehlschlagen. Bitte - verwenden Sie "ps" wie in anderen Antworten beschrieben.
quelle
/proc/$PID/exe
ist keine reguläre Datei. Gibt also[ -f /proc/$PID/exe ]
immer einfalse
Ergebnis zurück. Versuchen Sie es[ -h /proc/$PID/exe ]
.Es scheint, als ob du willst
die zurückkehren wird, wenn
$pid
fertig ist.Ansonsten können Sie verwenden
um zu überprüfen, ob der Prozess noch aktiv ist (dies ist effektiver als
kill -0 $pid
weil es funktioniert, auch wenn Sie die PID nicht besitzen).quelle
pid 123 is not a child of this shell
Ich denke, das ist eine schlechte Lösung, die sich für die Rennbedingungen öffnet. Was ist, wenn der Prozess zwischen Ihrem Test und Ihrem Aufruf zum Töten abbricht? Dann wird das Töten fehlschlagen. Warum also nicht einfach den Kill in allen Fällen versuchen und seinen Rückgabewert überprüfen, um herauszufinden, wie er gelaufen ist?
quelle
kill -9
. Das beendet den Prozess sofort und gibt ihm keine Chance, nach sich selbst aufzuräumen. Verwenden Sie stattdessen das,kill
was äquivalent zu istkill -15
. Wenn das nicht funktioniert, sollten Sie herausfinden, warum und nur als letztes Mittelkill -9
.Hier speichere ich die PID in einer Datei namens .pid (ähnlich wie / run / ...) und führe das Skript nur aus, wenn es nicht bereits ausgeführt wird.
Hinweis: Es gibt eine Race-Bedingung, da nicht überprüft wird, wie diese PID aufgerufen wird. Wenn das System neu gestartet wird und .pid vorhanden ist, aber von einer anderen Anwendung verwendet wird, kann dies zu „unvorhergesehenen Konsequenzen“ führen.
quelle
In GNU / Linux können Sie beispielsweise Folgendes verwenden:
Oder so ähnlich
und das zeigt dir den Namen der App, nur den Namen ohne ID.
quelle
pidof
gibt keine negative Zahl zurück, da eine negative PID keinen Sinn ergibt und Sie nicht töten könneninit
, sodass Ihre Bedingung keinen Sinn ergibt (und außerdem müssten Sie der entkommen>
, um zu verhindern, dass sie eine Umleitung durchführt). Sie möchten nach einem leeren Ergebnis suchen,pidof
legen aber wie jedes anständige Tool einen Exit-Code fest, der Ihnen sagt, ob es funktioniert hat. Die richtige Lösung ist alsoif Pid=$(pidof 'process_name'); then ...
oder (wenn Sie den WertPid
später nicht benötigen ) einfachif pidof 'process_name'; then...
pidof
Beispiel ist voller Missverständnisse darüber, wie Bashtest
funktioniert. gnu.org/software/bash/manual/html_node/…Der folgende Code prüft, ob mein Prozess ausgeführt wird. Wenn ja, tun Sie nichts.
Lassen Sie uns stündlich und nur dann neue Nachrichten von Amazon SQS überprüfen, wenn der Prozess nicht ausgeführt wird.
quelle