De hecho, demuestro exactamente cómo se podría hacer este tipo de cosas en otra respuesta aquí . Esa respuesta fue a una pregunta sobre cómo garantizar que 2 registros se mantuvieran mediante un proceso en segundo plano, así que lo demostré con 10.
Script de demostración
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
Ejecutar 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
Salida:
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
Lo anterior demuestra. Construye y ejecuta un script llamado /tmp/script
, chmod
es como ejecutable, y lo ejecuta en el &background
de a &backgrounded ( subshell )
.
El script rms /tmp/file0-9
10 archivos y echoes
una línea cada segundo en los 10 de ellos. Capturo algo $info
del proceso rechazado y lo presento a través de $(command substitution). While ps
informes fijos sobre la $pid
captura, sé que todavía se ejecuta, así que sleep.
cuando se completa, se cuentan las líneas en los 10 archivos conwc.
Después de invocar un proceso de esta manera, puede cerrar libremente su proceso padre original y continuará transportando en camiones: se desautoriza efectivamente. Esto también significa que no puede utilizar el convencional wait
de comandos, pero espera en ps
's de retorno debe ser más robusto en cualquier caso.
Vale la pena mencionar, creo, que el proceso se llama inicialmente $(command substitution)
y printfs
yo $info
lo deseo para poder controlarlo de manera efectiva. Pero tan pronto como deja caer su salida de terminal con exec 1>&2
(que se cierra en la misma subshell con 2>&-
), el proceso se escapa y tengo que esperar en el otro extremo. Un poco lo mejor de ambos mundos, especialmente si lo usa para manejar tuberías de entrada, siempre que pueda comprender todas las redirecciones y líderes de procesos.
Todo lo demás es solo para demostración aquí. Todo lo que necesita para ejecutar este es el script superior y:
info="$(($script_path &)2>&- &)"
NOTA: Esto solo imprime en la terminal exactamente lo que deseaba demostrar. Como se señaló en$PPID,
este proceso, el terminal no lo reconoce y es un hijo directo de$PID 1.
Si desea ejecutar dos de estos al mismo tiempo y esperarlos, simplemente puede entregar ps
sus dos pids y esperar.