Aula #21 - Sinais - kill, killall e pkill


Sinais são usados ​​para forçar processos a responder a eventos, muitas vezes imprevisíveis. Eles podem ser causados ​​a partir do próprio processo, ou de eventos externos, como outros processos. Muitos sinais são fatais e resultarão no encerramento do processo. No entanto, a morte pode ser evitada se os programadores prepararem código para lidar com certos sinais de terminação. Além disso, muitos sinais são mais benignos e são apenas informativos. É possível enviar sinais (incluindo aqueles que induzem terminação) a partir da linha de comando usando kill, killall e pkill.


Os sinais são um dos métodos mais antigos de Inter-Process Communication (IPC) e são usados ​​para notificar processos sobre eventos assíncronos (ou exceções).

Por assíncrono queremos dizer o processo de recepção de sinal pode:

    Não esperar que o evento ocorra.
    Esperar o evento, mas não saber quando é provável que vá ocorrer.


Por exemplo, se um usuário decide encerrar um programa em execução, ele pode enviar um sinal para o processo através do kernel para interromper e matar o processo.


Existem dois caminhos pelos quais os sinais são enviados para um processo:

  •     A partir do kernel para um processo do usuário, como resultado de um erro de exceção ou de programação.
  •     A partir de um processo de usuário (usando uma chamada de sistema) para o kernel que irá, em seguida, enviá-lo para um processo do usuário. O processo que envia o sinal pode até ser o mesmo que o processo que recebe.


Os sinais só podem ser enviadas entre os processos do mesmo usuário ou a partir de um processo do superusuário.

Quando um processo recebe um sinal, o que ele faz dependerá da forma como ele foi programado. Ele pode tomar ações específicas, codificados no programa, para lidar com o sinal (handle) ou pode apenas responder de acordo com os padrões do sistema. Dois sinais (SIGKILL e SIGSTOP que serão descritos em breve) não podem ser tratados e sempre terminam o programa.
Existem vários tipos de sinais, e o sinal específico que é enviado indica o tipo de evento. Geralmente sinais são usados para lidar com duas coisas:
  •     Problemas detectados pelo hardware (como acesso ilegal a memória).
  •     Problemas detectados pelo ambiente (como a morte prematura de um processo).


Para ver a lista de sinais no Linux, com os números:



$ kill -l

  1) SIGHUP       2) SIGINT        3) SIGQUIT      4) SIGILL       5) SIGTRAP   6) SIGABRT      7) SIGBUS        8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2      13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD      18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU      23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF      28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN     35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5   40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10  45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15  50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10  55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5   60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX


Os sinais a partir do SIGRTMIN são para sistemas de tempo real e são relativamente novos.

Digitar man 7 signal vai mostrar mais detalhes.





 

Sinais disponíveis


Sinal    Valor    Ação padrão    POSIX?    Significado

SIGHUP        1    Finaliza    Sim    O processo pai terminou ou o terminal em controle foi desligado.

SIGINT    2    Finaliza    Sim    Interrupção enviada do teclado.

SIGQUIT    3    Dump de memória            Sim    Quit enviado do teclado.

SIGILL    4    Dump de memória        Sim     Instrução ilegal.

SIGTRAP    5    Dump de memória     Não     Trap Trace/breakpoint para ferramentas de debugging.



 


SIGABRT

SIGIOT    6    Dump de memória    Sim     Término anormal.

SIGBUS    7    Dump de memória            Sim         Erro no Bus.

SIGFPE    8    Dump de memória    Sim     Exceção de ponto flutuante.

SIGKILL    9    Finaliza    Sim    Sinal Kill (matar). Não pode ser tratado nem ignorado.

SIGUSR1    10    Finaliza     Sim     Sinal definido pelo usuário numero 1.

SIGSEGV    11    Dump de memória            Sim     Referência inválida de memória.

SIGUSR2    12    Finaliza    Sim     Sinal definido pelo usuário numero 2.

SIGPIPE    13    Finaliza    Sim     Pipe quebrado (Broken pipe): tentativa de escrita em um pipe sem leitores.

SIGALRM    14    Finaliza    Sim     Sinal do temporizador emitido pelo alarme.

SIGTERM    15    Finaliza    Sim     Terminação do processo.

SIGSTKFLT    16    Finaliza    Não     Falha da pilha no coprocessador matemático.

SIGCHLD    17    Ignora            Sim     O filho parou ou terminou.

SIGCONT    18    Continua    Sim     Continue caso parado.

SIGSTOP    19    Para    Sim     Para o processo. Não pode ser tratado nem ignorado.

SIGTSTP    20    Para    Sim     Para digitação no terminal.

SIGTTIN    21    Para    Sim     Processo em background necessita entrada do terminal.

SIGTTOU    22    Para    Sim     Processo em background necessita saída do terminal.

SIGURG    23    Ignora    Não    Condição urgente no socket (4.2 BSD).

SIGXCPU    24    Dump de memória    Sim     Limite de tempo da CPU excedido (4.2 BSD).

SIGXFSZ    25    Dump de memória    Sim     O tamanho máximo do arquivo foi excedido (4.2 BSD).

SIGVTALRM    26    Finaliza    Não     Despertador virtual(Virtual alarm clock) (4.2 BSD).

SIGPROF    27    Finaliza    Não     Perfil despertador(Profile alarm clock) (4.2 BSD).

SIGWINCH    28    Ignora    Não     Sinal de redimensionamento de Janela (4.3 BSD, Sun).



 

SIGIO

SIGPOLL    29    Finaliza    Não     I/O é possível agora (4.2 BSD, System V).

SIGPWR    30    Finaliza    Não    Falha de Energia (System V).

 

SIGSYS

SIGUNUSED    31    Finaliza    Não     Chamada a Sistema Incorreto. Sinal não utilizado.
   
    




KILL


Um processo não pode enviar um sinal diretamente para outro processo; ele deve pedir ao kernel para enviar o sinal executando uma chamada de sistema (system call). Usuários (incluindo o superusuário root) podem enviar sinais a outros processos na linha de comando usando o kill como em:

$ kill 1991


$ kill -9 1991

$ kill -SIGKILL 1991


onde enviamos um sinal para o processo com o PID = 1991. Se o número do sinal não é informado (como no primeiro exemplo) o sinal padrão SIGTERM (15) é enviado, e trata-se de um sinal que permite ao processo encerrar de forma limpa, pois ele não morre imediatamente; Se este sinal for ignorado, o usuário pode enviar um SIGKILL (9), que não pode ser ignorado, e resulta na morte imediata do processo.

O nome kill não é um bom nome, e é mantido por razões históricas. Embora muitas vezes ele seja usado para matar (encerrar) processos, a função real do comando é enviar sinais para processos, mesmo os que não são relacionados com o encerramento do processo.

O comando killall mata todos os processos com o nome especificado, e o usuário precisa de privilégios suficientes para fazê-lo. Ele usa o nome do comando ao invés do PID do processo, como em:

$ killall bash

$ killall -9 bash

$ killall -SIGKILL bash


pkill envia sinais para processos baseado em um critério de seleção:

$ pkill [-sinal] [opções] [padrão]


Por exemplo:

$ pkill -u libby foobar


vai matar todos os processos do usuário libby com nome foobar.


Outro exemplo:

$ pkill -HUP rsyslogd


faz com que o rsyslog leia seu arquivo de configuração novamente.

Mais vistos no mês:

As melhores distribuições Linux para 2017

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Teste de Performance de Rede com Iperf

DHCP - Guia Completo

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

OPNsense - Firewall Open Source

Ophcrack: Descubra todas as senhas do Windows

SSD no linux

Oracle Linux 7.0 Server com Xfce - Instalação e configurações iniciais