2010-12-17 4 views
2

Ich schreibe ein Skript (show_volume.sh), die mehrmals in kurzen Intervallen aufgerufen werden kann. Ich muss herausfinden, ob es mehr als nur eine Instanz dieses Skripts gibt. Ich dachte, ich ps verwenden konnte, so schrieb ich diese Funktion in Bash:Überprüfen Sie die Anzahl der laufenden Skripte mit ps

is_only_process(){ 
    PCOUNT=`ps -a | grep show_volume.sh | wc -l` 
    echo $PCOUNT 
    if ((PCOUNT==1)); then 
     return 1 
    fi 
    return 0 
} 

So habe ich diese 2 Zeilen

is_only_process 
sleep 4 

und begann, sobald dieses Skript, aber die Ausgabe von echo $PCOUNT nicht jeder machen Sinn für mich. Ich bekomme immer den Wert 2, nicht 1, wie erwartet. Wenn ich diesen Befehl ausführen

ps -a | grep show_volume.sh | wc -l

von einem anderen Endgerät, während das Skript ausgeführt wird, erhalte ich den Wert 1. Es ist so ziemlich das gleiche, wenn ich dieses Skript mehrmals in einer Reihe, z.B. 10 mal mit einer for-Schleife. Das Skript selbst bestimmt Werte, die zu hoch sind, während ich bei Verwendung eines anderen Terminals korrekte Werte erhalte.

Nun, warum bestimmt dieses Skript diese ungeraden Werte?

Antwort

6

Im Moment ps ein Prozess läuft grep show_volume.sh auch ausgeführt wird, so dass Sie immer die grep zählen!

Einfache Lösung, grep s[h]ow_volume.sh. Das grep (nicht shell) wird die [h] zu h zusammenklappen und nach was Sie suchen suchen, aber Ihr grep wird nicht übereinstimmen, da es [] in dem Parameter haben wird.

pgrep ist auch für diese Aufgabe nützlich und ist schlau genug, sich immer selbst auszuschließen.

+0

@Nathan +1 schöner Trick! – khachik

+0

"Im Moment ps läuft ein Prozess grep show_volume.sh läuft auch" - nicht technisch korrekt. Es gibt Fälle, in denen 'ps' beendet wird, bevor' grep' hochfährt, in diesem Fall wird 'grep' nicht gezählt. Sie müssen also für beide Fälle sorgen. – marcog

+0

Aus irgendeinem Grund löst es mein Problem nicht.Ich habe versucht, den Ausdruck durch 'pgrep show_volume.sh | zu ersetzen wc -l' oder 'ps-a | grep s [h] ow_volume.sh | wc -l, aber das Skript verhält sich genau so wie zuvor. – helios35

1

Versuchen grep auch auszuschließen, wie Ihr grep selbst show_volume.sh enthält auch ein Beispiel

ps -a | grep show_volume.sh | grep -v grep | wc -l 
+0

Danke, aber das ändert nicht das Verhalten des Skripts. Derselbe Fehler tritt immer noch auf. – helios35

1

Wenn Sie das Skript als verschiedene Benutzer ausführen, zeigt ps -a nur Instanzen für den aktuellen Benutzer und nur solche mit einem angeschlossenen Terminal an. Verwenden Sie ps -ax oder ps -e.

pgrep -c 

wird eine Zählung zeigen, ohne wc zu verwenden.

0

Die Lösung von ajreal bereitgestellt:

ps -a | grep show_volume.sh | grep -v grep | wc -l

sollte funktionieren. Wenn nicht, geben Sie bitte die Ausgabe

ps -a | grep show_volume.sh | grep -v grep

hier

+1

ausgabe: "ps-e | grep show_volume.sh | grep -v grep" 15956? 00:00:00 show_volume.sh 15971? 00:00:00 show_volume.sh zwei Prozesse, obwohl ich das Skript nur einmal ausgeführt und grep ausgeschlossen. – helios35

+0

'grep -v grep' ist ein Antipattern. Wie man es vermeidet, ist eine alte FAQ. – tripleee

Verwandte Themen