Jécris un script, mais il y a quelque chose dont jai besoin que je ne trouve pas un moyen de le faire …
Je dois créer une commande en arrière-plan « command1 & » et puis quelque part dans le script, je dois attendre quelle se termine avant de faire command2. En gros , Jai besoin de ceci:
REMARQUE: chaque commande sexécute dans un répertoire spécifique! À la fin de la boucle while, ma commande1 a créé 4 répertoires, où dans chacun exécutez le processus spécifique, donc le total du processus en cours dexécution sont 4
a=1 while [$a -lt 4 ] . command1 #Generates 1 Process a= `export $a +1` done #Wait until the 4 process end and then run the command2 . command2
Jai « vu quelque chose à propos dun wait
avec le numéro de processus pid, mais cela na pas fonctionné également.
Commentaires
Réponse
Vous pouvez utiliser la commande wait PID
pour attendre la fin dun processus.
Vous pouvez également récupérer le PID de la dernière commande avec $!
Dans votre cas, quelque chose comme ça fonctionnerait:
command1 & #run command1 in background PID=$! #catch the last PID, here from command1 command2 #run command2 while command1 is running in background wait $PID #wait for command1, in background, to end command3 #execute once command1 ended
Suite à votre modification, comme vous avez plusieurs PID et que vous les connaissez, vous pouvez le faire:
command1 & #run command1 in background PID1=xxxxx PID2=yyyyy PID3=xxyyy PID4=yyxxx command2 #run command2 while command1 is running in background wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end command3 #execute once command1 ended
Commentaires
- Suite à votre modification, si vous connaissez le PID créé (xxxxx, yyyyy, xxyyy, yyxxx ), vous pouvez également utiliser wait, avec la liste des PID à attendre (voir man). Si vous les connaissez ', vous pouvez peut-être les rassembler dans command1 (quest-ce que command1? Un script de votre choix?)
- Probablement mieux pour vous assurer quils ' a été regroupé correctement en premier lieu. Voir ma réponse pour une idée de la façon dont cela pourrait être fait.
Réponse
La façon la plus simple de le faire serait davoir votre comamnd1
renvoyer les PID des processus lancés et en utilisant wait
sur chacun deux comme suggéré par @LaurentC « s answer .
Une autre approche serait quelque chose comme ceci:
## Create a log file logfile=$(mktemp) ## Run your command and have it print into the log file ## when it"s finsihed. command1 && echo 1 > $logfile & ## Wait for it. The [ ! -s $logfile ] is true while the file is ## empty. The -s means "check that the file is NOT empty" so ! -s ## means the opposite, check that the file IS empty. So, since ## the command above will print into the file as soon as it"s finished ## this loop will run as long as the previous command si runnning. while [ ! -s $logfile ]; do sleep 1; done ## continue command2
Commentaires
- désolé mais ne fonctionne toujours pas .. Je vais encore améliorer ma question!
Réponse
Si vous utilisez la méthode suivante, vous naurez peut-être pas besoin dune « attente de tous les processus » spéciale après la boucle while. La boucle attendra le courant command1
à terminer avant de revenir en haut de la page. Veuillez faire attention comme pour tout conseil. Remarquez que la seule chose que jai faite a été dajouter & wait $!
à la fin de votre command1
.
a=1 while [$a -lt 4 ] . command1 & wait $! #Generates 1 Process a= `export $a +1` done
command1
? Pouvez-vous le modifier pour quil renvoie les PID des 4 processus?$!
pour lobtenir, en la passant à la commandewait
comme je lai montré ici.$!
contient le dernier PID en arrière-plan, tandis que$$
contient le dernier processus exécuté ' s PID .