При выполнении машины на VM можно временно отстранить гостя ОС и запустить ее снова после аппаратных перезагрузок.
bash
не должен выводить статус задания в неинтерактивном режиме.
Если это действительно для интерактивного bash
, вы можете сделать следующее:
{ pid=$(sleep 20 >&3 3>&- & echo "$!"); } 3>&1
Мы хотим, чтобы стандартный вывод sleep
шел туда, где он был раньше, а не канал, который питает переменная $ pid
. Поэтому мы сохраняем внешний стандартный вывод в файловом дескрипторе 3 ( 3> & 1
) и восстанавливаем его для сна
внутри подстановки команд. Итак, pid = $ (...)
возвращается, как только echo
завершается, потому что ничего не осталось с открытым дескриптором файла для канала, который передает $ pid
.
Однако обратите внимание, что поскольку он запускается из подоболочки (здесь в подстановке команд), этот sleep
не будет выполняться в отдельной группе процессов. Так что это не то же самое, что запуск sleep 20 и
, например, в отношении ввода-вывода на терминал.
Возможно, лучше было бы использовать оболочку, которая поддерживает создание отклоненных фоновых заданий, таких как zsh
, где вы можете:
sleep 20 &! pid=$!
С bash
вы можете приблизить его с помощью:
{ sleep 20 2>&3 3>&- & } 3>&2 2> /dev/null; pid=$!; disown "$pid"
bash
выводит [1] 21578
в stderr. Итак, мы снова сохраняем stderr перед перенаправлением в / dev / null и восстанавливаем его для команды sleep
. Таким образом, [1] 21578
переходит в / dev / null
, но stderr sleep
работает как обычно.
Если вы все равно собираетесь перенаправить все в / dev / null, вы можете просто сделать:
{ apt-get update & } > /dev/null 2>&1; pid=$!; disown "$pid"
Перенаправить только stdout:
{ apt-get-update 2>&3 3>&- & } 3>&2 > /dev/null 2>&1; pid=$!; disown "$pid"
Вторая линия может «Работа
({ sleep 2 & }; $MYPID=$!)
({ sleep 2 & }; $MYPID=$!)
(...)
Fork A Subshell, MYPID устанавливается, затем выход подставки, и его значение потеряно.
Третья строка не работала ни
({ sleep 2 & }; echo $!) > $MYPID
Вы просто эхо $! в файл с именем 0 на локальном режиме.
Единственный ответ, который я могу предоставить, - это временный файл (в качестве var не может быть затянутым)
( { sleep 100 & } ; echo $! > u ) > /dev/null &> /dev/null
MYPID=$(<u)
Вы можете заменить U
с любым файлом.