Na verdade, demonstro exatamente como esse tipo de coisa pode ser feito em outra resposta aqui . Essa resposta foi para uma pergunta sobre como garantir que 2 logs fossem mantidos por um processo em segundo plano, então demonstrei com 10.
Script de demonstração
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
Executar demonstração
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
Resultado:
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
O acima demonstrado. Ele cria e executa um script chamado /tmp/script, chmodé que como executável, e executa-lo na &backgroundde um &backgrounded ( subshell ).
O script rms /tmp/file0-910 arquivos e echoesuma linha a cada segundo em todos os 10 deles. Capto alguns $infodo processo renegado e o apresento através de $(command substitution). While psrelatórios estáticos na $pidcaptura, sei que ainda é executado. sleep.Quando termina, as linhas dos 10 arquivos são contadas comwc.
Depois de chamar um processo dessa maneira, você pode fechar livremente o processo pai original e ele continuará sendo transportado - ele é efetivamente rejeitado. Isso também significa que você não pode usar o waitcomando convencional , mas aguardar pso retorno deve ser mais robusto em qualquer caso.
Vale mencionar, eu acho, que o processo é realmente chamado inicialmente $(command substitution)e printfseu o que $infoeu quero para que eu possa efetivamente controlá-lo. Mas assim que diminui sua saída do terminal exec 1>&2(que é fechada no mesmo subshell 2>&-), o processo escapa e eu tenho que esperar por isso do outro lado. É o melhor dos dois mundos, especialmente se você o usa para manipular canais de entrada, desde que possa se concentrar em todos os redirecionamentos e líderes de processos.
Tudo o resto é apenas para demonstração aqui. Tudo o que você precisa para executar este é o script principal e:
info="$(($script_path &)2>&- &)"
NOTA: Isso só imprime no terminal exatamente o que eu queria demonstrar. Conforme observado pelo$PPID,processo, este é renegado pelo terminal e é filho direto de$PID 1.
Se você deseja executar duas delas simultaneamente e esperar por elas, basta entregar os psdois pids e esperar.