2017-05-24 7 views
0

Ich verwende lsof Befehl, um nur eine Instanz von setup.sh und es funktioniert gut, wenn keine Argument Werte sind. Aber ich musste Argumente in setup.sh für z.B.lsof Linux-Befehl zu zählen laufenden Instanzen mit Argument Werte

setup.sh machine1 setup.sh machine2 setup.sh machine3

Also, wenn setup.sh machine1 läuft und wieder denselben Befehl ausgeführt wird, wird es warten, bis setup.sh machine1 abgeschlossen ist. Ich denke, lsof ist für den Prozess und vielleicht nicht möglich, aber jeder andere gute Vorschlag für die Wartelogik?

Wenn ich versuche, einige Argumente übergeben lsof Befehl gibt Syntaxfehler, versuchte ich unten, aber kein Glück. Mein Ziel ist es, nur eine Instanz unter Verwendung von machine1 auszuführen, und wenn jemand versucht, setup.sh mit dem Argument machine1 auszuführen, sollte es warten. Irgendeine andere Dateisperre/Wartelogik?

if ([[ $(lsof -t \setup.sh 'machine1'| wc -l) > 1 ]]); then 
if ([[ $(lsof -t '\setup.sh machine1'| wc -l) > 1 ]]); then 
if ([[ $(lsof -t "\setup.sh machine1"| wc -l) > 1 ]]); then 

Arbeits:

if ([[ $(lsof -t \setup.sh| wc -l) > 1 ]]); then 
    echo -e "\tWaiting for 2 minutes...\n" 
    sleep 2m 
else 
    echo -e "\tFree now to run setup.sh\n" 
fi 

funktioniert nicht (Syntaxfehler):

if ([[ $(lsof -t \setup.sh machine1| wc -l) > 1 ]]); then 
    echo -e "\tWaiting for 2 minutes...\n" 
    sleep 2m 
else 
    echo -e "\tFree now to run setup.sh\n" 
fi 
+0

Warum hatten Sie einen Schrägstrich vor 'setup.sh'? – Inian

+0

Es ist nur ein Pfad, wo das Skript gerade platziert/ausgeführt wird. –

Antwort

0

Sie können mit ps -eo args wie die folgenden Prozesse mit Argumenten suchen.

ps -eo args | grep '^setup.sh machine1' | wc -l 

Sie müssen grep Muster ändern, um Ihrem Fall zu entsprechen.

0

Gregs Wiki hat einen großartigen Artikel über Prozessmanagement, insbesondere "How do I make sure only one copy of my script can run at a time?". lsof ist keine zuverlässige Methode, um sicherzustellen, dass nur ein Prozess ausgeführt wird, da zwischen dem Überprüfen der Ausgabe von lsof und dem Fortfahren ein Race-Zustand besteht. Wenn zwei Prozesse fast gleichzeitig starten, ist es wahrscheinlich, dass sie beide parallel laufen.