Dica do hamacker : Colocando processos para backgound, tirando o processo de sua sessão e recuperando o processo.

Ok.

Lá vamos nós aqui com uma dica para quem pretende administrar servidores.

Em servidores é muito comum executarmos um comando que pode demorar algum tempo. SysAdmins descobriram que executar um processo e aguardar ele terminar não é uma coisa muito bacana, especialmente se estivermos no final de nosso expediente onde a moça do café não vai mais repor o nosso estoque :)

Assim, é determinante saber o que fazer quando o processo já está em execução por muito tempo.

Colocando um processo para dormir

Ok. Você executou um processo e ele tá demorando demais, o que fazer ?

Você pode colocar o processo para dormir, como ?

Melhor do que o “como” é o “porque”, as vezes colocamos um processo para dormir porque descobrimos que a performance do servidor foi significativamente afetada pelo nosso processo. Se o nosso processo deve ter prioridade mais baixa que do que as outras atividades que este servidor controla então não tem jeito, precisamos fazer o processo dormir, como ?

Dê um CTRL+Z, e o processo simplesmente irá para background, porém congelado até que você decida o que fazer com ele  :

# find / -name teste.txt
^Z
[1]+  Parado                  find / -name teste.txt
# jobs -l
[1]+  7220 Parado                  find / -name teste.txt

Sim, você puxou o freio de sua aplicação e agora ela esta congelada. O comando jobs -l exibe uma lista de processos que estão em background e o seu número na fila de processo e o PID (número de identificação do processo).

Roda, mas em background por gentileza

De grosso modo, Background significa “para trás”, isto é, um processo que eu quero ver sendo executado atrás ou escondido de minha aplicação atual. Se deseja que o processo rode, mas mantenha seu terminal livre, então use o comando BG <numero do processo na fila> :

# jobs
[1]+  Parado                  find / -name teste.txt
# bg 1
find / -name teste.txt

O processo foi retomado, porém seu terminal estará livre para outros comandos, mas qualquer mensagem que o processo tiver que exibir na tela, não importa o que esteja fazendo, a mensagem aparecerá em sua tela :

# <digitando um comando qualquer>
find / -name teste.txt
/home/administrador/teste.txt

Colocando o processo em Foreground

De grosso modo, Foreground significa “à frente”, isto é, um processo que eu quero ver sendo executado à minha frente. Você colocou o processo para rodar em background, mas notou que ele nunca termina, isso as vezes ocorre porque talvez o processo requeira alguma interatividade e parou sua execução para aguardar alguma resposta do usuário, mas como o processo está em background então não será visto e o processo na prática está parado, daí então a necessidade de coloca-lo em foreground de novo. Usamos para essa atividade o comando FG <numero do processo na fila> :

# ls -lR /lib|grep " eeprom.ko"
-rw-r--r-- 1 root root 10488 2010-09-16 15:33 eeprom.ko
-rw-r--r-- 1 root root 10488 2010-11-24 12:18 eeprom.ko
^Z
[1]+  Parado                  ls --color=auto -lR /lib | grep --color=auto " eeprom.ko"
# jobs -l
[1]+  7299 Parado                  ls --color=auto -lR /lib
      7300                       | grep --color=auto " eeprom.ko"
# fg 1
ls --color=auto -lR /lib | grep --color=auto " eeprom.ko"
-rw-r--r-- 1 root root 10488 2010-12-01 23:00 eeprom.ko
-rw-r--r-- 1 root root 10488 2011-01-10 23:36 eeprom.ko
-rw-r--r-- 1 root root 10488 2011-04-08 20:58 eeprom.ko

O comando FG retoma o processo a partir do ponto em que se encontra.

Desanexando um processo de minha sessão

Muitas vezes administramos servidores Linux a partir duma sessão SSH, um problema que as vezes pode ocorrer é que vamos interromper momentaneamente nosso computador e o  que estiver rodando dentro da sessão será terminado. Imagina a seguinte situação hipotética : você coloca um relatório do squid para ser gerado, passa-se algum tempo e já é 17:55h e você tem que ir embora as 18:00h e o relatório do squid ainda não terminou, se você interromper este relatório neste instante terá de executá-lo novamente amanhã e deverá esperar ainda mais. O que fazer nessa situação ?

Desanexe seu processo de sua sessão, ao realizar essa operação, o processo continuará mesmo depois de você ter derrubado sua sessão, o comando mágico para realizar essa operação chama-se nohup `fg %<numero-do-processo-na-fila>`& :

# ./squid_relatorio.sh todos 19-10-2011

Iniciando em 20-10-2011+10:13 o relatorio de acesso de todos....
    Arquivo de entrada /var/log/squid3/access.log.
    Arquivo de saída /home/administrador/logs/2011/2011-10/2011-10-19-todos.txt.
    Criando uma lista de sites nao-auditaveis.
    Colocando em ordem alfabetica de sites nao auditados.
    Removendo possiveis duplicacoes de sites nao auditados.
    Removendo linhas vazias do arquivo de sites nao auditados.
    Todos os logins estarão presentes.
^Z
[1]+  Parado                  ./squid_relatorio.sh todos 19-10-2011
# nohup `fg %1`&
[2] 7344
# nohup: ignorando entrada e anexando saída a `nohup.out'
    Removendo do log sites considerados livres.(...)

Eu poderia ter substituido o ‘fg %1’ por ‘bg %1’ e a única diferença prática seria a retomada do processo que dar-se-ía em foreground ou background. Também existe a opção de você jogar o processo para background e congela-lo com o comando ‘pkill -stop‘ e retoma-lo mais tarde com o comando ‘pkill -cont‘ .

Agora, se você já sabe que o processo que irá demandar um tempo razoável e há a possibilidade de você não estar presente então execute diretamente o nohup da seguinte forma :

nohup wget -vc http://mirrors.melbourne.co.uk/ubuntu-releases//oneiric/ubuntu-11.10-desktop-i386.iso

Neste instante posso derrubar minha conexão que o processo acima não será interrompido, rodará no servidor e a saída do comando será armazenado num arquivo chamado ‘nohup.out’ que poderá ser examinado mais tarde para descobrir eventuais falhas/acertos.

Se você tem um servidor web cuja hospedagem lhe garante um terminal SSH para administra-lo é mais prático você usar um nohup+wget para fazer download de arquivos para aplicar no servidor do que fazer o inverso, um upload para servidor web. A maioria dos ISPs estrangeiros tem velocidades bastante altas que supera as velocidades de conexões nacionais fazendo upload. Depois que descobri isso passei muito mais tempo com a família :)

Anexando de volta um processo à minha sessão

É o dia seguinte, e você se lembra que deixou um processo parado lá no servidor e é hora de retomá-lo, o problema é que embora o processo apareça na listagem do comando ‘ps auxw‘ você precisa transferi-lo para sua sessão e então retomar sua execução caso ele esteja parado ou aguardando alguma interatividade, como fazer isso ?

Existe um programa chamado ‘reptyr’ que faz isso, no entanto, ele não está disponível em todas as edições do Ubuntu, porém há um PPA de onde ele poderá ser descarregado caso você note que em sua edição ele não existe :

https://launchpad.net/~broder/+archive/reptyr

Após instalado, use este programa da seguinte forma :

# ps auxwww

para obter o PID do programa ou processo em background, tendo descoberto o PID então :

# reptyr <PID>

Então o processo fará parte de sua sessão novamente. Se ele estava em background ou foreground retornará da mesma forma, daí você usa ‘jobs -l‘ como foi mostrado anteriormente para manter essa forma de execução ou trocar.

Conclusão

É claro que administrar processos não é muito útil num desktop, mas é essencial no caso de servidores. Mas embora veja muito administrador conhecendo comandos como ps, kill, pkill, raramento os vejo parando, suspendendo, anexando e desanexando e depois continuando processos. Espero que com esse artigo muitos sejam beneficiados por sair mais cedo do trabalho e tomando menos chá de cadeira esperando só um processo terminar :)

%d blogueiros gostam disto: