Le script shell attend la commande darrière-plan

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

  • Contrôlez-vous command1? Pouvez-vous le modifier pour quil renvoie les PID des 4 processus?
  • Oui! je lai déjà 🙂
  • Jai mis à jour ma réponse en conséquence. Dites-moi si cela correspond à vos attentes.
  • Ce Q est lié à celui-ci: unix.stackexchange.com/questions/100801/… . La seule différence est que vous devez obtenir le PID à partir dun processus en arrière-plan. Vous pouvez utiliser la variable $! pour lobtenir, en la passant à la commande wait comme je lai montré ici. $! contient le dernier PID en arrière-plan, tandis que $$ contient le dernier processus exécuté ' s PID .
  • OK, maintenant votre script na aucun sens. Il y a des erreurs de syntaxe et des étrangetés tout autour. Pouvez-vous nous montrer le script réel ? Pourquoi recherchez-vous des commandes? Pourquoi ne pas simplement les exécuter?

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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *