Eu tenho um script que gostaria de bifurcar em um ponto para que duas cópias do mesmo script estejam em execução.
Por exemplo, eu gostaria que o seguinte script bash existisse:
echo $$
do_fork()
echo $$
Se esse script bash realmente existisse, a saída esperada seria:
<ProcessA PID>
<ProcessB PID>
<ProcessA PID>
ou
<ProcessA PID>
<ProcessA PID>
<ProcessB PID>
Existe algo que eu possa colocar no lugar de "do_fork ()" para obter esse tipo de saída ou fazer com que o script bash execute um fork do tipo C?
&
é fork, não há nenhum executivo envolvido. Fork + exec é quando você inicia um comando externo.exec
, mas os dois idiomas têm um fluxo de controle diferente.&
inicia um subshell no qual o comando fornecido é executado. Fork + exec. Você não pode simplesmente colocar&
sem nenhum comando anterior para executar.&
uma linha sozinha. Mas você não pode. Isso não significa "garfo aqui". Significa "executar o comando anterior em segundo plano em um subshell".Sim, isso se chama subshells . O código do shell entre parênteses é executado como um subshell (fork). No entanto, o primeiro shell normalmente espera que a criança seja concluída. Você pode torná-lo assíncrono usando o
&
terminador. Veja-o em ação com algo como isto:$ bash subsh.sh
fonte
&
é o garfo sozinho. Se você deseja executar mais de um pipeline no processo filho, basta usar chaves (que executam agrupamentos sem criar um processo filho):{ sleep 2; echo child; } &
Não há nenhuma maneira nativa de bash (ou, pelo que sei, qualquer outra forma típica de * nix shell) de fazer isso. Existem várias maneiras de gerar processos bifurcados que fazem outra coisa de forma assíncrona, mas acho que não há nada que siga a semântica exata da chamada do sistema fork ().
A abordagem típica seria fazer com que seu script de nível superior gerasse ajudantes que fazem exatamente o trabalho que você deseja dividir. Se você faz
$0 $@ &
ou o que quer, você começará do início novamente e precisará descobrir isso de alguma forma.Na verdade, estou começando a pensar em várias maneiras inteligentes de se fazer exatamente isso ...
Mas , antes que meu cérebro se empolgue demais com isso, acho que uma regra muito boa é: se você está tentando escrever algo com casca e está ficando cheio de truques inteligentes e deseja mais recursos de linguagem, é hora de mudar para uma linguagem de programação real .
fonte