it-swarm.com.de

Linux-Befehl zum Überprüfen, ob ein Shell-Skript ausgeführt wird oder nicht

Was ist der Linux-Befehl, den Sie finden können, wenn ein Prozess, beispielsweise aa.sh, ausgeführt wird oder nicht, der Befehl . Ps scheint nicht zu funktionieren und die Shell-Skriptnamen nicht angezeigt werden.

Bitte beraten.

23
learninghuman

Überprüfen Sie dies

ps aux | grep "aa.sh"
26
krizna

Die einfachste Lösung ist:

pgrep -fl aa.sh
25
Gilles Quenot

Hinzufügen zu den Antworten oben -

Verwenden Sie zur Verwendung in einem Skript Folgendes: -

result=`ps aux | grep -i "myscript.sh" | grep -v "grep" | wc -l`
if [ $result -ge 1 ]
   then
        echo "script is running"
   else
        echo "script is not running"
fi
5
Raj

Überprüfen Sie dies

ps -ef | grep shellscripname.sh

Sie finden Ihren laufenden Prozess auch in 

ps -ef
4
Saurabh Lende

Die oben genannten Lösungen eignen sich hervorragend für die interaktive Verwendung, bei der Sie das Ergebnis beobachten und Fehlalarme auf diese Weise aussortieren können.

False Positives kann auftreten, wenn die ausführbare Datei selbst übereinstimmt oder Argumente, die keine Skriptnamen sind, übereinstimmen. Die Wahrscheinlichkeit ist größer, wenn Skripts keine Dateinamenerweiterung haben.

Hier ist eine robustere Lösung für Scripting , die eine Shell-Funktion verwendet :

getscript() {
  pgrep -lf ".[ /]$1( |\$)"
}

Anwendungsbeispiel:

# List instance(s) of script "aa.sh" that are running.
getscript "aa.sh"  # -> (e.g.): 96112 bash /Users/jdoe/aa.sh

# Use in a test:
if getscript "aa.sh" >/dev/null; then
  echo RUNNING
fi
  • Beim Matching wird zwischen Groß- und Kleinschreibung unterschieden (unter macOS können Sie dem Aufruf pgrep-i hinzufügen, um die Groß-/Kleinschreibung zwischen -in zu machen; unter Linux ist dies keine Option.)
  • Die Funktion getscript funktioniert auch mit vollständigen oder teilweisen Pfaden, die die Dateinamenkomponente enthalten. Teilpfade dürfen nicht mit / beginnen und jede angegebene Komponente muss vollständig sein. Je "voller" der angegebene Pfad ist, desto geringer ist das Risiko von Fehlalarmen. Caveat : Pfadabgleich funktioniert nur, wenn das Skript aufgerufen mit einem Pfad war. Dies gilt im Allgemeinen für Skripts in $ PATH, die direkt aufgerufen werden.
  • Auch diese Funktion kann nicht alle Fehlalarme ausschließen , da Pfade eingebettete Leerzeichen enthalten können, aber weder ps noch pgrep spiegeln die ursprüngliche Anführungszeichen der Befehlszeile wider. Die Funktion garantiert nur, dass jede Übereinstimmung nicht das erste Token ist (was der Interpreter ist), und dass es als separates Wort auftritt, dem optional ein Pfad vorangestellt ist.
  • Ein anderer Ansatz zur Minimierung des Risikos von Fehlalarmen könnte darin bestehen, den ausführbare-Namen (d. H. Einen Interpreter, z. B. bash) ebenfalls zu übernehmen - vorausgesetzt, es ist bekannt; z.B.
# List instance(s) of a running *bash* script.
getbashscript() {
  pgrep -lf "(^|/)bash( | .*/)$1( |\$)"
}

Wenn Sie bereit sind, weitere Annahmen zu treffen - wie z. B. Skriptinterpreterpfade, die niemals eingebettete Leerzeichen enthalten - können die Ausdrücke restriktiver gestaltet werden, wodurch das Risiko von Fehlalarmen weiter verringert wird.

2
mklement0

Die letzte Antwort von mklement0 hat mich ziemlich inspiriert - ich habe einige Skripte/kleine Programme, die ich bei jedem Neustart über /etc/crontab ausführen kann. Ich baute auf seiner Antwort auf und baute ein Anmeldeskript, das anzeigt, ob meine Programme noch laufen. Ich führe diesen scripts.sh über die .profile-Datei bei jedem Login aus, um bei jedem Login sofort eine Benachrichtigung zu erhalten. 

cat scripts.sh 
#!/bin/bash

getscript() {
  pgrep -lf ".[ /]$1( |\$)"
}

script1=keepalive.sh
script2=logger_v3.py

# test if script 1 is running
if getscript "$script1" >/dev/null; then
  echo "$script1" is RUNNING
  else
    echo "$script1" is NOT running
fi

# test if script 2 is running:
if getscript "$script2" >/dev/null; then
  echo "$script2" is RUNNING
  else
    echo "$script2" is NOT running
fi
2
rj45
pgrep -f aa.sh 

Um etwas mit der ID zu tun, leiten Sie es. Hier töte ich alle Kindaufgaben.

pgrep aa.sh | xargs pgrep -P ${} | xargs kill

Wenn Sie einen Befehl ausführen möchten, wenn der Prozess ausgeführt wird, tun Sie dies

pgrep aa.sh && echo Running
2

Geben Sie ps eine Option, um alle Prozesse anzuzeigen. Ein Beispiel ist:

ps -A | grep "myshellscript.sh"

Überprüfen Sie http://www.cyberciti.biz/faq/show-all-running-processes-in-linux/ für weitere Informationen

Und wie Basile Starynkevitch im Kommentar pgrep erwähnte, ist eine andere Lösung.

0
lc2817