Я добавил код, чтобы :
interact() {
pid=$1
! ps -p $pid && return
ls -ld /proc/$pid/fd/*
sleep 5; kill -1 $pid # TEST SIGNAL TO PARENT
}
run() {
exec {in}<&0 {out}>&1 {err}>&2
{ coproc "$@" 0<&$in 1>&$out 2>&$err; } 2>/dev/null
exec {in}<&- {out}>&- {err}>&-
{ interact $! <&- >/tmp/whatever.log 2>&1& } 2>/dev/null
fg %1 >/dev/null 2>&1
wait 2>/dev/null
}
fg %1
будет работать для всех команд (изменить %1
по мере необходимости для параллельных заданий )и при нормальных обстоятельствах произойдет одно из двух :
interact()
немедленно вернется, так как делать нечего, и fg
ничего не сделает. interact()
может взаимодействовать (, например. отправить HUP сопроцессу через 5 секунд ), и fg
переведет сопроцесс на передний план, используя тот же стандартный ввод/вывод/ошибку, с которым он был первоначально запущен (, вы можете проверить это с помощьюls -l /proc/<pid>/df
).Перенаправления на /dev/null в последних трех командах носят косметический характер. Они позволяют run <command>
выглядеть точно так же, как если бы вы запустили command
отдельно.