Este artigo faz parte do projeto #LTCode
Sistemas operacionais multitarefas criam a ilusão de fazer mais de uma coisa ao mesmo tempo ao trocar rapidamente de um programa em execução para outro. O kernel do Linux gerencia isso através do uso de processos, organizando os diferentes programas esperando sua vez para usar a CPU.
Quando o sistema é inicializado, o kernel começa algumas de suas próprias atividades como processos e lança um programa especial chamado init.
O programa init executa uma série de shell scripts chamados de scripts de inicialização que disparam os serviços disponíveis no sistema. Muitos desses serviços são implementados como daemons, que são programas que rodam em plano de fundo sem nenhuma interface de usuário.
Mesmo quando o usuário não está logado, o sistema pode estar ocupado executando algumas tarefas. O fato que um programa pode executar outros programas é expresso no esquema de processos como um processo pai que produz um processo filho.
O comando mais utilizado para ver processos é o "ps" (sem aspas). Por padrão o comando ps não exibe muita coisa, apenas os processos associados a sessão do terminal. Portanto ao adicionar a opção x faz com que o comando exiba todos os processos do usuário independente de qual terminal estiver controlando.
O símbolo de interrogação (?) na coluna TTY indica que nenhum terminal o controla. Já a coluna STAT é acrônimo para estado, revela o estado atual do sistema.
Estado R significa Executando: o processo está executando ou pronto para executar.
Estado S significa Dormindo: o processo não está executando, está esperando por um evento, como uma tecla ou pacote de rede.
Estado D significa Dormindo ininterruptamente: o processo está esperando por um I/O como um disco.
Estado T significa Parado: o processo foi instruído para parar.
Estado Z significado Defeituoso (zombie): um processo filho que terminou mas não foi coletado propriamente pelo seu processo pai.
Estado X significado Morto (dead).
Estado W significa processo paginado em disco.
Estado < significa De alta prioridade: é possível conceder mais importância (mais tempo de CPU) para um processo, essa propriedade é chamada de niceness.
Estado N significa De baixa prioridade: um processo com baixa prioridade irá receber tempo de processador apenas depois que processos de alta prioridade tenham sido servidos.
Estado L significa processo com alguns recursos bloqueados no kernel.
Estado s significa que possui processos dependentes.
Estado l significa multi-threaded.
Estado + significa processo em primeiro plano.
Outra opção para utilizar com o comando ps é a opção aux que mostra os processos de todos os usuários.
A coluna USER nos informa o identificador do usuário dono do processo. %CPU mostra o uso de CPU em porcentagem. %MEM uso de memória em porcentagem. VSZ tamanho da memória virtual. RSS quantidade de memória física (RAM) que o processo está usando em kilobytes. TTY terminal ao qual o processo pertence. STAT estado do processo. START hora de início do processo (maiores que 24h aparece a data).
O comando "ps lax" fornece mais informações.
A coluna F significa flag. UID informa o UID do dono do processo. PPID informa PID do processo pai. PRI informa o valor da prioridade do processo. NI informa o valor preciso da prioridade no qual -20 é maior prioridade, 19 é menor prioridade e 0 é prioridade padrão. WCHAN mostra a função do kernel onde o processo se encontra em modo suspenso.
O comando ps permite apenas uma visualização instantânea do sistema no momento em que é executado, enquanto o comando top permite uma visão mais dinâmica da atividade da máquina.
O comando top aceita um conjunto de comandos de teclado como h para ajuda e q para sair. Este comando possui esse nome pois os programas com mais uso de CPU são vistos acima dos outros.
No terminal Linux pressionar CTRL-C interrompe a execução do programa que estiver aberto no terminal, mas é importante saber que nem todo programa pode ser fechado com CTRL-C.
O terminal possui dois modos onde os programas são executados:
- Primeiro plano.
- Segundo plano ou plano de fundo.
Para colocar um programa imediatamente em plano de fundo ao executá-lo no terminal basta escrever logo em seguida o comando com caractere & . Por exemplo o comando xlogo exibe uma amostra gráfica fornecido pelo X Window System que simplesmente mostra uma janela redimensionável com o logo do X. Portando escrevendo "xlogo &" sem aspas coloca o programa em segundo plano liberando o terminal para uso.
A mensagem de saída faz parte de uma funcionalidade da shell chamada de controle de trabalho ou job control. O número entre colchetes [] indica o número do trabalho e o numero em frente indica o PID (Process IDentification) do processo.
Com o comando jobs é possível visualizar os trabalhos lançados pelo próprio terminal. E com o comando fg é possível retornar o programa em primeiro plano permitindo assim você fechar o programa com o comando CTRL-C no terminal.
Caso possua mais de um programa em segundo plano, é necessário especificar na frente do comando fg o número do programa que deseja trazer para primeiro plano.
As vezes é interessante parar um processo sem terminá-lo. Isso é comum para permitir que um processo seja movido do primeiro plano para o plano de fundo por exemplo. Portanto para parar um processo no primeiro plano, digite CTRL-Z depois de executar o programa. Depois de suspenso, pode-se restaurar o processo para primeiro plano usando o comando fg ou mover o processo para plano de fundo com o comando bg.
Um bom motivo para se executar programas gráficos pelo terminal Linux é que na linha de comando é possível ver mensagens de erro que seriam invisíveis se o programa fosse lançado graficamente, pois as vezes um programa pode falhar na sua inicialização pelo terminal assim ver sua mensagem de erro pode ajudar a diagnosticar o problema.
Alguns termos interessantes:
- PID (Process IDentification) identifica um processo em execução.
- PPID (Parent Process IDentification) identifica o PID do processo pai que gerou o processo.
- UID (User IDentification) identifica o usuário que gerou o processo.
- GID (Group IDentification) identifica o grupo ao qual pertence o processo.
- EUID (Effective User IDentification) identifica o UID do dono do arquivo quando um programa estiver com a flag especial setuid acionada.
- EGID (Effective Group IDentification) identifica o grupo efetivo.
Sinais:
O comando kill no Linux não mata processos, na verdade ele manda sinais para eles. Sinais são uma das formas que o sistema operacional se comunica com programas. Quando você aperta no teclado CTRL-C ou CTRL-Z na verdade está mandando um sinal para o programa no primeiro plano.
No caso do CTRL-C é enviado o sinal INT (interrupt). Já o CTRL-Z envia o sinal TSTP (terminal stop).
Os programas escutam esses sinais e tomam ações baseadas neles quando recebidos. Isso permite que programas possam salvar o progresso quando recebe um sinal de terminação por exemplo.
No comando kill caso não seja especificado na linha de comando o sinal (kill [-signall] PID), então por padrão é enviado o sinal TERM (terminate).
Para especificar o sinal basta digitar -sinal .
HUP (1) : Sinal de desligar, indica que o terminal que controla o programa desligou. Alguns daemons usam esse sinal para reinicialização, como o Apache.
INT (2) : Sinal de interromper, usualmente termina um programa. Tem o mesmo efeito de CTRL-C enviado pelo terminal.
KILL (9) : Sinal de matar, enquanto programas podem escolher como tratar sinais ou até ignorar, esse nunca é enviado para o programa alvo, ao invés disse o kernel termina imediatamente o programa. Nesse caso o programa não tem a oportunidade de fazer uma saída limpa. Deve ser usado somente em último caso.
TERM (15) : Sinal de terminar, sinal padrão enviado pelo comando kill. Se o programa estiver "vivo" o suficiente para receber sinais irá terminar.
CONT (18) : Sinal de continuar, restaura um processo após um sinal de STOP.
STOP (19) : Sinal de parar, pausa um processo sem terminá-lo, assim como KILL esse sinal não é enviado para o processo alvo.
QUIT (3) : Sinal de sair, fecha normalmente o programa.
SEGV (11) : Sinal de violação de segmentação, sinal enviado ao programa quando faz uso ilegal de memória, como tentar ler de uma memória não mapeada ou escrever em uma memória que não tenha permissão.
TSTP (20) : Sinal de parar do terminal, sinal enviado pelo terminal quando pressionado CTRL-Z, esse sinal é recebido pelo programa que pode escolher ignorá-lo.
WINCH (28) : Sinal de mudança na janela, sinal enviado quando há um redimensionamento da janela. Programas como top e less se redesenham quando recebem esse sinal.
Uma lista completa de sinais pode ser vista pelo comando "kill -l" (sem aspas).
O números entre parênteses acima indica o número do sinal para ser utilizado em vez de digitar -sinal digite -numero. Exemplo: kill -15 19514
Para tornar um programa imune a sinais do tipo HUP pode-se usar o comando nohup antes. Ou seja continua a execução de um programa mesmo que o usuário que o inicializou saia do sistema. Exemplo: nohup xlogo &
Além de especificar um sinal pelo seu número, pode se usar pelo seu nome, inclusive o prefixando com SIG. Exemplo: kill -SIGINT 19514
Cuidado: processos, assim como arquivos, possuem dono; para isso deve-se ser o dono ou superusuário para enviar sinais ao processo.
É possível enviar sinais para múltiplos processos para um determinado programa de usuário usando o comando killall . Consulte seu manual para mais informações.
Monitorar processos é uma importante tarefa administrativa, existem muitos outros comandos para auxiliar nessa tarefa:
pstree : mostra uma lista de processo em formato de árvore exibindo a relação de pai e filho entre processos.
vmstat : mostra a utilização instantânea do sistema incluindo memória, swap e uso de disco. Para ver os dados continuamente, use o comando seguido de um tempo de atraso (em segundos) para atualizações (ex.: vmstat 5)
xload : um programa gráfico que desenha um gráfico mostrando a carga do sistema ao longo do tempo.
tload : similar ao programa xload, mas desenha o gráfico no terminal.
exec : executa o comando especificado no processo corrente do shell. Exemplo: exec ping google.com
uptime : exibe o tempo de funcionamento, usuários e carga do sistema.
w : exibe o início do comando "top".
free : exibe a quantidade de memória livre e usada no sistema. Exemplo: free -h
pidof : retorna o PID do processo. Exemplo: pidof init
fuser : mostra qual processo faz uso de determinado arquivo ou diretório. Exemplo: fuser /sbin/init
nice : executa processo com prioridade diferente da padrão. Caso não seja especificado a prioridade, o valor é assumido como 10.
renice : modifica a prioridade de um processo já em execução.
COMENTÁRIOS