Ich zeige tatsächlich genau, wie so etwas in einer anderen Antwort hier gemacht werden könnte . Diese Antwort bezog sich auf eine Frage, wie sichergestellt werden kann, dass 2 Protokolle von einem Hintergrundprozess verwaltet werden. Deshalb habe ich sie mit 10 demonstriert.
Demo-Skript
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
Führen Sie die Demo aus
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
Ausgabe:
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
Das Obige zeigt. Es baut und betreibt ein Skript mit dem Namen /tmp/script
, chmod
ist es als ausführbare Datei, und führt es in dem &background
von ein &backgrounded ( subshell )
.
Das Skript rms /tmp/file0-9
10 Dateien und echoes
eine Zeile jede Sekunde in alle 10 von ihnen. Ich nehme einige $info
aus dem abgelehnten Prozess auf und präsentiere sie über $(command substitution). While ps
Standbildberichte zu dem von $pid
mir erfassten. Ich weiß, dass sie immer noch ausgeführt werden. sleep.
Wenn sie abgeschlossen sind, werden die Zeilen in allen 10 Dateien gezähltwc.
Nachdem Sie einen Prozess auf diese Weise aufgerufen haben, können Sie den ursprünglichen übergeordneten Prozess frei schließen und er wird weiter transportiert - er wird effektiv abgelehnt. Dies bedeutet auch, dass Sie den herkömmlichen wait
Befehl nicht verwenden können , aber das Warten auf ps
die Rückkehr sollte in jedem Fall robuster sein.
Erwähnenswert ist meiner Meinung nach, dass der Prozess zunächst tatsächlich aufgerufen wird $(command substitution)
und printfs
ich das $info
möchte, damit ich ihn effektiv steuern kann. Aber sobald es seinen Terminalausgang mit exec 1>&2
(der in derselben Subshell mit geschlossen ist 2>&-
) fallen lässt, entkommt der Prozess und ich muss am anderen Ende darauf warten. Ein bisschen das Beste aus beiden Welten, besonders wenn Sie es für die Handhabung von Eingangsleitungen verwenden, solange Sie sich um alle Umleitungen und Prozessleiter kümmern können.
Alles andere dient hier nur zur Demonstration. Alles was Sie brauchen, um dies auszuführen, ist das Top-Skript und:
info="$(($script_path &)2>&- &)"
HINWEIS: Dies druckt nur genau das auf das Terminal, was ich demonstrieren wollte. Wie dies festgestellt wurde, wird$PPID,
dieser Prozess vom Terminal abgelehnt und ist ein direktes Kind von$PID 1.
Wenn Sie zwei davon gleichzeitig ps
ausführen und auf sie warten möchten, können Sie einfach beide Pids übergeben und warten.