In realtà, dimostrerò esattamente come questo genere di cose potrebbe essere fatto in un'altra risposta qui . Quella risposta era una domanda su come garantire che 2 log fossero gestiti da un processo in background, quindi l'ho dimostrato con 10.
Demo Script
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
Esegui 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
Produzione:
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
Quanto sopra dimostra. Si costruisce e esegue uno script chiamato /tmp/script
, chmod
'il come eseguibile, e lo esegue in &background
una &backgrounded ( subshell )
.
Lo script rms /tmp/file0-9
10 file e echoes
una riga ogni secondo in tutti e 10. Ne acquisisco alcuni $info
dal processo sconosciuto e lo presento tramite $(command substitution). While ps
report ancora $pid
sull'acquisizione, so che funziona ancora così I sleep.
Quando viene completato, le righe in tutti i 10 file vengono conteggiate conwc.
Dopo aver invocato un processo in questo modo, puoi chiudere liberamente il suo processo genitore originale e continuerà a trasportare camion: è effettivamente rinnegato. Questo significa anche che non è possibile utilizzare il tradizionale wait
comando, ma in attesa di ps
's ritorno dovrebbe essere più robusto, in ogni caso.
Vale la pena ricordare che penso che il processo sia stato inizialmente chiamato $(command substitution)
e printfs
me lo $info
voglio, così posso controllarlo efficacemente. Ma non appena rilascia l'output del terminale con exec 1>&2
(che è chiuso nella stessa subshell con 2>&-
), il processo sfugge e devo aspettare all'altra estremità. Kinda il meglio di entrambi i mondi, specialmente se lo usi per gestire i tubi di input, a patto che tu possa avvolgere la tua mente intorno a tutti i reindirizzamenti e ai leader di processo.
Tutto il resto è solo per dimostrazione qui. Tutto ciò che serve per eseguire questo è lo script principale e:
info="$(($script_path &)2>&- &)"
NOTA: Questo stampa solo sul terminale esattamente ciò che desideravo dimostrarlo. Come notato da$PPID,
questo processo è rinnegato dal terminale ed è figlio diretto di$PID 1.
Se volessi eseguire due di questi contemporaneamente e aspettarli, potresti semplicemente consegnare ps
entrambi i loro pid e aspettare.