Já existe uma resposta que fornece um snippet de código aprimorado para a tarefa relacionada às perguntas do pôster original, embora ainda não tenha respondido mais diretamente à pergunta.
A questão é sobre diferenças de
- A) Plano de fundo de um "comando" diretamente, vs
- B) Colocar um subshell no segundo plano (ou seja, com uma tarefa semelhante)
Permite verificar essas diferenças executando 2 testes
# A) Backgrounding a command directly
sleep 2 & ps
saídas
[1] 4228
PID TTY TIME CMD
4216 pts/8 00:00:00 sh
4228 pts/8 00:00:00 sleep
enquanto
# A) backgrounding a subhell (with similar tas)
( sleep 2; ) & ps
apresenta algo como:
[1] 3252
PID TTY TIME CMD
3216 pts/8 00:00:00 sh
3252 pts/8 00:00:00 sh
3253 pts/8 00:00:00 ps
3254 pts/8 00:00:00 sleep
** Resultados do teste: **
Neste teste (que executa apenas um sleep 2 ) a versão do subshell realmente difere, pois usaria 2 processos filhos (isto é, dois fork() / exec operations e PID) e, portanto, mais do que o background direto de o comando.
No script 1 da questão, no entanto, o comando não era um único sleep 2s , mas sim um pipe de 4 comandos, que, se testarmos em um caso adicional
-
C) Plano de fundo de um pipe com 4 comandos
C) Plano de fundo de um pipe com 4 comandos
dormir 2s | dormir 2s | dormir 2s | dormir 2s & ps
produz isso
[2] 3265
PID TTY TIME CMD
3216 pts/8 00:00:00 bash
3262 pts/8 00:00:00 sleep
3263 pts/8 00:00:00 sleep
3264 pts/8 00:00:00 sleep
3265 pts/8 00:00:00 sleep
3266 pts/8 00:00:00 ps
e mostra que, de fato, o script 1 seria um aumento muito maior em termos de PIDs e fork() s.
Como uma estimativa aproximada, o script teria usado cerca de 254 * 4 ~ = 1000 PIDs e, portanto, ainda mais do que o script 2 com 254 * 2 ~ = 500 PIDs. Qualquer problema que ocorra por causa de PIDs depleção resouce parece ainda improvável, pois na maioria das caixas de linux
$ cat /proc/sys/kernel/pid_max
32768
dá 32x vezes os PIDs necessários mesmo para o caso script 1 e os processos / programas envolvidos (por exemplo, sed , ping , etc) também parecem não causar os resultados inconstantes.
Como mencionado pelo usuário @derobert, o problema real por trás da scripts falha foi que a falta do comando wait , o que significa que após o background dos comandos no loop, o final do script e, portanto, o shell causou todos os processos filhos a serem finalizados.