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: ec2-user@pts/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: ec2-user@pts/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: ec2-user@pts/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
Tag:/dev, bash, certificação, certificaçãolinux, code, Comptia, developer, empreendedorismo, exame, freesoftware, gnu, hack, Linux, linuxfan, linuxfun, linuxmint, lovelinux, LPI, LPIC, management, nerd, opensource, php, prova, shell, software, softwarelivre, sql, tech, ti, unix