Я на самом деле продемонстрировать , как именно такого рода вещи можно было бы сделать в другой ответ здесь . Этот ответ был на вопрос о том, что 2 журнала были сохранены в фоновом режиме, поэтому я продемонстрировал это с 10.
Демо-сценарий
cat <<-\DEMO >|${s=/tmp/script}
printf 'tty is %s\nparent pid is %s\npid is pid=%s\n' \
"$(tty)" "$PPID" "$$"
exec 1>&2 ; nums=$(seq 0 9)
rm ${files=$(printf "/tmp/file%s\n" $nums)}
for n in $nums ; do { for f in $files ; do
echo "Line $n" >>"$f" ; done
sleep 1 ; } ; done
#END
DEMO
Запустить демо
s=/tmp/script ;chmod +x $s ;info="$(($s &)2>&- &)"
echo "$info" ; pid="${info##*=}" ; echo
while ps -p $pid >/dev/null ; do sleep 3 ; done
for f in /tmp/file[0-9] ; do
printf 'path : %s\tline count : %s\n' \
$f $(<$f wc -l)
done
Вывод:
tty is not a tty
parent pid is 1
pid is 12123
path : /tmp/file0 line count : 10
path : /tmp/file1 line count : 10
path : /tmp/file2 line count : 10
path : /tmp/file3 line count : 10
path : /tmp/file4 line count : 10
path : /tmp/file5 line count : 10
path : /tmp/file6 line count : 10
path : /tmp/file7 line count : 10
path : /tmp/file8 line count : 10
path : /tmp/file9 line count : 10
Вышесказанное демонстрирует. Он строит и запускает скрипт с именем /tmp/script
, chmod
«S как исполняемый файл и запускает его в &background
из &backgrounded ( subshell )
.
В скрипте rms /tmp/file0-9
10 файлов и echoes
строка каждую секунду во все 10 из них. Я получаю некоторые данные $info
из процесса, который был отменен, и представляю их в виде $(command substitution). While ps
еще отчетов о $pid
захвате I, я знаю, что они все еще выполняются, поэтому я. sleep.
После завершения строки во всех 10 файлах подсчитываются сwc.
После того, как вы вызовете процесс таким способом, вы можете свободно закрыть его исходный родительский процесс, и он продолжит отправлять сообщения - он фактически откажется. Это также означает , что вы не можете использовать обычную wait
команду, но ожидание ps
«S возвращения должны быть более надежными в любом случае.
Стоит отметить, я думаю, что этот процесс на самом деле изначально вызвал $(command substitution)
и printfs
мне $info
я хочу , чтобы я мог эффективно контролировать. Но как только он сбрасывает свой вывод терминала с exec 1>&2
(который закрыт в той же подоболочке с 2>&-
), процесс завершается, и мне приходится ждать его на другом конце. Вроде как лучшее из обоих миров, особенно если вы используете его для обработки входных каналов, если вы можете сосредоточиться на всех перенаправлениях и лидерах процессов.
Все остальное здесь просто для демонстрации. Все, что вам нужно для запуска, это верхний скрипт и:
info="$(($script_path &)2>&- &)"
ПРИМЕЧАНИЕ. Это выводит на терминал только то, что я хотел продемонстрировать. Как отмечено,$PPID,
этот процесс отвергается терминалом и является прямым потомком$PID 1.
Если вы хотите запустить два из них одновременно и ждать их, вы можете просто сдать ps
оба пида и подождать.