Como usar o comando timeout no Linux

Conteúdo

Laptop Linux mostrando um prompt bash

De acordo, tempo suficiente no computador. Você pode dar limites de tempo aos processos, estabelecendo um tempo máximo que pode ser executado com o timeoutcomando. Aqui está um tutorial para colocar limites na execução de programas com este comando.

O que o tempo de espera faz por você?

a timeout o comando permite que você definir um limite para a quantidade de tempo um programa será executado. Mas, Por que você gostaria de fazer isso?

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

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

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

timeout é parte de GNU Core Utilities por isso, Linux e sistemas operacionais semelhantes ao Unix, como macOS, tem tempo de espera embutido. Não há nada para instalar; você pode usá-lo direto da caixa.

Começando com o tempo de espera

Aqui está um exemplo simples. Como um exemplo, com suas opções de linha de comando padrão, a ping O comando será executado até que você o pare pressionando Ctrl + C. Se você não interromper, continua.

ping 192.168.4.28

Através do uso timeout, nós podemos ter certeza ping não funciona intermitentemente, mastigando a largura de banda da rede e importunando qualquer dispositivo que receba ping.

Este próximo comando usa timeout até o limite de tempo ping. Nós permitimos 15 segundos de tempo de execução para ping.

tempo esgotado 15 ping 192.168.4.28

Depois de 15 segundos timeout termina o ping sessão e voltar para a linha de comando.

Usando o tempo limite com outras unidades de tempo

Observe que não precisamos adicionar um “s” atrás 15. timeout assume que o valor está em segundos. Poderia adicionar um “s”, mas realmente não faz diferença.

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

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

tempo limite 3m ping 192.168.4.28

ping vai funcionar por três minutos antes timeout intervém e impede o ping sessão.

sessão de ping rodando em um terminal viúvo

Limite 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, limitar a quantidade de tempo que o programa de captura pode ser executado.

Neste exemplo, estamos usando tcpdump, uma captura de tráfego de rede ferramenta. Nas máquinas de teste, esta postagem foi investigada em, tcpdump já 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

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

tempo esgotado 10 sudo tcpdump > capture.txt

(tcpdump tem 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.)

tcpdump começa a capturar o tráfego da rede e esperamos 10 segundos. E 10 segundos vêm e vão e tcpdump ainda está em execução e capture.txt ainda está crescendo em tamanho. Será necessário um Ctrl + Apressado para parar tcpdump.

Verificando o tamanho de capture.txt com ls mostra que cresceu para 209K em segundos. Esse arquivo estava crescendo rapidamente!

ls -lh capture.txt

O que aconteceu? Porque não timeout Pare tcpdump?

Tudo tem a ver com os sinais.

Envie o sinal correto

Quando timeout quer parar um programa, envia o Sinal SIGTERM. Isso pede educadamente que o show termine. Alguns programas podem escolher ignorar o sinal SIGTERM.. Quando isso acontecer, temos que dizer timeout para ser um pouco mais forte.

Podemos fazer isso perguntando timeout para enviar o sinal SIGKILL em vez disso.

O sinal SIGKILL não pode ser “capturado, bloqueada o ignorada”, sempre acontece. SIGKILL não pede educadamente ao programa para parar. SIGKILL se esconde na esquina com um cronômetro e um cosh.

Podemos usar o -s (sinal) opção de contar timeout para enviar o sinal SIGKILL.

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

Desta vez, assim que eles tiverem decorrido 10 segundos, tcpdump está parado.

Pergunte educadamente primeiro

Nós podemos pergutar timeout tentar parar o programa usando SIGTERM, e enviar apenas SIGKILL se SIGTERM não funcionar.

Para fazer isso, nós usamos o -k (mata mais tarde) opção. a -k A opção precisa de um valor de tempo como parâmetro.

Neste comando, nós estamos perguntando timeout deixar dmesg correr para 30 segundos e, em seguida, termine com o sinal SIGTERM. E dmesg ainda funciona depois 40 segundos, significa que o SIGTERM diplomático foi ignorado e timeout você deve enviar SIGKILL para terminar o trabalho.

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

tempo limite -k 40 30 dmseg -w

dmesg trabalha para 30 segundos e para quando recebe o sinal SIGTERM.

Sabemos que não foi SIGKILL quem parou dmesg porque SIGKILL sempre deixa um obituário de uma palavra na janela do terminal: “Assassinado”. Isso não aconteceu nesta circunstância.

Recupere o código de saída do programa

Programas bem comportados retornam um valor para o shell quando terminam. Isso é conhecido como código de saída.. Em geral, isso é usado para dizer ao shell, ou qualquer procedimento que o programa tenha iniciado, se o programa encontrou problemas durante a execução.

timeout forneça seu próprio código de saída, mas é possível que isso não nos importe. Provavelmente estamos mais interessados ​​no código de saída do procedimento do que timeout está controlando.

Este comando permite ping correr por cinco segundos. Você está executando o ping em um computador chamado Nostromo, que está no testnet que foi usado para pesquisar este post.

tempo esgotado 5 ping Nostromo.local

O comando é executado por cinco segundos e timeout Termine isso. Então podemos verificar o código de saída usando este comando:

eco $?

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

Se interrompermos o programa com Ctrl + C o código de saída de timeout é zero.

tempo esgotado 5 ping Nostromo.local
eco $?

Se a execução do programa terminar antes de timeout Termine isso, timeout você pode passar o código de saída do programa para o shell.

Para que isso aconteça, o programa deve parar por conta própria (Em outras palavras, isto é não terminado por timeout), e devemos usar o --preserve-status opção.

Se usarmos o -c (contar) opção com um valor de cinco ping irá disparar apenas cinco pedidos. Se dermos timeout uma extensão de um minuto, ping definitivamente acabará por si só. Então, podemos verificar o valor de saída usando echo.

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

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

Para verificar se o código de saída vem de ping, vamos forçar ping para gerar um código de saída diferente. Se tentarmos enviar solicitações de ping para um endereço IP inexistente, ping irá falhar com um código de saída de erro. Então podemos usar echo para verificar se o código de saída é diferente de zero.

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

a ping evidentemente, o comando não pode alcançar um 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 usa para erros gerais.

Determine as regras básicas

timeout trata-se de fornecer alguns limites para a execução de programas. Se houver perigo de os arquivos de log invadirem seu disco rígido ou se esquecerem de que você deixou uma ferramenta de rede em execução, envolvê-los em timeout e deixe seu computador se regular.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.