Я столкнулся с проблемой головной боли.
Я хочу выполнять несколько команд в фоновом режиме, поэтому я хочу запускать их в bash одну за другой. Легко запустить одну команду в оболочке linux в фоновом режиме, например:
myCommand &
Также легко запустить несколько команд, например:
myCommand1 && myCommand2
или
myCommand1 ; myCommand2
Но если я хочу выполнить несколько команд в фоновом режиме, я попробовал следующий формат команды, но не получилось:
myCommand1 & && myCommand2 &
или
myCommand1 & ; myCommand2 &
Оба формата не пройдены. Как я могу запустить несколько команд, которые имеют &
в одной командной строке?
Используйте ().
Если вы хотите запустить их последовательно:
(myCommand1; myCommand2) &
или
(myCommand1 &) && (myCommand2 &)
Если вы хотите, чтобы они работали параллельно:
myCommand1 & myCommand2 &
<час> В bash вы также можете использовать это (пробел за {и; обязательны для заполнения):
{ myCommand1 && myCommand2; } &
Я полагаю, вы хотите это:
myCommand1 & myCommand2 &
Это запускает myCommand1
и отправляет его в фоновый режим, за которым следует амперсанд, затем немедленно запускает myCommand2
и отправляет также это в фоновый режим, поэтому снова выпустив раковину.
Для лучшего понимания вы можете заменить здесь pipe командой .
Список - это последовательность из одного или нескольких конвейеров, разделенных одним из операторов , , и , и , или || и необязательно завершается одним из , , и или .
Если команда завершается оператором управления и , оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ожидает завершения команды, и возвращаемое состояние равно 0. Команды, разделенные ; , выполняются последовательно; оболочка ожидает завершения каждой команды по очереди. Статус возврата - это статус выхода последней выполненной команды.
Списки И и ИЛИ - это последовательности одного или нескольких конвейеров, разделенных управляющими операторами и и || соответственно.
Источник:man bash
Давайте разберем это на примерах. Вы можете создать список, комбинируя команды и разделяя их одним из них: ; & && ||
:
command1 ; command2 # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2 # runs simultaneously
Вы можете завершить списки одним из них: ; & <newline>
.
Обычно вы выполняете команду или список, нажимая Enter kbd>, что равно <newline>
. Точка с запятой ;
служит той же цели, особенно в сценариях. Амперсанд &
, однако, запускает команду (и) в подоболочке в фоновом режиме, немедленно освобождая оболочку.
Вы можете использовать круглые ()
или фигурные скобки {}
для дальнейшей группировки списков, с той разницей, что круглые скобки порождают подоболочки, а фигурные - нет. Кудрявые скобки требуют пробела после первой и точки с запятой или новой строки перед закрывающей скобкой. Например:
# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) &
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &
Это может быть довольно сложно, если вы не уверены, что используйте true
и false
, чтобы проверить, работает ли конструкция должным образом:
$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2
Команда jobs
отображает список фоновых заданий, которые выполняются или недавно были завершены в текущей оболочке. Существует несколько сочетаний клавиш и команд для управления заданиями:
jobs
fg
= %
приводит процесс в На переднем плане, запустив его, если необходимо, вы можете указать процесс следующим образом:
% # last process in the jobs list
%1 # 1st process in the jobs list
%abc # process beginning with the string “abc”
%?abc # process containing the string “abc” anywhere
bg
= %&
переводит процесс в фоновый режим, запуская его при необходимости:
%& # last process in the jobs list
%1& # 1st process in the jobs list
%abc& # process beginning with the string “abc”
%?abc& # process containing the string “abc” anywhere
wait
ожидает завершения фонового процесса и возвращает его состояние завершения:
wait %1 # 1st process in the jobs list
Представьте, что вы начали длительный процесс (jobs
показывает это номер 3), а затем понять, что вы хотите, чтобы компьютер был приостановлен завершается, когда завершается, плюс echo
сообщение, если процесс не удался:
wait %3 || echo failed ; systemctl suspend