Wie kann man feststellen, ob ein Prozess ausgeführt wird oder nicht, und dies zum Erstellen eines bedingten Shell-Skripts nutzen?

Wie kann man feststellen, ob ein Prozess ausgeführt wird oder nicht, und dies zum Erstellen eines bedingten Shell-Skripts nutzen?

Wie kann ich feststellen, ob ein Prozess ausgeführt wird oder nicht und dann ein Bash-Skript basierend auf dieser Bedingung einige Dinge ausführen lassen?

Zum Beispiel:

  • Wenn der Prozess abcläuft, tun Sie dies

  • wenn es nicht läuft, tun Sie das.

Antwort1

Ein Bash-Skript, das so etwas tut, würde ungefähr so ​​aussehen:

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

Dieses Skript prüft lediglich, ob das Programm „gedit“ läuft.

Oder Sie prüfen einfach, ob das Programm nicht läuft, und zwar folgendermaßen:

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

Antwort2

Jede Lösung, die etwas Ähnliches verwendet ps aux | grep abcoder pgrep abcfehlerhaft ist.

Warum?

Da Sie nicht prüfen, ob ein bestimmter Prozess ausgeführt wird, prüfen Sie, ob Prozesse ausgeführt werden, die zufällig mit übereinstimmen abc. Jeder Benutzer kann problemlos eine ausführbare Datei mit dem Namen erstellen und ausführen abc(oder die abcirgendwo in ihrem Namen oder ihren Argumenten enthält), was zu einem falschen Positiv für Ihren Test führt. Sie können verschiedene Optionen anwenden ps, grepum pgrepdie Suche einzugrenzen, aber Sie erhalten trotzdem kein zuverlässiges Ergebnis.

Wie teste ich also zuverlässig, ob ein bestimmter laufender Prozess vorliegt?

Das hängt davon ab, wofür Sie den Test benötigen.

Ich möchte sicherstellen, dass der ServiceABCläuft, und wenn nicht, starten Sie es

Dafür ist systemd da. Es kann den Dienst automatisch starten und überwachen und kann reagieren, wenn er beendet wird.

SehenWie kann ich überprüfen, ob mein Spieleserver noch läuft?für andere Lösungen.

ABCist mein Skript. Ich muss sicherstellen, dass nur eine Instanz meines Skripts ausgeführt wird.

Verwenden Sie in diesem Fall eine Sperrdatei oder ein Sperrverzeichnis. Beispiel:

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

SehenBash-FAQ 45für andere Verschlussarten.

Antwort3

Das ist, was ich verwende:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

In reinem Englisch:Wenn „pgrep“ 0 zurückgibt, läuft der Prozess, andernfalls nicht.


Weiterführende Literatur:

Bash-Skripting ::Zeichenfolgenvergleiche

Ubuntu-Handbücherpgrep

Antwort4

Um die Idee von @rommel-cid aufzugreifen, können Sie pidof|| (||) verwenden, um einen Befehl auszuführen, wenn der Prozess nicht existiert, und &&, um etwas auszuführen, wenn der Prozess existiert. So erstellen Sie schnell eine if/then/else-Bedingung. Hier ist beispielsweise eine mit einem laufenden Prozess (mein Chrome-Browser, dessen Prozessname „Chrome“ ist) und eine, die auf einen nicht existierenden Prozess prüft. Ich habe die Standardausgabe mit 1>/dev/null unterdrückt, damit sie nicht gedruckt wird:

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

verwandte Informationen