Сценарий оболочки ждет команды фона

Я пишу сценарий, но мне нужно что-то, что я не могу найти способ сделать это …

Мне нужно сделать команду в фоновом режиме «command1 &», а затем где-то в скрипте мне нужно дождаться, когда она закончит, прежде чем я сделаю command2. В принципе, мне нужно это:

ПРИМЕЧАНИЕ: каждая команда запускается в определенном каталоге! в конце цикла while моя команда1 создала 4 каталога, в которых каждый из них запускает конкретный процесс, поэтому общее число операций 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 

Я просмотрел много страниц, но я не мог сделать эту простую задачу. Я видел что-то о команде wait с номером pid-процесса, но это тоже не сработало (или я не мог заставить его работать).

Кто-нибудь может мне помочь?

  • Установка шрифтов Powerline для темы zsh + Prezto
  • У меня есть команда, которая выводит каталог, и я хочу записать cd в этот каталог
  • Как извлечь IP и URL из файла журнала
  • Как использовать sed для вставки строки вверху моего файла?
  • Переменные среды установки OS X
  • Как создать защищенный паролем сценарий оболочки
  • Cronjob не выполняет сценарий оболочки, но когда я выполняю его автономно, он работает. Зачем?
  • Разница между ls-l и ll?
  • 3 Solutions collect form web for “Сценарий оболочки ждет команды фона”

    Вы можете использовать команду wait PID для ожидания завершения процесса.

    Вы также можете получить PID последней команды с помощью $!

    В вашем случае что-то вроде этого будет работать:

     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 

    После вашего редактирования, поскольку у вас несколько PID, и вы знаете их, вы можете сделать это:

     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 

    Самый простой способ сделать это – заставить ваш comamnd1 вернуть PID запущенных процессов и использовать wait на каждом из них, как это было предложено в ответном письме @ LaurentC.

    Другой подход будет примерно таким:

     ## 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 

    Если вы используете следующий метод, вам может не понадобиться специальное «ожидание для всех процессов» после цикла while. Цикл будет ждать завершения текущей command1 до того, как она вернется к началу. Будьте осторожны, как с любыми советами. Заметьте, единственное, что я сделал, это добавить & wait $! до конца вашей command1 .

     a=1 while [$a -lt 4 ] . command1 & wait $! #Generates 1 Process a= `export $a +1` done 
    Linux и Unix - лучшая ОС в мире.