O gerenciamento de processos no Linux se assemelha à administração de usuários quanto à importância dessas atividades para o profissional de redes. Um sysadmin, por exemplo, precisa compreender uma série de aspectos em um processo, tais como o seu:
- consumo de recursos computacionais;
- tipo de processo;
- identificação de cada processo, e muito mais.
Sabendo essas informações, é possível controlar o uso da CPU (memória RAM e banda larga, principalmente), mantendo em execução somente o que é necessário. O mesmo se aplica, também, às boas práticas de uso doméstico.
Agora que já temos uma noção da importância em gerenciar processos, vamos prosseguir com o artigo, explorando mais detidamente as classificações de processos e os comandos que temos à disposição para coordená-los usando o Linux.
O que é processo em sistemas baseados em Linux?
Um processo comum é um programa que roda no sistema operacional, seja automaticamente, seja por iniciativa do usuário. A sua vida útil se resume em inicialização, execução e encerramento.
Cada processo pode variar de status entre running, sleeping e zombie, o que numa tradução livre e adaptativa significam “em execução”, “hibernando” e “ociosos” (aguardando a requisição de outro programa).
Ao entrar em cena, o processo criado gera uma cópia de si na memória RAM, porém com uma identificação (ID) diferente — técnica conhecida como fork.
A criação de processos também costuma ser feita substituindo-se a imagem de um processo por uma outra diferente, sem manter a relação entre processos parent e child.
Processos parent, child e mother
Parent e child? O que são essas coisas? Nada mais do que um dos meios utilizados pelo sistema para identificar processos. Um processo parent é aquele que cria outros processos durante o tempo de execução, ou seja, processos filhos (child processes).
Em meio aos parentescos existe, também, o processo mãe (mother), que é o processo de inicialização (init process), executado no boot do Linux — pelo systemd, por exemplo.
Quando se utiliza o comando pidof para consultar ID de processos, um mother process sempre será identificado como número 1.
No mais, é importante que essas categorias não representam os tipos de processos, propriamente, como veremos no próximo tópico.
Quais são os tipos de processos existentes?
O objetivo deste conteúdo é apresentar os comandos mais importantes para gerenciar processos no Linux. Contudo, antes de nos aprofundarmos nessa parte, é necessário definir os tipos de processos. Basicamente, eles se definem em foreground e background.
Um foreground process se caracteriza como interativo, cuja inicialização e controle são feitos pelo próprio usuário, manualmente. Em contrapartida temos o background, que diz respeito a processos não interativos, normalmente inicializados de forma automática pelo sistema (sem controle do usuário).
Daemons
Dentro do conceito de background processes existem os daemons. Esses processos, identificados como system tasks, são carregados juntos do sistema operacional e são tratados como serviços em outros sistemas operacionais, como o Windows.
Eles não morrem, porém tais processos podem ser controlados pelo usuário de várias maneiras a partir de comandos no terminal. Quer saber quais são esses comandos? Vamos prosseguir com o assunto daqui em diante.
Quais os principais comandos para gerenciamento de processos?
Existem diversas maneiras de gerenciar processos no Linux usando os comandos. Abaixo, relacionei oito comandos que, desde que dominados, permitem ao usuário (ou administrador do sistema) controlar quase tudo que acontece no sistema operacional. Vamos a eles!
1. ps
Você se lembra de que cada processo carrega consigo um número de identificação, certo? Trata-se do PID. Estou retomando essa questão porque o PID é fundamental para administrarmos processos que se encontram em execução, o que é a função do comando ps.
O comando ps é um dos mais utilizados entre os usuários, pois ele consegue listar de maneira simples e de fácil compreensão todos os processos que estão rodando no sistema operacional. Ao acionar o comando sem acrescentar nenhuma opção, você receberá um retorno parecido com este:
profissionaislinux@etinet:~$ ps PID TTY TIME CMD 17399 pts/3 00:00:00 bash 17492 pts/3 00:00:00 ps
Obviamente, os processos listados acima não são os únicos em execução no momento; para saber quais são todos os processos ativos no terminal, utilizam-se as opções -e (every / todos) e f (full listing / lista completa). Exemplo:
profissionaislinux@etinet:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 nov14 ? 00:00:06 /sbin/init splash root 2 0 0 nov14 ? 00:00:00 [kthreadd] root 4 2 0 nov14 ? 00:00:00 [kworker/0:0H] root 6 2 0 nov14 ? 00:00:00 [mm_percpu_wq] root 7 2 0 nov14 ? 00:00:00 [ksoftirqd/0] root 8 2 0 nov14 ? 00:00:25 [rcu_sched]
…
Apareceu uma lista imensa, não é mesmo? Você pode consultar os processos em busca do nome ou PID e, então, escolher uma ação para ele.
2. pstree
A lista apresentada pelo comando ps -ef não é das mais intuitivas para você? Não se preocupe, há um jeito de melhorar isso. Nós temos à disposição uma variante do comando ps chamada pstree. Como o próprio nome sugere, o pstree apresenta um diagrama de árvore.
Por que isso é interessante? O diagrama de árvore nos ajuda a compreender mais rapidamente o parentesco entre os processos. Sabendo que determinados processos influenciam no funcionamento de outros, fica mais fácil evitar que erros sejam cometidos pelo usuário (sobretudo o iniciante).
Exemplo de uso:
profissionaislinux@etinet:~$ pstree systemd─┬─Main───4*[{Main}] ├─ModemManager───2*[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─accounts-daemon───2*[{accounts-daemon}] ├─acpid ├─agetty ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─colord───2*[{colord}] ├─cron ├─cups-browsed───2*[{cups-browsed}] ├─cupsd ├─dbus-daemon ├─firefox─┬─RDD Process───3*[{RDD Process}] │ ├─Web Content───28*[{Web Content}] │ ├─2*[Web Content───26*[{Web Content}]] │ ├─3*[Web Content───25*[{Web Content}]] │ ├─Web Content───31*[{Web Content}] │ ├─Web Content───19*[{Web Content}] │ ├─WebExtensions───29*[{WebExtensions}] │ └─77*[{firefox}]
Um ponto importante, por exemplo, é que o pstree evidencia melhor quais são os processos parent. Fechando um parent, você estará encerrando junto a ele todos os processos children.
3. top
Você quer saber quais são os processos existentes no sistema com atualizações em tempo real? Então utilize o comando top no seu terminal agora mesmo — basta digitar top no terminal.
Além de mostrar o panorama do que acontece no momento, ele fornece informações detalhadas de cada processos, tais como PID, prioridade (PR), status (S) e percentual de recursos usados da CPU.
Observação: quando inicializada, a ferramenta top só se encerra quando pressionamos a tecla q (sem Caps Lock) ou fechamos o terminal, simplesmente.
4. htop
Assim como o top, o comando htop é usado para fornecimento de detalhes acerca dos processos em execução. A diferença entre eles, no entanto, é a maneira como a qual são apresentadas as informações: ela ocorre de forma mais intuitiva e inteligente.
Por exemplo, ela permite que selecionemos um processo e tomemos alguma ação. Diferentemente do comando top, no htop, cores são utilizadas para facilitar a compreensão do usuário. Além disso, ao digitar F5 a apresentação adquire o formato de diagrama de árvore.
Outro recurso bem legal do htop é a sua integração com o comando kill — que conheceremos, abaixo —, a qual nos permite fechar um processo usando a tecla F9.
5. kill
Conforme explico neste artigo especial sobre o comando kill, ele se caracteriza como um gerenciador de processos que, por meio de sinais, permite ao usuário escolher entre diversas ações direcionadas às tarefas.
Na prática, ele nos fornece uma lista contendo vários sinais que podemos utilizar. Mas o que é possível fazer com os processos usando o comando? Resposta: encerrar, bloquear, reiniciar, abortar execução, emitir alertas e muito mais.
Os sinais que podemos emitir por meio do comando kill são diversos. Digitando o comando kill -L, o terminal retorna a lista completa de sinais — o artigo que mencionei acima fornece mais detalhes sobre a função de cada um deles.
Por exemplo, temos entre eles o sinal SIGSEGV, cuja identificação é o número 11, que tem a finalidade de interromper um processo quando este viola as regras de acesso do sistema.
Supondo-se que o processo de PID de nº 14052 não tenha confiabilidade ou permissões necessárias para continuar, vamos encerrá-lo com o comando:
kill -11 14052
Se a ideia é forçar a parada de um processo, o sinal é o de número 9 (SIGKILL); portanto, dentro do contexto colocado no exemplo, bastaria digitarmos kill -9 14052.
6. who
O comando who é útil nos casos em que gerenciamos usuários, seja num servidor, seja num computador compartilhado. Quem está minimamente habituado com o idioma inglês já entende que who significa “quem”, e o que esse comando faz é, justamente, exibir quem acessou o sistema recentemente.
A ideia por trás da utilização do comando who não é apenas descobrir quem logou no sistema. Como estamos falando de processos, costumamos acioná-lo para nos atentarmos aos processos que vamos fechar, por exemplo, pois a ação pode prejudicar outros usuários.
Mais uma possibilidade a qual estamos sujeitos é acessarmos o sistema com o login de outra pessoa (da perspectiva do Linux). Por isso, é recomendado o uso frequente do comando whoami (ou w, simplesmente), que nos retorna a seguinte informação: quem nós somos no momento.
7. glances
Se você pretende fazer um monitoramento mais amplo no sistema, o glances é uma solução e tanto. Glances é uma ferramenta que não costuma vir por padrão nas distribuições Linux, portanto ela requer instalação.
sudo apt install glances
A instalação é bem rápida (menos de 80M de arquivos), dependendo da sua conexão banda larga, e basta digitar glances no terminal para iniciar o monitoramento. Que tipos de informações são fornecidas? Alguns exemplos:
- uso de memória SWAP;
- consumo de CPU e RAM;
- quantidade de tarefas e respectivos status;
- endereço de IP; e
- espaço livre em disco.
Além das informações gerais, o glances, logicamente, exibe os processos existentes de modo bem detalhado. De que detalhes estou falando? Consumo de CPU e RAM, comando, tempo de uso, PID, usuário, entre outros.
8. nice
Um fator pouco abordado até aqui a respeito de processos é a priorização. Estabelecer prioridades é um meio eficiente para otimizar o funcionamento de um programa quando há muitos processos em aberto, o que gera lentidão ao sistema.
O comando nice é providencial nesse sentido, pois ele nos permite definir prioridade alta para os processos que tratamos como importantes no momento, e reduzir a prioridade dos secundários.
Em ambientes corporativos de grande porte e que trabalham com aplicações de missão crítica, por exemplo, a estratégia ajuda bastante na hora de manter o bom funcionamento dos processos importantes.
A sintaxe do comando nice é muito simples, bastando usarmos a opção -n seguida de um valor de prioridade (o padrão é 0) mais o nome do processo. Exemplo:
nice -n 19 processoX
Acima, definimos a mais alta prioridade possível para o processoX, pois os limites variam entre os valores -20 e 19. Da mesma maneira, pode-se reduzir a prioridade de alguns processos irrelevantes (esse ponto é crucial) para otimizar ainda mais a execução do programa que deseja utilizar.
9. nohup
Muitos processos são descontinuados quando encerramos uma sessão, suspendemos o sistema ou fechamos o terminal. O incômodo que isso gera em termos de experiência é grande.
Um bom exemplo é o torrent; se você está baixando um arquivo extenso e precisa se ausentar, é possível manter o processo rodando mesmo que se faça log out, ou seja, é um meio de economizar energia elétrica e não expor o acesso à máquina.
Bacana, mas como fazer isso? Existe uma ferramenta que acompanha as distros Linux chamada nohup. Ela nos permite enviar um processo para o modo background, então o programa continua rodando mesmo se a sua GUI ou tela do terminal é encerrada. Exemplo de uso: nohup nome_do_programa &
Observação: o caractere “&” é utilizado para enviar o processo para segundo plano.
Ao longo deste artigo, aprendemos o que são processos e como eles são compreendidos em um sistema Linux. Em seguida, conferimos oito comandos essenciais ao gerenciamento de processos, os quais são a base para tudo nesse sentido. Daqui em diante, só praticar!
Quer descobrir o que mais o Linux tem a oferecer em termos de possibilidades e oportunidades na carreira profissional? Acesse agora mesmo a página do Profissionais Linux para compreender melhor a importância da capacitação!