Sinal - Comando Linux / Unix

Linux suporta tanto sinais confiáveis ​​POSIX (doravante, "sinais padrão") e sinais em tempo real POSIX.

Usando sinais no Linux

Os sinais em um sistema Linux dizem ao sistema operacional como lidar com um programa ou processo em execução. Quando você fecha um programa normalmente, isso na verdade envia um sinal para o sistema dizendo-lhe para fechar o programa. Você também pode fazer isso manualmente.

Comece procurando um processo que deseja encerrar. Você pode fazer isso com:

ps aux | grep -i 

Portanto, se você deseja fechar o Firefox a partir da linha de comando, digite:

ps aux | grep -i firefox

Você obterá uma lista enorme de processos de Raposa de fogo porque é um aplicativo multithread. Procure o processo base para / usr / lib / firefox. Geralmente é o primeiro.

Lista de processos do Linux Firefox

Se você achar isso opressor, também pode usar pgrep. Funciona de forma semelhante, mas fornece apenas os IDs do processo.

pgrep firefox. 

O menor ID de processo será o processo básico de que você precisa.

Linux pgrep Firefox

Quando o tiver, encontre o número de identificação do processo. A primeira coisa listada sempre será o usuário que está executando o processo. Em seguida, será o ID do processo. Com isso em mãos, você pode enviar um

SIGTERM sinalizar para o processo para interrompê-lo usando o comando de matar.

matar -SIGTERM 4790. 
Linux SIGTERM Firefox

Cada sinal também possui um número correspondente para abreviação. O número para SIGTERM é 15, então você pode usar isso da mesma forma que a palavra completa.

matar -15 4790

SIGTERM é na verdade a ação padrão do comando kill. Como resultado, você realmente não precisa especificá-lo. Apenas use:

matar 4790

Você obterá exatamente o mesmo resultado.

Isso é muito bom se o processo for responsivo, mas provavelmente você não desligará um processo responsivo dessa forma, pelo menos não em um desktop. Então, o que você faz com um processo que não responde? Existem muitos sinais possíveis. Para ter uma ideia melhor de quão ampla é a variedade, procure-os.

kill -l
Lista de sinais Linux

Sim, há muitos. Felizmente, você não tocará na grande maioria, a menos que comece a desenvolver ou escrever scripts de administração de sistema. Na maioria das vezes, quando o SIGTERM falha em interromper um processo que não responde, você vai olhar para o equivalente do Linux a Ctrl + Alt + Delete, SIGKILL.

Ao contrário do famoso gerenciador de processos Ctrl + Alt + Delete, o SIGKILL realmente funciona. Na verdade, o objetivo é ignorar todos os outros fatores e eliminar o processo ofensivo, aconteça o que acontecer. Isso também significa que o SIGKILL pode ser perigoso se você errar no processo.

Comece exatamente da mesma maneira, procurando o ID do processo.

pgrep firefox

Agora, em vez de usar o SIGTERM para interromper o processo, use o SIGKILL mais destrutivo.

kill -SIGKILL 4790

Mesmo que o processo esteja completamente bloqueado, ele deve ser fechado em alguns segundos.

Linux SIGKILL Firefox

Assim como com SIGTERM, há um número correspondente a SIGKILL. Neste caso, é 9.

matar -9 4790

Assim como antes, o processo deve ser encerrado quase imediatamente.

Você também deve estar ciente de SIGINT. Esta é uma interrupção do teclado e é mais um comando do que você pensa na linha de comando. Quando você pressiona Ctrl + C para interromper um processo de uma janela de terminal, você está emitindo um SIGINT. Seu código é 2, e você pode usá-lo como os outros com o comando kill.

matar -2 4790

Isso não é muito comum, pois é muito mais provável que você vá com Ctrl + C, mas é bom estar ciente disso.

Esses são, de longe, os sinais mais comuns que você encontrará no uso diário do Linux. Para uma análise mais técnica dos outros sinais, continue na próxima seção.

Os detalhes técnicos

Se você é um administrador de sistema ou está procurando desenvolver para Linux, provavelmente deseja se aprofundar nos detalhes técnicos por trás do sistema de sinais no Linux. A próxima seção explora a análise técnica completa dos sinais do Linux. Você absolutamente não precisa dessas informações para usar o Linux em seu desktop, mas se pretende explorar o funcionamento interno do sistema, isso pode ser inestimável.

Sinais Padrão

O Linux oferece suporte aos sinais padrão listados abaixo. Vários números de sinal dependem da arquitetura, conforme indicado na coluna "Valor". (Onde três valores são fornecidos, o primeiro geralmente é válido para alpha e sparc, o do meio para i386, ppc e sh, e o último para mips. A - denota que um sinal está ausente na arquitetura correspondente.)

As entradas na coluna "Ação" da tabela especificam a ação padrão para o sinal, como segue:

Prazo: A ação padrão é encerrar o processo.

Ign: A ação padrão é ignorar o sinal.

Essencial: A ação padrão é encerrar o processo e despejar o núcleo.

Pare: A ação padrão é interromper o processo.

Primeiro, os sinais descritos no padrão POSIX.1 original.

Sinal Valor Açao Comente
ou morte do processo de controle
SIGINT 2 Prazo Interromper do teclado
SIGQUIT 3 Essencial Sair do teclado
SIGILL 4 Essencial Instrução Ilegal
SIGABRT 6 Essencial Abortar sinal de abortar(3)
SIGFPE 8 Essencial Exceção de ponto flutuante
SIGKILL 9 Prazo Sinal de matar
SIGSEGV 11 Essencial Referência de memória inválida
SIGPIPE 13 Prazo Tubo quebrado: escrever no tubo sem leitores
SIGALRM 14 Prazo Sinal do temporizador de alarme(2)
SIGTERM 15 Prazo Sinal de rescisão
SIGUSR1 30,10,16 Prazo Sinal definido pelo usuário 1
SIGUSR2 31,12,17 Prazo Sinal definido pelo usuário 2
SIGCHLD 20,17,18 Ign Criança parou ou desligou
SIGCONT 19,18,25 Continue se parado
SIGSTOP 17,19,23 Pare Parar o processo
SIGTSTP 18,20,24 Pare Pare de digitar em tty
SIGTTIN 21,21,26 Pare entrada tty para processo em segundo plano
SIGTTOU 22,22,27 Pare saída tty para processo em segundo plano

Os sinais SIGKILL e SIGSTOP não pode ser capturado, bloqueado ou ignorado.

A seguir, os sinais que não estão no padrão POSIX.1, mas descritos em SUSv2 e SUSv3 / POSIX 1003.1-2001.

Sinal Valor Açao Comente
SIGPOLL Prazo Evento pollable (Sys V). Sinônimo de SIGIO
SIGPROF 27,27,29 Prazo Timer de criação de perfil expirado
SIGSYS 12,-,12 Essencial Argumento inválido para rotina (SVID)
SIGTRAP 5 Essencial Traço / armadilha de ponto de interrupção
SIGURG 16,23,21 Ign Condição urgente no soquete (4.2 BSD)
SIGVTALRM 26,26,28 Prazo Despertador virtual (4.2 BSD)
SIGXCPU 24,24,30 Essencial Limite de tempo de CPU excedido (4,2 BSD)
SIGXFSZ 25,25,31 Essencial Limite de tamanho de arquivo excedido (4,2 BSD)

Até e incluindo Linux 2.2, o comportamento padrão para SIGSYS, SIGXCPU, SIGXFSZ, e (em arquiteturas diferentes de SPARC e MIPS) SIGBUS era encerrar o processo (sem um dump de memória). (Em alguns outros Unices, a ação padrão para SIGXCPU e SIGXFSZ é encerrar o processo sem um despejo de núcleo.) O Linux 2.4 está em conformidade com os requisitos POSIX 1003.1-2001 para esses sinais, encerrando o processo com um despejo de núcleo.

A seguir, vários outros sinais.

Sinal Valor Açao Comente
SIGEMT 7,-,7 Prazo
SIGSTKFLT -,16,- Prazo Falha de pilha no coprocessador (não utilizado)
SIGIO 23,29,22 Prazo I / O agora possível (4.2 BSD)
SIGCLD -,-,18 Ign Um sinônimo para SIGCHLD
SIGPWR 29,30,19 Prazo Falha de energia (Sistema V)
SIGINFO 29,-,- Um sinônimo para SIGPWR
SIGLOST -,-,- Prazo Bloqueio de arquivo perdido
SIGWINCH 28,28,20 Ign Sinal de redimensionamento da janela (4.3 BSD, Sun)
SIGUNUSADO -,31,- Prazo Sinal não utilizado (será SIGSYS)

(Sinal 29 é SIGINFO / SIGPWR em um alfa, mas SIGLOST em um sparc.)

SIGEMT não é especificado em POSIX 1003.1-2001, mas mesmo assim aparece na maioria dos outros Unices, onde sua ação padrão é tipicamente encerrar o processo com um dump de memória.

SIGPWR (que não é especificado em POSIX 1003.1-2001) é normalmente ignorado por padrão nos outros Unices onde aparece.

SIGIO (que não é especificado em POSIX 1003.1-2001) é ignorado por padrão em vários outros Unices.

Sinais em tempo real

O Linux suporta sinais em tempo real conforme definido originalmente nas extensões em tempo real POSIX.4 (e agora incluído no POSIX 1003.1-2001). Linux suporta 32 sinais em tempo real, numerados a partir de 32 (SIGRTMIN) a 63 (SIGRTMAX). (Os programas devem sempre referir-se a sinais em tempo real usando notação SIGRTMIN+ n, uma vez que o intervalo de números de sinal em tempo real varia entre os Unices.)

Ao contrário dos sinais padrão, os sinais em tempo real não têm significados predefinidos: todo o conjunto de sinais em tempo real pode ser usado para fins definidos pelo aplicativo. (Observe, no entanto, que a implementação do LinuxThreads usa os três primeiros sinais em tempo real.)

A ação padrão para um sinal em tempo real não tratado é encerrar o processo de recebimento.

Os sinais em tempo real são distinguidos pelo seguinte:

  1. Várias instâncias de sinais em tempo real podem ser enfileiradas. Por outro lado, se várias instâncias de um sinal padrão forem entregues enquanto esse sinal estiver bloqueado, apenas uma instância será enfileirada.
  2. Se o sinal for enviado usando sigqueue(2), um valor de acompanhamento (um inteiro ou um ponteiro) pode ser enviado com o sinal. Se o processo de recebimento estabelecer um manipulador para este sinal usando o SA_SIGACTION bandeira para sigaction(2) então ele pode obter esses dados por meio dosi_value campo do siginfo_t estrutura passada como o segundo argumento para o manipulador. Além disso, o si_pid e si_uid os campos desta estrutura podem ser usados ​​para obter o PID e o ID do usuário real do processo que envia o sinal.
  3. Os sinais em tempo real são entregues em uma ordem garantida. Vários sinais em tempo real do mesmo tipo são entregues na ordem em que foram enviados. Se diferentes sinais em tempo real forem enviados a um processo, eles serão entregues começando com o sinal de menor número. (Ou seja, sinais com números baixos têm prioridade mais alta.)

Se os sinais padrão e em tempo real estiverem pendentes para um processo, POSIX não especifica qual é entregue primeiro. Linux, como muitas outras implementações, dá prioridade aos sinais padrão neste caso.

De acordo com POSIX, uma implementação deve permitir que pelo menos _POSIX_SIGQUEUE_MAX (32) sinais em tempo real sejam enfileirados para um processo. No entanto, em vez de colocar um limite por processo, o Linux impõe um limite de todo o sistema no número de sinais em tempo real enfileirados para todos os processos. Este limite pode ser visto (e com privilégios) alterado através do /proc/sys/kernel/rtsig-max Arquivo. Um arquivo relacionado,/proc/sys/kernel/rtsig-max, pode ser usado para descobrir quantos sinais em tempo real estão atualmente enfileirados.

DE ACORDO COM.

POSIX.1.

Use o cara comando (% cara) para ver como um comando é usado em seu computador específico.