Por que ctrl + c no console mata o processo em segundo plano

4

Você poderia explicar porque Ctrl + C no meu bash shell afeta o comando que foi executado anteriormente em background com:

'./my_script.sh 1' &

O comando finaliza imediatamente a execução com 130 code:

[1]+  Exit 130              './my_script.sh 1' &

O comportamento usual de Ctrl + C é matar o processo em primeiro plano. E o que acontece aqui?

Editar 1: (Meus pensamentos) talvez algo relacionado a backticks - o processo de subshell aqui começa e de alguma forma recebe Ctrl + C quando o processo pai é recebido

Editar 2: Eu descobri que Ctrl + C pára todos os processos em segundo plano que foram executados a partir do shell atual com o uso de backticks.

    
por John_West 20.01.2016 / 16:01

1 resposta

1

Quando você escreve o comando

'./my_script.sh 1' &

você está fazendo uma substituição de comandos (veja abaixo). Praticamente você está executando um subshell (aquele para os backticks '' ) em background ( & ) no qual ele roda seu script ( ./my_script.sh 1 ).

O presente shell está aguardando o final da execução de seu subshell para executar sua saída como comandos.
O subshell está aguardando o final do seu script.
Quando você pressiona Ctrl + C interrompe esta espera, passando o sinal SIGINT para o filho.

Neste momento o shell atual tenta executar como comando a saída obtida até agora ... e gera o erro 130 que significa "Script terminado por Control-C" [ 2 ] .

Com os backticks '' , bem como com $() , no bash você está fazendo uma substituição de comando [ 1 ] :

Bash performs the expansion by executing COMMAND and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.

por exemplo

echo 'date'   
Thu Feb 6 10:06:20 CET 2003 

Observe que, se você executar em segundo plano mais desses tipos de comandos

'./myscript 1' &
'./myscript 2' &
'./myscript 3' &

é sempre o shell atual que está esperando por toda a saída do filho. Um único Ctrl + C encerrará esta espera por todos juntos.

Se, em vez disso, você esperar o final do script, o shell atual tentará executar a saída quando terminar.

    
por 20.01.2016 / 17:46