Я на самом деле продемонстрировать , как именно такого рода вещи можно было бы сделать в другой ответ здесь . Этот ответ был на вопрос о том, что 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-910 файлов и 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оба пида и подождать.