fbpx Certificação Linux: Comando ps no Linux (visualiza processos) [Guia Básico]

Blog

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

📅 01/01/2019 ⏱ 10 min ✍️ Uira Ribeiro
Linuxcomandos
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 linux27159 pts/0    T      0:00 sudo find / -iname backup.sh27160 pts/0    T      0:00 find / -iname backup.sh30019 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 ps27159 pts/0    00:00:00 sudo27160 pts/0    00:00:00 find

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

$ ps auUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot      3297  0.0  0.0 121336  1600 tty1     Ss+  ago15   0:00 /sbin/agetty --noclear tty1 linuxroot      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 auroot     27159  0.0  0.3 216984  6608 pts/0    T    17:46   0:00 sudo find / -iname backup.shroot     27160  0.0  0.1 128308  3944 pts/0    T    17:46   0:00 find / -iname backup.shec2-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 auxUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot         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: ec2-user@pts/0ec2-user 30019  0.0  0.2 127120  4348 pts/0    Ss   14:48   0:00 -bashpostfix  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 -efHUID        PID  PPID  C STIME TTY          TIME CMDroot      3252     1  0 ago15 ?        00:00:00   /usr/sbin/sshd -Droot     29998  3252  0 14:48 ?        00:00:00     sshd: ec2-user [priv]ec2-user 30018 29998  0 14:48 ?        00:00:00       sshd: ec2-user@pts/0ec2-user 30019 30018  0 14:48 pts/0    00:00:00         -bashec2-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 5USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDnginx     3342  0.2  1.6 426976 34048 ?        Sl   ago15 133:04 amplify-agentrpc       2729  0.0  0.1  73828  3276 ?        Ss   ago15   0:02 /sbin/rpcbind -wroot      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 -5chrony     745  0.0  0.0  80736  2988 ?        S    mar17   0:52 /usr/sbin/chronyddbus       727  0.0  0.0   8872  3668 ?        Ss   mar17  12:10 /usr/bin/dbus-daemon --systemec2-user 24036  0.0  0.0  21720  5108 ?        S    11:37   0:01 sshd: ec2-user@pts/0ec2-user 24037  0.0  0.0 117164  6248 pts/0    Ss   11:37   0:00 -bashec2-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 sshroot      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# lsattr        coredump_filter  gid_map    mem         oom_adj        root          stack    timerslack_nsautogroup   cpuset           io         mountinfo   oom_score      sched         stat     uid_mapauxv        cwd              latency    mounts      oom_score_adj  schedstat     statm    wchancgroup      environ          limits     mountstats  pagemap        sessionid     statusclear_refs  exe              loginuid   net         patch_state    setgroups     syscallcmdline     fd               map_files  ns          personality    smaps         taskcomm        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

Uira Ribeiro

Prof. Uirá Ribeiro

Chair do Board do Linux Professional Institute

Especialista Linux com mais de 20 anos de experiência.
Autor de 5 livros e mentor de mais de 14.000 alunos certificados.
20 certificações de alto nível, incluindo LPIC-3, CKA, RHCE e AWS Solutions Architect.

WhatsApp