Dokładnie pokazuję, jak można tego dokonać w innej odpowiedzi tutaj . Ta odpowiedź była na pytanie o to, czy 2 dzienniki były utrzymywane przez proces w tle, więc zademonstrowałem to z 10.
Skrypt demonstracyjny
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
Uruchom wersję demonstracyjną
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
Wynik:
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
Powyższe pokazuje. Buduje i uruchamia skrypt o nazwie /tmp/script
, chmod
„s go jako plik wykonywalny, a uruchamia go w &background
tematyce &backgrounded ( subshell )
.
Skrypt rms /tmp/file0-9
10 plików i echoes
linia co sekundę we wszystkich 10 z nich. Przechwytuję niektóre $info
z odrzuconego procesu i prezentuję je za pomocą $(command substitution). While ps
raportów z $pid
przechwytywania, wiem, że nadal działa, więc I sleep.
Po zakończeniu wiersze we wszystkich 10 plikach są liczonewc.
Po wywołaniu procesu w ten sposób możesz swobodnie zamknąć jego pierwotny proces nadrzędny, a on będzie kontynuował przewóz - jest on skutecznie odrzucany. Oznacza to również, że nie można korzystać z tradycyjnego wait
polecenia, ale czeka na ps
„s zwrotu powinny być bardziej wytrzymałe w każdym przypadku.
Warto wspomnieć, jak sądzę, jest to, że proces ten jest rzeczywiście początkowo wezwany $(command substitution)
i printfs
ME $info
Chcę więc mogę skutecznie kontrolować. Ale jak tylko upuści swoje wyjście terminalowe za pomocą exec 1>&2
(który jest zamknięty w tej samej podpowłoce z 2>&-
), proces ucieka i muszę czekać na to z drugiej strony. Niby najlepszy z obu światów, zwłaszcza jeśli używasz go do obsługi rur wejściowych, o ile możesz otoczyć wszystkie przekierowania i liderów procesów.
Wszystko inne służy tutaj tylko do demonstracji. Wszystko, czego potrzebujesz, aby uruchomić, to najwyższy skrypt i:
info="$(($script_path &)2>&- &)"
UWAGA: To drukuje tylko na terminalu dokładnie to, co chciałem to zademonstrować. Jak zauważono w$PPID,
tym procesie, ten proces jest odrzucany przez terminal i jest bezpośrednim potomkiem$PID 1.
Jeśli chcesz uruchomić dwa z nich jednocześnie i poczekać na nie, możesz po prostu ps
podać oba ich numery i czekać.