Pesquisa de site

Como executar ou repetir um comando do Linux a cada X segundos para sempre


Muitas vezes, um administrador de sistema precisa executar um comando repetidamente em determinados períodos de tempo. Muitas vezes, essas tarefas podem ser facilmente concluídas com comandos cron simples. Na maioria dos casos, isso deve funcionar, mas o período mais curto para executar o comando cron é a cada 1 minuto. Acredite ou não, em muitos casos isso é muito lento.

Neste tutorial, você aprenderá técnicas simples de script para monitorar ou ficar de olho em um comando específico em estado de execução contínua semelhante ao comando principal (monitorar continuamente o processo e a utilização da memória) a cada 3 segundos por padrão.

Não vamos parar para discutir os motivos pelos quais você precisaria executar comandos com tanta frequência. Acredito que cada pessoa tem motivos diferentes para isso em seu trabalho diário ou mesmo em PCs e laptops domésticos.

1. Use o comando watch

Watch é um comando do Linux que permite executar um comando ou programa periodicamente e também mostra a saída na tela. Isso significa que você poderá ver a saída do programa a tempo. Por padrão, o watch executa novamente o comando/programa a cada 2 segundos. O intervalo pode ser facilmente alterado para atender às suas necessidades.

Monitore o uso da memória

“Watch” é extremamente fácil de usar, para testá-lo, você pode iniciar imediatamente um terminal Linux e digitar o seguinte comando:

watch free -m

O comando acima verificará a memória livre do sistema e atualizará os resultados do comando free a cada dois segundos.

Como pode ser visto na saída acima, você tem um cabeçalho que exibe informações sobre (da esquerda para a direita) o intervalo de atualização, o comando que está sendo executado e a hora atual. Se desejar ocultar este cabeçalho, você pode usar a opção -t.

A próxima questão lógica é: como alterar o intervalo de execução. Para isso, você pode usar a opção -n, que especifica o intervalo com que o comando será executado. Este intervalo é especificado em segundos. Então, digamos que você queira executar seu arquivo script.sh a cada 10 segundos, você pode fazer assim:

watch -n 10 script.sh

Observe que se você executar o comando como mostrado acima, precisará cd para o diretório (saiba 15 exemplos de comando cd) onde o script está localizado ou especifique o caminho completo para esse script.

Outras opções úteis do comando watch são:

  1. -b – cria um sinal sonoro se a saída do comando for diferente de zero.
  2. -c – Interpreta sequências de cores ANSI.
  3. -d – destaca as alterações na saída do comando.

Monitore usuários logados, tempo de atividade e média de carga

Digamos que você queira monitorar os usuários logados, o tempo de atividade do servidor e a saída média de carga em fase contínua a cada poucos segundos e, em seguida, use o seguinte comando conforme mostrado:

watch uptime

Para sair do comando, pressione CTRL+C.

Aqui, o comando 'uptime' será executado e exibirá os resultados atualizados a cada 2 segundos por padrão.

Monitore o progresso do comando de cópia

No Linux, ao copiar arquivos de um local para outro usando o comando cp, o progresso dos dados não é mostrado, para ver o progresso dos dados sendo copiados, você pode usar o watch comando junto com o comando du -s para verificar o uso do disco em tempo real.

cp ubuntu-15.10-desktop-amd64.iso /home/tecmint/ &
watch -n 0.1 du -s /home/tecmint/ubuntu-15.10-desktop-amd64.iso 

Se você acha que o processo acima é muito complicado de realizar, sugiro que você vá para o comando Advance copy, que mostra o progresso dos dados durante a cópia.

2. Use o comando dormir

O sono é frequentemente usado para depurar scripts de shell, mas também tem muitos outros propósitos úteis. Por exemplo, quando combinado com loops for ou while, você pode obter resultados impressionantes.

Se você é novo em scripts bash, pode verificar nosso guia sobre loops bash aqui.

Caso esta seja a primeira vez que você ouve falar do comando "sleep", ele é usado para atrasar algo por um determinado período de tempo. Em scripts, você pode usá-lo para instruir seu script a executar o comando 1, aguardar 10 segundos e depois executar o comando 2.

Com os loops acima, você pode dizer ao bash para executar um comando, dormir por N segundos e então executar o comando novamente.

Abaixo você pode ver exemplos de ambos os loops:

Exemplo de loop for

for i in {1..10}; do echo -n "This is a test in loop $i "; date ; sleep 5; done

O liner acima executará o comando echo e exibirá a data atual, no total de 10 vezes, com 5 segundos de suspensão entre as execuções.

Aqui está um exemplo de saída:

This is a test in loop 1 Wed Feb 17 20:49:47 EET 2016
This is a test in loop 2 Wed Feb 17 20:49:52 EET 2016
This is a test in loop 3 Wed Feb 17 20:49:57 EET 2016
This is a test in loop 4 Wed Feb 17 20:50:02 EET 2016
This is a test in loop 5 Wed Feb 17 20:50:07 EET 2016
This is a test in loop 6 Wed Feb 17 20:50:12 EET 2016
This is a test in loop 7 Wed Feb 17 20:50:17 EET 2016
This is a test in loop 8 Wed Feb 17 20:50:22 EET 2016
This is a test in loop 9 Wed Feb 17 20:50:27 EET 2016
This is a test in loop 10 Wed Feb 17 20:50:32 EET 2016

Você pode alterar os comandos echo e date com seus próprios comandos ou script e alterar o intervalo de suspensão de acordo com suas necessidades.

Exemplo de loop while

while true; do echo -n "This is a test of while loop";date ; sleep 5; done

Aqui está um exemplo de saída:

This is a test of while loopWed Feb 17 20:52:32 EET 2016
This is a test of while loopWed Feb 17 20:52:37 EET 2016
This is a test of while loopWed Feb 17 20:52:42 EET 2016
This is a test of while loopWed Feb 17 20:52:47 EET 2016
This is a test of while loopWed Feb 17 20:52:52 EET 2016
This is a test of while loopWed Feb 17 20:52:57 EET 2016

O comando acima será executado até ser encerrado ou interrompido pelo usuário. Pode ser útil se você precisar executar um comando em segundo plano e não quiser contar com o cron.

Importante: Ao usar os métodos acima, é altamente recomendável que você defina um intervalo longo o suficiente para dar tempo suficiente ao seu comando para terminar a execução, antes da próxima execução.

Conclusão

Os exemplos neste tutorial são úteis, mas não pretendem substituir completamente o utilitário cron. Cabe a você descobrir qual funciona melhor para você, mas se tivermos que separar o uso das duas técnicas, eu diria o seguinte:

  1. Use o cron quando precisar executar comandos periodicamente, mesmo após a reinicialização do sistema.
  2. Use os métodos explicados neste tutorial para programas/scripts que devem ser executados na sessão atual do usuário.

Como sempre, se você tiver alguma dúvida ou comentário, não hesite em enviá-los na seção de comentários abaixo.