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

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

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

  • Назначение по умолчанию для нулевой переменной с заменой команды
  • как конвертировать число в формат времени в сценарии оболочки?
  • Как я могу полностью удалить элемент из массива?
  • Пользователь Admin не показывает путь к папке в консольной строке, только $
  • Время вилки против поточной системы
  • Как игнорировать строки начинаются с # с помощью grep / awk
  • ПРИМЕЧАНИЕ: каждая команда запускается в определенном каталоге! в конце цикла 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-процесса, но это тоже не сработало (или я не мог заставить его работать).

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

  • Передайте список каталогов (содержащих пробелы) в команду в скрипте
  • Какой интерпретатор оболочки запускает скрипт без shebang?
  • Сценарий оболочки для перемещения файлов между двумя каталогами
  • путают с переменными awk и shell
  • Проверка того, может ли парольная фраза расшифровывать симметрично зашифрованные файлы
  • Почему set -e не работает внутри () ||
  • 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 - лучшая ОС в мире.