it-swarm.com.de

Starten Sie das Skript, nachdem ein anderes (bereits ausgeführtes) beendet ist

Ich habe also einen Prozess, und es wird einige Stunden dauern, bis der Vorgang abgeschlossen ist. Ich möchte sofort einen weiteren Prozess starten, automatisch. Beachten Sie, dass ich dem zweiten Skript im ersten Skript keinen Aufruf hinzufügen oder einen anderen erstellen kann, der beide sequentiell ausführt. Gibt es eine Möglichkeit, dies in Linux zu tun?

Bearbeiten: Eine Option besteht darin, alle x Minuten mit pgrep abzufragen und zu prüfen, ob der Vorgang abgeschlossen ist. Wenn ja, starte den anderen. Diese Lösung gefällt mir jedoch nicht.

PS: Beide sind Bash-Skripte, wenn das hilft.

48
skd

Umfragen sind wahrscheinlich der Weg, aber es muss nicht schrecklich sein.

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script
26
Sorpigal

Bei gegebener PID des ersten Prozesses die Schleife

while ps -p $PID; do sleep 1; done ; script2

sollte den Trick tun. Dies ist etwas stabiler als pgrep und Prozessnamen.

51
thiton

Vielleicht können Sie zuerst Strg + Z drücken und eingeben

fg; echo "first job finished"
22
Yangchuan Li

Sie können wait bereits mit dem integrierten Befehl wait einen laufenden Prozess ausführen. man bash .

wait [n ...] Warten Sie auf jeden angegebenen Prozess und geben Sie dessen .__ zurück. Beendigungsstatus. Jedes n kann eine Prozess-ID oder eine Jobspezifikation sein: Wenn eine Jobspezifikation angegeben wird, sind alle Prozesse in der Pipeline dieses Jobs gewartet auf. Wenn n nicht angegeben ist, werden alle derzeit aktiven untergeordneten Prozesse wird gewartet und der Rückgabestatus ist Null. Wenn n eine .__ angibt. Nicht vorhandener Prozess oder Job, der Rückgabestatus ist 127. Andernfalls lautet die Der Rückkehrstatus ist der Beendigungsstatus des letzten Prozesses oder Jobs, auf den gewartet wurde zum.

19
ks1322

Es kommt oft vor, dass in Ihrem Programm mehrere Dämonen laufen. In diesem Fall wird Ihre PID ein Array sein. Benutz einfach:

PID = ($ (pidof -x Prozessname)) # dies speichert alle PIDs des angegebenen Prozesses im $ pid-Array

Nun ändern Sie einfach den Code des Thitons als: 

while ps -p ${PID[*]}; do sleep 1; done ; script2

2
shivams

Ich hatte die gleiche Anforderung und habe sie auf folgende Weise gelöst:

while [[ "$exp" != 0 ]]; do
exp=$(ps -ef |grep -i "SCRIPT_1" |grep -v grep |wc -l)
sleep 5;
done

rufen Sie SCRIPT_2 auf

Ich hatte ein ähnliches Problem und habe es so gelöst:

Nohup bash script1.sh &

warten

Nohup bash script2.sh &

0
Servando Flores