|
Analisando processos em seu GNU/Linux.
Muitas vezes é necessário que tomemos conhecimento sobre quais processos estão rodando em nosso Linux, seja para analisarmos algum em particular, ou termos uma visão geral do funcionamento do Sistema. Um processo nada mais é do que um programa carregado na memória de seu PC; este pode ter sido iniciado pelo usuário, ou fazer parte da base necessária para que o Sistema se mantenha funcionando.
Esta é uma das tarefas mais importantes para um administrador, pois é importantíssimo saber o que realmente está acontecendo em determinado momento com o Sistema.
Existem alguns comandos que poderão lhe ajudar a fazer isto com certa facilidade.
Neste tutorial básico, tentarei demonstrar ao administrador iniciante alguns comandos e suas utilidades, bem como fazer um rápido apanhado sobre o assunto "processos".
Como já dito, cada programa aberto em seu PC é denominado processo. A ferramenta de maior utilidade para avaliarmos os processos consiste em um comando denominado "ps".
O "ps" é um dos comandos mais complexos que existem e o que cada administrador costuma fazer é determinar um conjunto de parâmetros prediletos e usá-los habitualmente. Esta complexidade deve-se à fusão das variantes derivadas do Unix, GNU e BSD, e como tal, pode ser usado no formato desejado dentro destas 3 "famílias". Os parâmetros Unix são precedidos por um "-"; os GNU por um "--" e os BSD são comandados diretamente ao terminal.
Vejamos o comando ( no exemplos que verão a seguir eu posso ter excluído algumas linhas da saída dos comandos a fim de economizar espaço e poupar sua paciência ):
percival@sodoma:~$ ps PID TTY TIME CMD 11410 pts/0 00:00:00 bash 11431 pts/0 00:00:00 ps
O comando "ps" executado sem parâmetros não monstra nada de especial, além do PID ( Process IDentification ) e processos do usuário definido pelo $ no terminal ATUAL. No caso, o "ps" que acabei de executar e o shell em si. A terceira coluna nos informa quanto tempo de CPU foi usado para rodar o processo.
Vamos incrementar um pouco isto. Uma melhor análise dos processos pode ser obtida com o comando:
percival@sodoma:~$ ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 init [2] 2 ? SN 0:00 [ksoftirqd/0] 3 ? S< 0:00 [events/0] 4 ? S< 0:00 [khelper] 5 ? S< 0:00 [kthread] 8 ? S< 0:00 [kblockd/0] 9 ? S< 0:00 [kacpid] 158 ? S< 0:00 [kseriod] 200 ? S 0:00 [pdflush] 201 ? S 0:00 [pdflush] 202 ? S< 0:00 [kswapd0] 203 ? S< 0:00 [aio/0] 678 ? S< 0:00 [khubd] 744 ? S< 0:00 [ata/0] 746 ? S< 0:00 [ata_aux] 760 ? S< 0:00 [scsi_eh_0] 761 ? S< 0:00 [scsi_eh_1] 1031 ? S< 0:00 [reiserfs/0] 1211 ? S<s 0:00 udevd --daemon 1544 ? S< 0:00 [kpsmoused] 1875 ? S< 0:00 [wrap_wq] 1877 ? S< 0:00 [ndis_wq] 1959 ? S< 0:00 [kmirrord] 2383 ? Ss 0:00 /sbin/portmap 2634 ? Ss 0:00 /sbin/syslogd 2640 ? Ss 0:00 /sbin/klogd -x 2717 ? Ss 0:00 /usr/bin/dbus-daemon --system 2725 ? Ss 0:02 /usr/sbin/hald 2726 ? S 0:00 hald-runner
A primeira coluna refere-se ao PID ( notem que o primeiro processo, que recebeu a PID 1, é o "init" ), a terceira coluna determina o status do processo, e a última o comando que originou o processo. Os processos que encontram-se grafados entre colchetes são aqueles varridos para a swap, por encontrarem-se inativos.
Isso tudo será explicado mais detalhadamente logo à frente.
ADENDO 1 - Gerenciamento de memória.
Antes de mais nada, farei um pequeno adendo ao uso da memória pelo kernel do Sistema.
Uma das tarefas primordiais do kernel é gerenciar o aproveitamento de memória do Sistema, seja ela física ou virtual. Esta memória virtual, conhecida como "swap", nada mais é que um espaço em seu HD.
O kernel frequentemente varre processos da memória física para a virtual, quando estes estão inativos, e os varre de volta à memória física quando são requisitados. Com isto, o kernel consegue utilizar mais memória do que apenas dispõe fisicamente.
Cada processo iniciado recebe uma "vaga" única na memória do Sistema ( dois processos distintos não podem usar a mesma vaga ). Cada agrupamento destas vagas é chamado de página. O kernel distribui cada página entre a memória virtual e a física, de acordo com sua necessidade. Por exemplo, se um processo não é utilizado por determinado período de tempo, o kernel varre o mesmo da memória física para a virtual, deixando a última livre para algum novo processo.
Quando o Sistema precisa de um processo que está em uma página da swap, ele precisa varrê-lo de volta, o que consome um pouco de tempo, tornando o processo mais lento.
E isso ocorre repetidas vezes enquanto o Linux estiver de pé.
Voltando ao tema principal do artigo, vamos depurar um pouco mais a análise dos processos:
percival@sodoma:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:01 ? 00:00:00 init [2] root 2 1 0 10:01 ? 00:00:00 [ksoftirqd/0] root 3 1 0 10:01 ? 00:00:00 [events/0] root 4 1 0 10:01 ? 00:00:00 [khelper] root 5 1 0 10:01 ? 00:00:00 [kthread] root 8 5 0 10:01 ? 00:00:00 [kblockd/0] root 9 5 0 10:01 ? 00:00:00 [kacpid] root 158 5 0 10:01 ? 00:00:00 [kseriod] root 200 5 0 10:01 ? 00:00:00 [pdflush] root 201 5 0 10:01 ? 00:00:00 [pdflush] root 202 5 0 10:01 ? 00:00:00 [kswapd0] root 203 5 0 10:01 ? 00:00:00 [aio/0] root 678 5 0 10:01 ? 00:00:00 [khubd] root 744 5 0 10:01 ? 00:00:00 [ata/0] root 746 5 0 10:01 ? 00:00:00 [ata_aux] root 760 5 0 10:01 ? 00:00:00 [scsi_eh_0] root 761 5 0 10:01 ? 00:00:00 [scsi_eh_1] root 1031 5 0 10:01 ? 00:00:00 [reiserfs/0] root 1211 1 0 10:01 ? 00:00:00 udevd --daemon root 1544 5 0 10:01 ? 00:00:00 [kpsmoused] root 1875 5 0 10:01 ? 00:00:00 [wrap_wq] root 1877 5 0 10:01 ? 00:00:00 [ndis_wq] root 1959 5 0 10:01 ? 00:00:00 [kmirrord] daemon 2383 1 0 10:02 ? 00:00:00 /sbin/portmap root 2634 1 0 10:02 ? 00:00:00 /sbin/syslogd root 2640 1 0 10:02 ? 00:00:00 /sbin/klogd -x percival 11410 11408 0 12:36 pts/0 00:00:00 bash percival 11735 11410 0 12:45 pts/0 00:00:00 ps -ef
Podemos combinar os parâmetros do modo como demonstrado no exemplo, a fim de termos no display as informações que necessitamos. O parâmetro "e" nos mostra TODOS os processos do Sistema, enquanto o "f" nos lista algumas informações pertinentes aos mesmos, delimitadas a seguir:
UID: o responsável por ter iniciado o processo PID: o número de identificação do processo PPID: o número de identificação do pai deste processo ( caso o processo tenha sido gerado por outro ) C: utilização de processamento sobre o tempo de vida do processo STIME: horário em que o processo "nasceu" TTY: o terminal do qual o processo foi lançado. TIME: o tempo requerido para lançar o processo ( cumulativo ) CMD: o comando usado para iniciar o processo.
Notem que sempre o primeiro processo, consequentemente de PID "1", é o init ( já visto há pouco na saída do comando "ps ax"). Os PIDs são distribuídos em ordem numérica crescente a partir do momento de sua execução, não podendo haver dois valores iguais para processos.
ADENDO 2 - O init.
O init nada mais é do que um processo criado pelo kernel com a função de rodar os processos seguintes.
Os Sistemas GNU/Linux contém tabelas responsáveis pelo controle dos processos que deverão ser automaticamente carregados durante o boot, geralmente localizadas em /etc/inittabs. O processo init é direcionado a carregar determinados tipos de processos ( contidos no /etc/inittab ) de acordo com "runlevels". Existem diferentes "runlevels" no seu Sistema Linux, cada qual destinado a um propósito diferente e responsável pelo carregamento de processos necessários a este propósito.
Os runlevels, basicamente, são:
( 0 ): desliga o Sistema ( 1 ): somente o Sistema básico é carregado, e apenas um terminal aberto, só podendo ser acessado pelo root. Chama-se "single-user mode" ( 2 ): modo multi-usuário, com a rede ativada. ( 3 ): é o nível mais comumente usado, onde muitos processos específicos, como a REDE e a possibilidade do usuário logar-se em modo texto, são iniciados. ( 4 ): não utilizado. ( 5 ): é outro runlevel corriqueiramente usado, onde além dos serviços iniciados pelo 3, o ambiente em X também carregado, permitindo que usuários loguem-se ao Sistema graficamente. ( 6 ): reinicia o Sistema.
Se o administrador precisar de ainda mais informações do que as providas pelos parâmetros "ef", poderá lançar mão da seguinte:
percival@sodoma:~$ ps -efl 0 S percival 10893 1 0 75 0 - 8787 - 12:23 ? 00:00:09 gedit 0 S percival 11088 1 1 75 0 - 19630 stext 12:28 ? 00:00:19 evinc 0 R percival 11408 1 0 76 0 - 8609 stext 12:36 ? 00:00:00 gnome 0 S percival 11409 11408 0 79 0 - 620 - 12:36 ? 00:00:00 gnome 0 S percival 11410 11408 0 75 0 - 1375 wait 12:36 pts/0 00:00:00 bash 0 S percival 11989 3680 0 76 0 - 1259 pipe_w 12:51 ? 00:00:00 /usr/
A informação mais interessante neste caso está na segunda coluna, e define o STATUS do processo; sua saída deverá ser interpretada da seguinte maneira:
O- Rodando no processador S- Dormindo R- Pronto para rodar Z- Zumbi ( processo foi terminado, e o pai deste processo não está mais presente ) T- Processo terminado.
Para definir uma árvore hierárquica na análise dos processos ( e saber quem é o processo-pai de determinado programa ), podemos usar o parâmetro "H". Veja um exemplo:
percival@sodoma:~$ ps -eH | grep compiz PID TTY TIME CMD 3705 ? 00:00:00 compiz-manager 3794 ? 00:00:23 emerald 3795 ? 00:00:00 compiz 4010 ? 00:00:00 compiz 4011 ? 00:03:19 compiz.real
Notem que o processo 3705 ( compiz-manager ) deu início aos processos 3794 e 3795. Este último solicitou o início do processo 4010, que por sua vez trouxe junto o 4011.
Vou fazer um pequeno resumo dos parâmetros mais utilizados para definir a saída do "ps", no estilo UNIX. Estes podem ser adicionados ao ps no shell depois de um "-". Muito mais parâmetros podem ser usados, e para tomar conhecimento destes, recorra ao manual do ps ( man ps ).
A ou e : mostra TODOS os processos. T : mostra todos os processo associados ao terminal atual. e : mostra todos os processos de todos os terminais. x : mostra os processos não controlados por um terminal. f : mostra uma listagem em formato completo F : mostra uma listagem mais completa ainda H : processos em ordem hierárquica
Usando o parâmetro "l", temos mais informações. Veja:
percival@sodoma:~$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 4080 4075 0 75 0 - 1374 wait pts/0 00:00:00 bash 0 R 1000 5726 4080 0 76 0 - 806 - pts/0 00:00:00 ps
F = flags do Sistema, designadas para o processo pelo kernel. PRI = prioridade do processo. NI = este valor "NIce" é utilizado para se determinar as prioridades dos processos. ADDR = endereço de memória ocupado pelo processo. SZ = espaço usado pelo processo, se foi varrido para a swap. WCHAN= endereço da função do kernel onde o processo está "dormindo".
Tendo estas noções básicas em mente, fica fácil a partir de agora você monitorar os processos de seu GNU/Linux com o comando "ps". Mas, note que o "ps" nos mostra os processos ocorridos em determinado ponto no tempo. E se o administrador precisar de algo mais "dinâmico"?
Existe uma opção para esta tarefa: monitorar os processos em TEMPO REAL. Para isso, podemos utilizar o comando "top".

O "top" providencia uma análise dos processos a cada 3 segundos, diretamente no terminal, com informações úteis ao administrador. Na primeira parte do output, vemos a hora atual seguida do uptime ( quanto tempo o Sistema está de pé ). Logo a seguir, está o número de usuários logados. No final da primeira linha, veremos a média de carga do Sistema. São 3 números que nos dão a média de carga de trabalho no último minuto, nos últimos 5 minutos e por fim, no últimos 15 minutos. Quanto maior este número, mais o computador trabalhou.
Esta média de carga ( em inglês, "load average" ) pode nos indicar algum problema no Sistema. Se o valor correspondente à carga dos últimos 15 minutos estiver alto ( 2, por exemplo ), melhor checar o que pode estar ocorrendo e que processo está ocasionando isto.
Na segunda linha, nada de mais. "Tasks" indica quantos processos estão acontecendo em seu Sistema naquele momento, e depois o número de processos em cada estado ( já explicado anteriormente ).
Na terceira linha temos o display sobre o uso da CPU.
Na quarta e quinta linhas, informações sobre o gerenciamento de memória. Na primeira: memória física total, usada pelo Sistema, livre; o mesmo se repete na linha de baixo, só que em relação à memória virtual ( swap ).
Comandos interativos básicos para uso com o "top". Tecle o comando enquanto o "top" estiver correndo no terminal para funções extras:
1 - alterna entre o modo single-CPU e SMP ( symmetric multi-processor ). z - troca a cor do display. k - abre entrada para matar determinado processo. d - muda o intervalo de atualização. q - sai do "top".
Mais comandos em "man top".
ADENDO 3 - Matando processos
Podemos encerrar processos diretamente do terminal, bastando para isto conhecer um pouco do comando "kill".
O "kill" envia um sinal a determinado processo. Este sinal pode ser:
( 1 ) - aguarde. ( 2 ) - interrompa. ( 9 ) - morra. ( 17 ) - pare o que está fazendo, mas não termine.
O que dificulta um pouco o uso do comando para o administrador iniciante é que o "kill" não aceita que se dê o nome do comando que originou o processo ( CMD ) para matá-lo. Para isso precisaremos usar o PID, que você já sabe como obter se leu a primeira parte do artigo.
Além disto, um usuário normal não pode terminar um processo iniciado por outro usuário, só podendo interferir nos processos que ele mesmo ininciou. Ao root, obviamente, é permitida esta função.
Resumindo, pode-se pedir educadamente que um processo pare usando:
kill -2 processo
Ou partir para a ignorância contra processos rebeldes ( 8^P ) comandando:
kill -9 processorebelde
Mais informações em "man kill".
Considerações finais.
Espero ter ajudado os iniciantes em GNU/Linux a entenderem como é importante sabermos tomar conta do nosso Sistema, mesmo que este esteja em um simples PC dedicado a Desktop.
E o único modo de aprendermos é estudando, lendo e testando. Aperfeiçoem-se cada dia mais.
Não se pode ficar bitolado apenas em front-ends que rodam no X. Eu posso, obviamente, matar um processo usado o gnome-system-monitor, por exemplo. Mas, se um processo lazarento tiver saído da linha e estiver carregando tanto o Sistema a ponto de deixá-lo muito pesado, eu vou sofrer até conseguir me ver livre dele desta forma. No terminal, é praticamente imediato o resultado.
Saber se virar em um terminal SEMPRE é bom e SEMPRE é necessário. Você se acostuma rápido e as tarefas tornam-se mais rápidas e precisas.
Leiam o Guia FOCA. Leiam as páginas de manuais ( man man ). Leiam os artigos que os colegas predispõem-se a redigir.
Bom estudo a todos.
Percival.
|