Eu realmente demonstro exatamente como esse tipo de coisa pode ser feito em outra resposta. -background-nohoup / 121380 # 121380 "> aqui . Essa resposta foi para uma pergunta sobre a garantia de que dois logs foram mantidos por um processo em segundo plano, então eu demonstrei isso 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
Execução da 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
Saída:
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 demonstra. Ele cria e executa um script chamado /tmp/script
, chmod
's como executável, e o executa no &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. Eu capturei alguns $info
do processo de renome e o apresente via $(command substitution). While ps
ainda relata o $pid
que eu capturei, eu sei ele ainda roda, então eu sleep.
Quando ele é concluído, as linhas em todos os 10 arquivos são contadas com wc.
Depois de invocar um processo dessa maneira, você pode fechar livremente o processo original do pai e ele continuará no transporte - ele é efetivamente deserdado. Isso também significa que você não pode usar o comando convencional wait
, mas aguardar o retorno do ps
deve ser mais robusto em qualquer caso.
Vale a pena mencionar que, na verdade, o processo é chamado inicialmente em $(command substitution)
e printfs
me em $info
Eu quero que eu possa efetivamente controlá-lo. Mas, assim que a saída do terminal é descartada com exec 1>&2
(que é fechado no mesmo subshell com 2>&-
), o processo escapa e eu tenho que esperar por ele na outra ponta. O melhor dos dois mundos, especialmente se você usá-lo para manipular os canos de entrada, contanto que você possa envolver todos os redirecionamentos e líderes de processo.
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. Como observado pelo $PPID,
, este processo é rejeitado pelo terminal e é um filho direto de $PID 1.
Se você quisesse executar dois destes ao mesmo tempo e esperar por eles, poderia entregar ps
ambos os pids e esperar.