web-dev-qa-db-fra.com

Lancer le script après la fin d'un autre (déjà en cours d'exécution)

J'ai donc un processus en cours, et il faudra plusieurs heures pour le terminer. Je voudrais commencer un autre processus juste après que celui-ci se termine, automatiquement. Notez que je ne peux pas ajouter un appel au second script dans le premier, ni en créer un autre qui exécute les deux de manière séquentielle. Est-il possible de faire cela sous Linux?

Edit: Une option consiste à interroger chaque x minutes à l’aide de pgrep et à vérifier si le processus est terminé. Si c'est le cas, commencez l'autre. Cependant, je n'aime pas cette solution.

PS: Les deux sont des scripts bash, si cela aide.

48
skd

Les sondages sont probablement la voie à suivre, mais ils ne doivent pas nécessairement être horribles.

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

Étant donné le PID du premier processus, la boucle

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

devrait faire l'affaire. C'est un peu plus stable que pgrep et les noms de processus.

51
thiton

Peut-être pouvez-vous d'abord appuyer sur ctrl + z et entrer

fg; echo "first job finished"
22
Yangchuan Li

Vous pouvez wait déjà exécuter le processus en utilisant la commande intégrée bash wait. homme bash .

wait [n ...] Attend chaque processus spécifié et renvoie son statut de résiliation. Chaque n peut être un identifiant de processus ou une spécification de travail; si une spécification de travail est donnée, tous les processus du pipeline de ce travail sont attendu pour. Si n n'est pas indiqué, tous les processus enfants actuellement actifs sont attendus et le statut de retour est zéro. Si n spécifie un processus ou tâche inexistant, le statut de retour est 127. Sinon, le return status est le statut de sortie du dernier processus ou travail attendu pour.

19
ks1322

Il arrive souvent que votre programme exécute plusieurs démons. Dans ce cas, votre pid sera un tableau. Il suffit d'utiliser:

PID = ($ (pidof -x nom_du_processus)) Ceci enregistre tous les PID du processus donné dans le tableau $ pid

Maintenant, modifiez simplement le code de thiton comme suit: 

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

2
shivams

J'ai eu la même exigence et l'ai résolu de la manière suivante:

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

appeler SCRIPT_2

0

J'ai eu un problème similaire et je l'ai résolu de cette façon:

Nohup bash script1.sh &

attendre

Nohup bash script2.sh &

0
Servando Flores