Comando ps no Linux (visualiza processos) [Guia Básico]

Comando ps no Linux gera uma lista com todos os processos em execução e os seus atributos.

Houve um momento no Linux que coexistiram duas versões do comando ps em diferentes distribuições. Há pouco tempo os desenvolvedores resolveram juntar as duas versões do ps numa única versão, mas deixaram as opções de ambas as versões diferentes coexistindo.

Desta forma, ao informar um parâmetro no ps, os resultados vão ser diferentes:

  • Sem usar o sinal de menos, o ps se comporta mostrando os processos no estilo BSD;
  • Com um sinal de menos apenas “”  o ps se comporta mostrando os processos no estilo do Unix, usando o padrão POSIX;
  • Com dois sinais de menos “” o ps se comporta mostrando os processos no estilo GNU.

Não existe certo ou errado, apensa preferência histórica. 

As opções mais frequentes do ps são:

  • a  Mostra os processos em execução ligados a um terminal, de todos os usuários;
  • -a  Mostra os processos em execução ligados a um terminal, menos os processos de sessão;
  • -e-A  Mostra todos os processos;
  • -u  Mostra a lista de processos incluindo o nome dos usuários donos dos processos e início das execuções, percentual de CPU utilizada, percentual de memória utilizada e terminal associado;
  • -x  Mostra a lista de processos, incluindo aqueles que não têm um terminal associado a ele. Útil para visualizar processos servidores (daemons);
  • -f  Mostra os processos em forma de árvore. Muito útil para identificarmos a relação de processo pai e filho entre os processos em execução;
  • -H  Mostra hierarquia dos processos em forma de árvore;

Veja o help do comando ps para mais opções.

Neste exemplo o ps somente mostra os processos do usuário logado e ligados ao terminal:

$ ps 
  PID TTY          TIME CMD
 1415 pts/0    00:00:00 ps
30019 pts/0    00:00:00 bash

Para mostrar todos os processos de todos os usuários ligados a um terminal:

$ ps a
  PID TTY      STAT   TIME COMMAND
 1628 pts/0    R+     0:00 ps a
 3297 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux
27159 pts/0    T      0:00 sudo find / -iname backup.sh
27160 pts/0    T      0:00 find / -iname backup.sh
30019 pts/0    Ss     0:00 -bash

Repare como a opção “-a” é diferente do “a”:

$ ps -a
  PID TTY          TIME CMD
 1675 pts/0    00:00:00 ps
27159 pts/0    00:00:00 sudo
27160 pts/0    00:00:00 find

A opção “u” adiciona alguns atributos dos processos:

$ ps au
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3297  0.0  0.0 121336  1600 tty1     Ss+  ago15   0:00 /sbin/agetty --noclear tty1 linux
root      3298  0.0  0.1 120984  2064 ttyS0    Ss+  ago15   0:00 /sbin/agetty --keep-baud 115200,38400,9600 
ec2-user  3414  0.0  0.1 164440  4032 pts/0    R+   18:38   0:00 ps au
root     27159  0.0  0.3 216984  6608 pts/0    T    17:46   0:00 sudo find / -iname backup.sh
root     27160  0.0  0.1 128308  3944 pts/0    T    17:46   0:00 find / -iname backup.sh
ec2-user 30019  0.0  0.2 127120  4348 pts/0    Ss   14:48   0:00 -bash

Para obter uma lista completa dos processos em execução, não só aqueles que estão conectados ao terminal, adicione a opção “x”:

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 199452  4968 ?        Ss   ago15   9:23 /usr/lib/systemd/systemd --switched-root --
root         2  0.0  0.0      0     0 ?        S    ago15   0:00 [kthreadd]
( ... )
ec2-user 30018  0.0  0.2 152864  4384 ?        S    14:48   0:00 sshd: [email protected]/0
ec2-user 30019  0.0  0.2 127120  4348 pts/0    Ss   14:48   0:00 -bash
postfix  30391  0.0  0.3  90536  6928 ?        S    18:06   0:00 pickup -l -t unix -u

Os processos cujo comando estão envoltos em chaves, como no destaque do [ktheradd], indicam que eles foram retirados da memória RAM, e colocados na memória virtual em disco. Quando os processos estão na memória virtual em disco, são chamados de sleeping.

O Kernel coloca com frequência os processos para dormir, enquanto eles estão à espera de algum evento, que pode ser, por exemplo, carregar dados do disco, ou uma conexão de rede. Quando o evento é acionado, o Kernel envia um sinal ao processo.

As opções “efH” mostram todos os processos, com a hierarquia deles em forma de árvore:

$ ps -efH
UID        PID  PPID  C STIME TTY          TIME CMD
root      3252     1  0 ago15 ?        00:00:00   /usr/sbin/sshd -D
root     29998  3252  0 14:48 ?        00:00:00     sshd: ec2-user [priv]
ec2-user 30018 29998  0 14:48 ?        00:00:00       sshd: [email protected]/0
ec2-user 30019 30018  0 14:48 pts/0    00:00:00         -bash
ec2-user  4176 30019  0 18:43 pts/0    00:00:00           ps -efH

É possível brincar com os comandos, como, por exemplo, saber quais são os processos que mais consomem a CPU:

$ ps aux | sort -nrk 3,3 | head -n 5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
nginx     3342  0.2  1.6 426976 34048 ?        Sl   ago15 133:04 amplify-agent
rpc       2729  0.0  0.1  73828  3276 ?        Ss   ago15   0:02 /sbin/rpcbind -w
root      9421  0.0  0.0      0     0 ?        I    set13   0:01 [kworker/u30:1]
root         9  0.0  0.0      0     0 ?        I    ago15   0:00 [rcu_bh]

Uma opção bastante interessante para os programadores é ver os processos em execução ordenados pelo consumo de memória. Para isso, basta mudar a coluna do sort para 4:

$ ps -aux | sort -nk 4 | head -5
chrony     745  0.0  0.0  80736  2988 ?        S    mar17   0:52 /usr/sbin/chronyd
dbus       727  0.0  0.0   8872  3668 ?        Ss   mar17  12:10 /usr/bin/dbus-daemon --system
ec2-user 24036  0.0  0.0  21720  5108 ?        S    11:37   0:01 sshd: [email protected]/0
ec2-user 24037  0.0  0.0 117164  6248 pts/0    Ss   11:37   0:00 -bash
ec2-user 32446  0.0  0.0 118552  3448 pts/0    R+   16:51   0:00 ps -aux

Independente de como se queira ver os processos em execução, alguns atributos são importantes para um administrador Linux, tais como:

Usuário dono do processo (UID)

É impossível executar um programa no Linux sem que ele tenha um usuário dono. Isto significa que o programa vai ter as permissões de acesso ao disco e recursos do usuário que executou o programa. Essa noção é importante, pois é possível executar um programa como outro usuário que não seja o usuário logado.

Número de Processo – Process ID (PID)

Todo programa em execução recebe um ID numérico único. Esse número pode ser usado para enviar sinais para o programa em execução.

Processo Pai (PPID)

Todo programa exceto o init ou systemd, tem processo pai, que originou a sua execução. É comum um programa servidor, por exemplo, ter um processo pai (master) e vários processos ou threads (filhos).

Threads podem ser entendidas como pedaços do programa que executam como se fossem processos filhos, porém mais leves, pois compartilham muita coisa com o processo pai. Esta tecnologia é muito usada nos processadores com vários núcleos (cores) para permitir execução de várias threads ao mesmo tempo.

% de CPU

Cada processo ganha uma fatia do tempo da CPU, que pode ser contabilizada, e serve como parâmetro para o administrador saber quais são os processos que consomem muita CPU.

% de Memória

Cada processo em execução também ganha uma fatia da memória RAM, que também pode ser contabilizada para que o administrador saiba os processos que consomem muita RAM

Hora de início (STIME)

Cada processo também tem como atributo a hora em que foi executado.

Tempo de CPU (TIME)

Cada processo também tem como atributo o tempo de CPU acumulado na sua execução.

Linha de comando (CMD)

Os processos também mantém um atributo que é a linha de comando que foi usada na execução

Terminal (TTY)

Cada processo pode ou não ter um Terminal associado. A título de curiosidade, o que o comando ps realidade faz é varrer algumas informações do diretório /proc. Tome como exemplo o processo sshd:

$ ps aux | grep ssh
root      3252  0.0  0.3 112928  7848 ?        Ss   ago15   0:00 /usr/sbin/sshd -D

Se olharmos o diretório /proc, ele terá um subdiretório com o número 3252, que corresponde ao PID do programa sshd:

# cd /proc/3252
# ls
attr        coredump_filter  gid_map    mem         oom_adj        root          stack    timerslack_ns
autogroup   cpuset           io         mountinfo   oom_score      sched         stat     uid_map
auxv        cwd              latency    mounts      oom_score_adj  schedstat     statm    wchan
cgroup      environ          limits     mountstats  pagemap        sessionid     status
clear_refs  exe              loginuid   net         patch_state    setgroups     syscall
cmdline     fd               map_files  ns          personality    smaps         task
comm        fdinfo           maps       numa_maps   projid_map     smaps_rollup  timers

Por exemplo, a linha de comando do programa com o PID 3252 pode ser consultada com um simples cat:

# cat cmdline 
/usr/sbin/sshd-D

Várias informações sobre um processo podem ser visualizadas no diretório /proc/[número do PID]. O utilitário ps apenas organiza a informação para uma leitura mais humana.

Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.

Gostou? Compartilhe