En fait, je montre exactement comment ce genre de chose pourrait être fait dans une autre réponse ici . Cette réponse était à une question sur la garantie que 2 journaux étaient maintenus par un processus d'arrière-plan, donc je l'ai démontré avec 10.
Script de démonstration
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
Lancer la démo
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
Production:
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
Ce qui précède le démontre. Il construit et exécute un script nommé /tmp/script
, chmod
« est comme exécutable, et il exécute en &background
un &backgrounded ( subshell )
.
Le script rms /tmp/file0-9
10 fichiers et echoes
une ligne chaque seconde dans chacun des 10 d'entre eux. J'en capture une partie $info
du processus désavoué et je la présente via des $(command substitution). While ps
rapports fixes sur la $pid
capture I, je sais qu'elle s'exécute toujours donc I sleep.
Une fois terminée, les lignes des 10 fichiers sont comptées avecwc.
Après avoir invoqué un processus de cette manière, vous pouvez fermer librement son processus parent d'origine et il continuera à se déplacer - il est effectivement renié. Cela signifie également que vous ne pouvez pas utiliser la classique wait
commande, mais en attente sur ps
des » retour devrait être plus robuste dans tous les cas.
Il convient de mentionner, je pense, que le processus est en fait initialement appelé $(command substitution)
et printfs
que $info
je souhaite que je puisse le contrôler efficacement. Mais dès qu'il laisse tomber sa sortie de terminal avec exec 1>&2
(qui est fermée dans le même sous-shell avec 2>&-
), le processus s'échappe et je dois l'attendre à l'autre bout. Un peu le meilleur des deux mondes, surtout si vous l'utilisez pour gérer les canaux d'entrée, tant que vous pouvez vous concentrer sur toutes les redirections et les leaders de processus.
Tout le reste est juste pour démonstration ici. Tout ce dont vous avez besoin pour exécuter ceci est le meilleur script et:
info="$(($script_path &)2>&- &)"
REMARQUE: cela imprime uniquement au terminal exactement ce que je voulais démontrer. Comme indiqué par le$PPID,
processus, ce terminal est renié par le terminal et est un enfant direct de$PID 1.
Si vous vouliez exécuter deux d'entre eux en même temps et les attendre, vous pouvez simplement remettre leurs ps
deux pids et attendre.