Присвойте pid фонового процесса Подоболочки переменной

При выполнении машины на VM можно временно отстранить гостя ОС и запустить ее снова после аппаратных перезагрузок.

5
24.09.2014, 16:29
2 ответа

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"
8
27.01.2020, 20:35

Вторая линия может «Работа

({ 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 с любым файлом.

2
27.01.2020, 20:35

Теги

Похожие вопросы