Os sinais são meios usados para que os processos possam se comunicar e para que o sistema possa interferir em seu funcionamento. Por exemplo, se o usuário executar o comando
kill para interromper um processo, isso será feito por meio de um sinal.
Quando um processo recebe um determinado sinal e conta com instruções sobre o que fazer com ele, tal ação é colocada em prática. Se não houver instruções pré-programadas, o próprio
Linux pode executar a ação de acordo com suas rotinas.
Entre os sinais existentes, tem-se os seguintes exemplos:
- STOP - esse sinal tem a função de interromper a execução de um processo e só reativá-lo após o recebimento do sinal CONT;
- CONT - esse sinal tem a função de instruir a execução de um processo após este ter sido interrompido;
- SEGV - esse sinal informa erros de endereços de memória;
- TERM - esse sinal tem a função de terminar completamente o processo, ou seja, este deixa de existir após a finalização;
- ILL - esse sinal informa erros de instrução ilegal, por exemplo, quando ocorre divisão por zero;
- KILL - esse sinal tem a função de "matar" um processo e é usado em momentos de criticidade.
O kill também é um comando que o usuário pode usar para enviar qualquer sinal, porém, se ele for usado de maneira isolada, ou seja, sem o parâmetro de um sinal, o kill por padrão executa o sinal TERM.
A sintaxe para a utilização do comando kill é a seguinte:
kill -SINAL PID
Como exemplo, vamos supor que você deseja interromper temporariamente a execução do processo de PID 4220. Para isso, pode-se usar o seguinte comando:
$ kill -STOP 4220
Para que o processo 4220 volte a ser executado, basta usar o comando:
$ kill -CONT 4220
Se o sinal precisa ser enviado a todos os processos, pode-se usar o número -1 no lugar do PID. Por exemplo:
$ kill -STOP -1
Como já dito, usar o comando kill isoladamente - por exemplo, kill 4220 - faz com que este use o sinal TERM por padrão. Esse sinal, no entanto, pode ser ignorado pelos processos. É por isso que é boa prática usar o comando "kill -9 PID" para "matar" um processo, pois o número nove representa o sinal kill e este não pode ser ignorado. Isso deixa claro que se você conhecer o número que é atribuído a um sinal, você pode usá-lo no lugar de seu nome. Com exceção de alguns sinais, a numeração de cada um pode mudar de acordo com a distribuição ou com a versão do kernel.
Agora, imagine que você não saiba qual o PID de um processo e tenha se esquecido que o comando ps (visto mais à frente) descobre tal informação. Neste caso, pode-se usar o comando killall, desde que você saiba o nome do processo. A sintaxe é:
killall -SINAL processo
Por exemplo:
$ killall -STOP vi
Estado dos processos
Quando um processo é criado, isso não significa que ele será imediatamente executado. Além disso, determinados processos podem ser temporariamente paralisados para que o processador possa executar um processo prioritário. Isso quer dizer que os processos, em certos momentos, podem estar em situações de execução diferentes. O Linux trabalha, essencialmente, com quatro tipos de situação, isto é, estados:
- Executável: o processo pode ser executado imediatamente;
- Dormente: o processo precisa aguardar alguma coisa para ser executado. Só depois dessa "coisa" acontecer é que ele passa para o estado executável;
- Zumbi: o processo é considerado "morto", mas, por alguma razão, ainda existe;
- Parado: o processo está "congelado", ou seja, não pode ser executado.