Por que comentar a função trap permite que o controle-c funcione?

2

Depois de ficar de pé em cima da VM e eu estava seguindo um arquivo de log (tail -f xyz.log), no entanto eu percebi que o control-c não funcionava para sair dele. Eu tentei controlar-z que fez, mas que deixou o trabalho de fundo para que eu tivesse que matar manualmente o processo (tail -f xyz.log).

Alguém em minha loja me disse para comentar a função trap no / etc / profile que eu fiz.

#trap "" 1 2 3 15

Em seguida, faça o logout e faça o login novamente no ambiente do shell, o controle-c começou a funcionar!

Eu só quero entender o que aconteceu. Eu fiz 'homem armadilha', mas eu não estou consumindo o conteúdo bem, infelizmente. Obrigado pelo seu tempo para ler isto.

    
por DaeYoung 05.05.2016 / 23:15

3 respostas

3

O comando trap informado disse ao shell para interceptar esses sinais:

1 SIGHUP
 2 SIGINT
 3 SIGQUIT
 15 SIGTERM

O "" é o comando a ser executado se um desses sinais for recebido. Em outras palavras, não faça nada; ignore os sinais completamente.

Você pode ver quais caracteres estão vinculados a sinais usando stty -a , por exemplo, na segunda linha de saída de stty neste exemplo (o formato depende do sistema que você está usando):

$ stty -a
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

A correspondência entre alguns caracteres e sinais é dada em 11.1.9 caracteres especiais por exemplo,

  • intr envia SIGINT
  • quit envia SIGQUIT

então meu ^C enviaria SIGINT (sua configuração pode ser diferente).

Depois de comentar o trap , o shell voltou ao comportamento padrão, o que faz com que esses caracteres especiais enviem sinais quando você os digita, por exemplo, ^\ envia SIGQUIT e ^C envia SIGINT .

Leitura adicional:

por 06.05.2016 / 00:46
2

Pressionando Ctrl + C em um terminal envia o sinal para o processo em execução no terminal. (Mais precisamente, para todos os processos no grupo de processos em primeiro plano; por exemplo, se você estiver executando foo | tail -f , o sinal será enviado para foo e tail .)

O significado convencional de SIGINT (sinal de interrupção) é “abortar a tarefa atual e retornar a um prompt interativo " Programas que não possuem um prompt interativo, como tail, simplesmente saem para deixar o shell assumir.

O trap command define o comportamento do shell quando ele recebe um sinal. Por exemplo, trap 'echo killed' INT faz a impressão do shell killed quando recebe um sinal SIGINT. trap 'echo killed' 2 é o mesmo em um PC Linux porque 2 é o número do sinal cujo nome é INT. Isso só é acionado se o shell receber o sinal, não será acionado se outro programa estiver em primeiro plano.

trap "" INT é um caso especial. Ele não apenas diz ao shell para não fazer nada quando recebe o sinal, ele diz ao shell para ignorar o sinal. Quando um processo registra um manipulador para um sinal, isso não afeta os programas que ele executa - o manipulador é código no processo, não haveria como invocá-lo de outro programa. Mas ignorar um sinal é uma configuração diferente, e essa é mantida quando um programa executa outro programa. Então, depois de trap "" INT , quando você executa tail , o sinal ainda é ignorado, e pressionar Ctrl + C não tem efeito.

Se você quiser continuar efetivamente ignorando os sinais no shell, mas não nos programas iniciados, defina um trap não vazio, por exemplo trap " " INT ou trap : INT ( : é o comando no-op do shell) . Como alternativa, execute trap - INT antes de executar tail para redefinir o tratamento do sinal para seu estado padrão não ignorado.

    
por 06.05.2016 / 02:40
0

trap é um construído em shell, o formato normal é trap cmd list_of_signals . cmd está vazio no seu caso, ou seja, ignore esse sinal. 1 é o sinal hangup , 3 é intr ou Ctrl-C . Veja man bash Seção Shell Builtin Commands para maiores explicações.

    
por 05.05.2016 / 23:38