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.
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
É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.
Peut-être pouvez-vous d'abord appuyer sur ctrl + z et entrer
fg; echo "first job finished"
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.
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
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
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 &