1

Если вы хотите выполнить серию команд, одну за другой, вы можете выполнить

command1 & command2 & command3 &

Если я command1 , затем Ctrl+Z , а затем bg , она выполнит команду command1 в фоновом режиме.

Мой quesiton, если я выполнить command1 и отправить его на задний план, можно сказать , Баш ждать его завершения, а затем выполнить command2 и command3 в фоновом режиме после того, как она заканчивается?

2 ответа2

2

Предполагая, что вы хотите сделать что-то еще после запуска command1 , но прежде чем ждать его завершения, используйте встроенную оболочку wait .

command1 &
some_other_command
wait  # block until command1 completes

command2 &
command3 &
1

Команда wait без дополнительных спецификаций будет ожидать окончания всех активных дочерних процессов. Это означает, что если был и другой процесс, он будет ждать конца последнего, который закончится.

Ожидание может быть вызвано с указанием идентификатора: с идентификатором можно передать либо PID (идентификатор процесса), либо спецификацию задания. Более того, если это была не одна команда, а канал, то wait будет ждать конца полного конвейера (см. Ниже).

Таким образом, с wait 7165 он будет ждать конца процесса с идентификатором 7165, с wait %2 задания [2] .

В скрипте вы можете сохранить PID последнего отправленного задания, используя переменную $!; вам нужно сохранить это значение, потому что оно будет обновляться после каждого выполнения команды.

#!/bin/bash
...
command1 &                             # Another command in background  job [1]
command2 && command2b && command2c &   # The command in background      job [2]
PID_CMD1=$!                            # Store the PID of the last job, job [2]

some_other_commands       # ...       

                          # With this command you will 
wait                      # block all until command0 and all  
                          # the pipe of command1 are completed or...

wait $PID_CMD1            # With this command you will wait only the end
                          # of command1 pipeline or...

wait %2                   # With this command you'll wait the end of job [2]    
                          # Note that if the command 1 fails or is really fast 
                          # you can have for the command 2 the job ID 1
command3 &                # job [1] again! it's possible to recycle the numbers
command4 &                # job [2] 

От man bash:

Оболочка связывает работу с каждым конвейером. В нем хранится таблица выполняемых в данный момент заданий, которая может быть указана с помощью команды jobs. Когда bash запускает задание асинхронно (в фоновом режиме), он печатает строку, которая выглядит следующим образом:
[1] 25647
это означает, что это задание № 1 и что идентификатор процесса последнего процесса в конвейере, связанного с этим заданием, равен 25647. Все процессы в одном конвейере являются членами одной и той же работы. Bash использует абстракцию работы как основу для контроля работы ...

Вы можете прочитать больше об ожидании с help wait .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .