nice, renice e lsof.


Comandos intermediários do GNU/Linux

nice, renice – Configura prioridades de CPU de um comando ou processo

Sintaxe: $ nice [-n PRIORIDADE] [comando …]
Sintaxe: $ renice [-p PID]

No GNU/Linux, como na maioria dos sistemas multitarefa, é possível atribuir prioridades aos processos. A prioridades são definidas com números chamados números nice (NI), usados para alterar a a prioridade de CPU e balancear seu uso num ambiente multiusuário.
Todo processo comum é iniciado com uma prioridade-padrão (0). Números nice vão de 19 (prioridade mais baixa) a -20 (prioridade mais alta). Apenas o root pode reduzir o número nice de um processo para abaixo de zero. E também eé possivel iniciar um comando com uma prioridade diferente da padrão por meio do comando nice.
Uma vez que eu já sei como funciona a prioridade de processos no Linux, poderei então controlar estas prioridades.
Por exemplo, supondo que eu esteja trabalhando em um servidor Web bastante movimentado. O Apache (servidor HTTP) está sendo executado com prioridade 0 (normal), e está muito ocupado servindo todas as páginas dinâmicas para os vários usuários ao mesmo tempo. Então, toca o telefone e me pedem para fazer um backup de todas as páginas do servidor, algo em torno de uns 5gb, tudo localizado no diretório /var/www.
Para fazer o backup, eu utilizei o seguinte comando:

tar -zcf /var/lib/backup/backup-htdocs-20090520.tar.gz /var/www

Ou seja, agrupar e compactar todo o diretório /var/www e seu conteúdo no arquivo backup-htdocs-20090520.tar.gz.
Com o comando acima, seria criado com sucesso o backup que precisava, mas o custo é muito alto… Enquanto o sistema compacta todos os 5gb e colocava no arquivo, o Apache tinha que dividir as tarefas dele com esse comando! Isso significa que os usuários Web teriam suas páginas entregues de forma mais lenta… Como a prioridade aqui é servidor as páginas, então foi preciso usar o nice como usuário root.


# nice -n 19 tar -zcf /var/lib/backup/backup-htdocs-20090520.tar.gz /var/www

Neste caso, o backup seria feito do mesmo jeito, mas a prioridade dele seria a mínima! Toda vez que o Apache precisasse de muito processamento, o sistema ia dar prioridade total ao Apache, deixando um pouco de lado o backup. Resultado: os usuários do Apache não seriam de maneira alguma afetados e o sistema não iria ter uma carga maior do que o esperado. Ao invés disso, o backup iria demorar mais, pois tinha que esperar primeiro os outros processos usarem a CPU, mas seria feito da mesma forma.
Então é bem simples: primeiro escolhi a prioridade antes de executar o comando, e fazemos o mesmo comando, colocando antes dele o “nice -n“.

Mas e se o comando já estiver sendo executado, como no primeiro exemplo aqui, neste caso, usarei o comando renice para redefinir a prioridade.
Para utilizar o comando renice, eu preciso achar primeiro o PID do processo, depois executar o comando neste PID, exemplo:

# ps aux user,pid,ni,command | grep tar
ecouto 4221 0 tar -zcf /var/lib/backup/backup-htdocs-20090520.tar.gz /var/www

# renice 19 -p 4221
4221:prioridade antiga = 0 ; prioridade nova = 19

Nos comandos acima, eu achei o processo que estava executando o backup, e identifiquei que o PID dele era 4221. Note também que a prioridade do processo é 0 (normal). Como quero colocar o comando em uma prioridade baixa, então utilizei o comando renice para redefinir essa prioridade: de 0 para 19.

As opções -g e -u permitem alterar todos os processos do grupo ou do usuário, respectivamente.
Com renice +5 g web, todos os processos do grupo web tiveram suas prioridades (número nice) alteradas para +5.

lsof – Listar arquivos abertos

Sintaxe: $ lsof [opções] [arquivo]

O comando lsof é um dos mais importantes comandos para quem administra sistemas Linux, principalmente na área de segurança. Este comando lista todos os arquivos abertos por todos os processos. Aqui, quando eu falo arquivo, não são apenas arquivos comuns, mas sim recursos que funcionam como arquivos (podem ser abertos, mapeados na memória, entre outros). Isso inclui bibliotecas, sockets, arquivos comuns, diretórios e por aí vai.
Em outras palavras, este comando nos fornece um mapeamento completo do que o programa está usando no sistema. Lembre-se que usando apenas o comando lsof, esta lista fica muito grande, pois mostra todos os arquivos de todos os processos. Por exemplo:

$ lsof -n

No exemplo acima, eu peguei apenas um fragmento do comando, indicando o que o comando bash está fazendo. Dá pra ver que bibliotecas ele está usando, onde ele está atuando, entre outros. O parâmetro “-n”, que usei no exemplo acima, serve para que se o comando retornar algum endereço de rede (IP, por exemplo), ele não tente resolver com DNS, assim o retorno do comando fica mais rápido.

Alguns dos usos mais comuns incluem:

  • Ver se algum processo está escutando uma porta na rede suspeita, ou conectado em algum lugar suspeito. Por exemplo, vários scripts de invasão ficam escondidos no sistema (com nomes de outros processos), conectados a servidores de IRC desconhecidos. Com o lsof, dá pra saber que estes comando estão fazendo algo que não é bem o que deveriam fazer ;) ;
  • Ver que processo está usando um certo arquivo (lsof );
  • Ver exatamente que tipos de conexão estão sendo feitas no sistema;
  • Medir as memórias utilizadas pelos processos.
Por exemplo, quero ver todos os processos que utilizam o arquivo /dev/null, do user ecouto:

Este comando é bem parecido com o comando “fuser /dev/null”, que também mostra que processos estão utilizando o arquivo /dev/null, mas o lsof nos dá mais detalhes.
Quero ver agora que processos estão utilizando conexões TCP no meu sistema:
Repare que na penúltima linha do comando anterior, o processo “syslog-ng está escutando (LISTEN) uma conexão TCP na porta 2094.
Repare que para o comando acima, eu utilizei o root (por isso o # antes do comando). Isto é necessário pois quando utilizamos o lsof como usuário normal, não temos todas as permissões necessárias para verificar todos os processos, então a saída do comando vai ficar bem restrita. Executando como root, podemos ter todas as informações possíveis.