Como usar o comando timeout no Linux

Laptop Linux mostrando um prompt bash
Fatmawati Achmad Zaenuri / Shutterstock.com

OK, é tempo de computador suficiente. Você pode dar limites de tempo aos processos, definindo um tempo máximo para que eles possam ser executados com o timeoutcomando. Aqui está um tutorial para colocar limites na execução de programas com este comando.

O que o tempo limite faz por você?

O   timeoutcomando permite que você defina um limite para o tempo de execução de um programa. Mas porque você iria querer fazer aquilo?

Um caso é quando você sabe exatamente por quanto tempo deseja que um processo seja executado. Um caso de uso comum é ter timeout controle de um programa de registro ou captura de dados para que os arquivos de registro não devorem implacavelmente o espaço do seu disco rígido.

Outro caso é quando você não sabe por quanto tempo deseja que um processo seja executado, mas sabe que não deseja que ele seja executado indefinidamente. Você pode ter o hábito de definir os processos em execução, minimizar a janela do terminal e esquecê-los.

Alguns programas – mesmo utilitários simples – podem gerar tráfego de rede em níveis que podem impedir o desempenho de sua rede. Ou eles podem amarrar os recursos em um dispositivo de destino, diminuindo seu desempenho. ( ping, Estou olhando para você.) Deixar esses tipos de programas em execução por longos períodos enquanto você está longe do computador é uma prática ruim.

timeoutfaz parte do GNU Core Utils  para que os sistemas operacionais Linux e semelhantes ao Unix , como o macOS, tenham tempo limite integrado. Não há nada para instalar; você pode usá-lo direto da caixa.

Introdução ao tempo limite

Aqui está um exemplo simples. Por exemplo, com suas opções de linha de comando padrão, o pingcomando será executado até que você o interrompa pressionando Ctrl + C. Se você não interromper, ele simplesmente continuará.

ping 192.168.4.28

ping 192.168.4.28 em uma janela de terminal

Ao usar timeout, podemos garantir que pingele não funcione indefinidamente, consumindo a largura de banda da rede e incomodando qualquer dispositivo que esteja recebendo ping.

Recomendado:  Como desativar o som de inicialização (ou “Sinal de inicialização”) em um Mac

Este próximo comando usa timeout para limitar o tempo  ping. Estamos permitindo 15 segundos de tempo de execução para  ping.

tempo limite 15 ping 192.168.4.28

tempo limite 15 ping 192.168.4.28 em uma janela de terminal

Após 15 segundos timeouttermina a pingsessão e voltamos ao prompt da linha de comando.

sessão de ping encerrada em uma janela de terminal

Usando o tempo limite com outras unidades de tempo

Observe que não precisamos adicionar um “s” atrás de 15. timeoutassume que o valor está em segundos. Você pode adicionar um “s”, mas realmente não faz diferença.

Para usar um valor de tempo medido em minutos, horas ou dias, adicione “m”, “h” ou “d”.

Para que o ping seja executado por três minutos, use o seguinte comando:

tempo limite 3m ping 192.168.4.28

tempo limite 3m ping 192.168.4.28 em uma janela de terminal

pingserá executado por três minutos antes de iniciar  timeout e interromper a pingsessão.

sessão de ping rodando em uma janela de terminal

Limitando a captura de dados com tempo limite

Alguns arquivos de captura de dados podem crescer muito rapidamente. Para evitar que esses arquivos se tornem pesados ​​ou mesmo problemáticos em tamanho, limite a quantidade de tempo que o programa de captura pode ser executado.

Neste exemplo, estamos usando tcpdumpuma ferramenta de captura de tráfego de rede . Nas máquinas de teste em que este artigo foi pesquisado, tcpdumpjá estava instalado no Ubuntu Linux e Fedora Linux. Teve que ser instalado no Manjaro Linux e Arch Linux, com o seguinte comando:

sudo pacman -Syu tcpdump

sudo pacman -Syu tcpdump em uma janela de terminal

Podemos executar tcpdump por 10 segundos com suas opções padrão e redirecionar sua saída para um arquivo chamado capture.txt com o seguinte comando:

tempo limite 10 sudo tcpdump> capture.txt

tempo limite 10 sudo tcpdump> capture.txt em uma janela de terminal

( tcpdumptem suas próprias opções para salvar o tráfego de rede capturado em um arquivo. Este é um hack rápido porque estamos discutindo timeout, não tcpdump.)

tcpdumpcomeça a capturar o tráfego da rede e esperamos 10 segundos. E 10 segundos vão e vêm e tcpdumpainda estão em execução, e capture.txt ainda está crescendo em tamanho. Vai demorar um Ctrl + C rápido para parar tcpdump.

Verificar o tamanho de capture.txt lsmostra que ele cresceu para 209 K em questão de segundos. Esse arquivo estava crescendo rápido!

ls -lh capture.txt

ls -lh capture.txt em uma janela de terminal

O que aconteceu? Por que não timeoutparou tcpdump?

Tem tudo a ver com sinais.

Recomendado:  Como desativar a chave de inserção no Windows 10

Enviando o sinal correto

Quando timeoutquer parar um programa envia o sinal SIGTERM . Isso pede educadamente ao programa para terminar. Alguns programas podem escolher ignorar o sinal SIGTERM. Quando isso acontecer, precisamos dizer timeoutpara ser um pouco mais contundentes.

Podemos fazer isso pedindo timeoutpara enviar o sinal SIGKILL.

O sinal SIGKILL não pode ser “capturado, bloqueado ou ignorado” – ele sempre passa. SIGKILL não pede educadamente que o programa pare. SIGKILL se esconde na esquina com um cronômetro e um cosh.

Podemos usar a -sopção (sinal) para informar timeoutpara enviar o sinal SIGKILL.

tempo limite -s SIGKILL 10 sudo tcpdump> capture.txt

timeout -s SIGKILL 10 sudo tcpdump> capture.txt em uma janela de terminal

Desta vez, assim que decorridos 10 segundos, tcpdumpé interrompido.

tcpdump eliminado em uma janela de terminal

Perguntar educadamente primeiro

Podemos pedir timeoutpara tentar parar o programa usando SIGTERM, e apenas enviar SIGKILL se SIGTERM não funcionar.

Para fazer isso, usamos a opção -k(matar após). A -kopção requer um valor de tempo como parâmetro.

Neste comando, estamos pedindo timeoutpara deixá-lo dmesgrodar por 30 segundos e então finalizá-lo com o sinal SIGTERM. Se dmesgainda estiver em execução após 40 segundos, significa que o SIGTERM diplomático foi ignorado e  timeoutdeve enviar SIGKILL para finalizar o trabalho.

dmesgé um utilitário que pode monitorar as mensagens do buffer de anel do kernel e exibi-las em uma janela de terminal.

tempo limite -k 40 30 dmseg -w

timeout -k 40 30 dmseg -w em uma janela de terminal

dmesg funciona por 30 segundos e para quando recebe o sinal SIGTERM.

Saída do dmesg em uma janela de terminal

Sabemos que não foi o SIGKILL que parou dmesgporque o SIGKILL sempre deixa um obituário de uma palavra na janela do terminal: “Mortos”. Isso não aconteceu neste caso.

Recuperando o Código de Saída do Programa

Programas bem-comportados passam um valor de volta para o shell quando são encerrados. Isso é conhecido como código de saída. Normalmente, isso é usado para informar ao shell – ou a qualquer processo que tenha iniciado o programa – se os problemas foram encontrados pelo programa durante sua execução.

Recomendado:  Por que as capas de telefone transparentes ficam amarelas?

timeoutfornece seu próprio código de saída, mas podemos não nos importar com isso. Provavelmente estamos mais interessados ​​no código de saída do processo que timeoutestá controlando.

Este comando permite ser pingexecutado por cinco segundos. Ele está executando o ping em um computador chamado Nostromo, que está na rede de teste usada para pesquisar este artigo.

tempo limite 5 ping Nostromo.local

tempo limite 5 ping Nostromo.local em uma janela de terminal

O comando é executado por cinco segundos e o timeouttermina. Podemos então verificar o código de saída usando este comando:

echo $?

saída de ping e echo $?  em uma janela de terminal

O código de saída é 124. Este é o valor timeoutusado para indicar que o programa foi encerrado usando SIGTERM. Se o SIGKILL encerrar o programa, o código de saída será 137.

Se interrompermos o programa com Ctrl + C, o código de saída do timeoutserá zero.

tempo limite 5 ping Nostromo.local
echo $?

tempo limite 5 ping Nostromo.local em uma janela de terminal usando Ctrl + C

Se a execução do programa termina antes de timeout terminá-lo, timeoutpode passar o código de saída do programa de volta para o shell.

Para que isso aconteça, o programa deve chegar a um impasse por conta própria (em outras palavras, é não terminado por timeout), e devemos usar a --preserve-statusopção.

Se usarmos a -copção (contagem) com um valor de cinco ping, dispararemos apenas cinco solicitações. Se dermos timeout a duração de um minuto, pingterá terminado definitivamente por si mesmo. Podemos então verificar o valor de saída usando echo.

tempo limite --preserve-status 1m ping -c 5 Nostromo.local
echo $?

tempo limite --preserve-status 1m ping -c 5 Nostromo.local em uma janela de terminal

pingconclui suas cinco solicitações de ping e termina. O código de saída é zero.

Para verificar se o código de saída está vindo ping, vamos forçar  pinga geração de um código de saída diferente. Se tentarmos enviar solicitações de ping para um endereço IP inexistente, pingocorrerá uma falha com um código de saída de erro. Podemos então usar echopara verificar se o código de saída é diferente de zero.

tempo limite --preserve-status 1m ping -c 5 NotHere.local
echo $?

tempo limite --preserve-status 1m ping -c 5 NotHere.local em uma janela de terminal

O pingcomando obviamente não pode alcançar o dispositivo inexistente, então ele relata o erro e fecha. O código de saída é dois. Este é o código de saída ping usado para erros gerais.

Definição de regras básicas

timeouttrata de fornecer alguns limites para programas em execução. Se houver o perigo de os arquivos de log invadirem seu disco rígido ou de você esquecer que deixou uma ferramenta de rede em execução, envolva-os timeoute deixe seu computador se auto-regular.