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 &background
de um &backgrounded ( subshell )
.
O script rms /tmp/file0-9
10 arquivos e echoes
uma linha a cada segundo em todos os 10 deles. Capto alguns $info
do processo renegado e o apresento através de $(command substitution). While ps
relatórios estáticos na $pid
captura, 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 wait
comando convencional , mas aguardar ps
o retorno deve ser mais robusto em qualquer caso.
Vale mencionar, eu acho, que o processo é realmente chamado inicialmente $(command substitution)
e printfs
eu o que $info
eu 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 ps
dois pids e esperar.