Используйте wait
с PID, который будет:
Дождаться, пока дочерний процесс, указанный каждым идентификатором процесса pid или спецификация задания jobpec завершает работу и возвращает статус завершения последней ожидаемой команды.
Вам нужно будет сохранять PID каждого процесса по мере продвижения:
echo "x" & X=$!
echo "y" & Y=$!
echo "z" & Z=$!
Вы также можете включить управление заданиями в сценарии с помощью set -m
и использовать % n
jobspec, но вы почти наверняка не захотите - управление заданиями имеет множество других побочных эффектов .
wait
вернет тот же код, что и завершенный процесс. Вы можете использовать wait $ X
в любой (разумный) более поздний момент, чтобы получить доступ к окончательному коду как $?
или просто использовать его как истину / ложь:
echo "x" & X=$!
echo "y" & Y=$!
...
wait $X
echo "job X returned $?"
wait
будет сделайте паузу, пока команда не завершится, если это еще не сделано.
Если вы хотите избежать подобного зависания, вы можете установить ловушку
на SIGCHLD
, подсчитать количество завершений и обработать все wait
сразу, когда они все закончат. Вам, вероятно, удастся почти все время использовать только wait
.
Я полагаю, что вы ищете команду setsid
, которая запускает программу в новом сеансе. Итак, вы можете:
setsid apt-get update
И, если вы хотите, чтобы apt-get update
молчал:
setsid apt-get update >/dev/null 2>&1
Хорошая вещь с setsid
заключается в том, что процесс, начатый таким образом, продолжится. после закрытия терминала.
nohup apt-get update > /dev/null 2> /dev/null < /dev/null & vi /some/config
https://en.wikipedia.org/wiki/Nohup#Overcoming_hanging
технически nohup подразумевает, что стандартный ввод — это /dev/null, поэтому < /dev/null
не нужен
apt-get update > /dev/null 2>&1 &
apt-get update
— это команда, которую вы хотите запустить.
> /dev/null
передает весь стандартный вывод в /dev/null, который по умолчанию избавляется от него. Вы можете указать файл журнала, если хотите посмотреть результат позже.
2>&1
направляет stderr в stdout. Вы можете заменить &1 файлом журнала, если хотите увидеть какие-либо ошибки.
&
запускает команду в фоновом режиме. Чтобы увидеть, что работает в фоновом режиме, попробуйте jobs
. Если вы хотите впоследствии связать процесс с вашей оболочкой, вы можете запустить fg
. Если вы хотите, чтобы он выжил после закрытия терминала, вы можете отказаться
от фоновых процессов.
"< /dev/null" считывает стандартный ввод из /dev/null — обычный перенаправленный ввод. Это немедленно возвращает EOF, т.е. чтение из пустого файла. Это полезная идиома для случаев, когда вы хотите иногда читать из STDIN, но не в этом случае.
Похоже, вы ищете, как запустить процесс в фоновом режиме, позволяя вам одновременно выполнять другую работу. Это достигается добавлением амперсанда в конце команды. Например, через несколько миллисекунд после запуска sleep 5h
вы можете ввести другую команду, в то время как фоновая команда делает свое дело. Чтобы процесс пережил закрытие терминала, вам придется сделать его осиротевшим, используя disown
, а чтобы не видеть стандартный вывод (или стандартную ошибку ), вы можете использовать перенаправления . См. управление процессами и управление заданиями для отличной документации.
В качестве альтернативы вы можете запустить команду на переднем плане и просто запустить другой терминал, чтобы сделать что-то еще. Об остальном позаботится ОС.
В дополнение к другим ответам (например. фоновое задание, nohup (1)и т. д. )вы можете рассмотреть возможность использованияbatch
(из пакета at
, который необходимо установить )с здесь документом , например
batch << ENDOFJOB
apt-get update
apt-get upgrade
ENDOFJOB
(для запуска команд администратора, таких как apt-get
, вам может потребоваться запустить batch
от имени пользователя root)
Посмотрите также в crontab (5)файлы с командой crontab (1)и в anacron (8).
Конечно, вы можете захотеть перенаправить оба stdout и stderr ваших apt-get
команд (, которым вы, возможно, захотите передать --yes
; read apt -get (8 )), возможно, используя что-то вродеapt-get update >& /tmp/your-apt-get-update.output
.
Относительно /dev/null
читать ноль (4).