Tenho (ainda) outro wait
, &
, &&
pergunta fluxo de controle ..
Digamos que eu tenha um script parecido com este, onde eu queira fazer o máximo de trabalho possível ao mesmo tempo:
# may take some hours
something InputA > IrrelevantA &
something InputB > IrrelevantB &
# may take an hour
(
somethingElse InputA > OutputA &
somethingElse InputB > OutputB &
)&& combine OutputA OutputB > Result
...morestuff
Pergunta 1: No script, combine
aguarda somethingElse
a conclusão de ambos os something
processos enquanto ambos continuam?
Pergunta 2: Se não - e eu suspeito que não - como posso combine
esperar apenas pelos dois somethingElse
processos, enquanto os something
processos acima continuam funcionando em segundo plano?
fonte
Processo de substituição seria mais eficiente, especialmente se você não precisa para salvar os arquivos
OutputA
eOutputB
, e se preocupam apenas comResult
? Isso economizaria particularmente tempo, porque se você tiver uma E / S lenta ao gravar no disco, salvar os arquivosOutputA
eOutputB
pode ser a etapa de limitação de taxa?A substituição do processo permite que você insira o comando em
<(..here..)
vez de salvar a saída em um arquivo e, em seguida, leia-o como entrada na etapa "combinar".Se a memória é uma limitação, e o tamanho
outputA
eoutputB
mais do que a memória pode conter, ela derrotará todo o propósito?Esperará
combine
até que ambos os processos sejam concluídos antes de começar a execução?fonte
combine
começará a funcionar assim que os doissomethingElse
comandos forem iniciados, mas tudo bem, porque as<(…)
coisas são canalizações; então,combine
será simplesmente forçado a aguardar pelos dados, se eles ultrapassarem ossomethingElse
processos. E, por serem tubos, o tamanho não é um problema. … (Continua)somethingElse
processos - e não está totalmente claro se isso é importante para o solicitante. Mas, também, uma resposta não deve ser fazer perguntas como essa.Você pode usar o
wait
comando:Você pode ver a linha "inicial" acontecendo imediatamente e o "pronto" aguarda 10 segundos.
fonte
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
Executar demonstração
Resultado:
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 eechoes
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 aguardarps
o retorno deve ser mais robusto em qualquer caso.Vale mencionar, eu acho, que o processo é realmente chamado inicialmente
$(command substitution)
eprintfs
eu o que$info
eu quero para que eu possa efetivamente controlá-lo. Mas assim que diminui sua saída do terminalexec 1>&2
(que é fechada no mesmo subshell2>&-
), 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:
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.fonte