Я на самому ділі продемонструвати , як саме такого роду речі можна було б зробити в інший відповідь тут . Ця відповідь була на запитання про те, щоб два журнали підтримувалися фоновим процесом, тому я продемонстрував це за допомогою 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захоплення, я знаю, що він все ще працює, тому я sleep.Коли він завершується, рядки у всіх 10 файлах підраховуютьсяwc.
Після того, як ви викликаєте процес таким чином, ви можете вільно закрити його початковий батьківський процес, і він продовжуватиме перевірку - він фактично відмовляється. Це також означає , що ви не можете використовувати звичайну waitкоманду, але очікування ps«S повернення повинні бути більш надійними в будь-якому випадку.
Варто відзначити, я думаю, що цей процес на самому справі спочатку викликав $(command substitution)і printfsмені $infoя хочу , щоб я міг ефективно контролювати. Але як тільки він скидає свій термінальний вихід з exec 1>&2(який закритий у тій же підпалі 2>&-), процес виходить з ладу, і мені доведеться чекати його на іншому кінці. Начебто найкраще з обох світів, особливо якщо ви використовуєте його для обробки вхідних труб, якщо ви зможете обернутись усіма перенаправленнями та лідерами процесів.
Все інше тут лише для демонстрації. Все, що вам потрібно для запуску, - це верхній сценарій і:
info="$(($script_path &)2>&- &)"
ПРИМІТКА. Це тільки друкує на термінал саме те, що я хотів продемонструвати. Як зазначається в$PPID,цьому процесі, цей процес відхиляється від терміналу і є безпосередньою дитиною$PID 1.
Якщо ви хотіли одночасно запустити два з них і чекати їх, ви можете просто вручити psобидва їхні припуски і зачекати.