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 timeout
comando. Aqui está um tutorial para colocar limites na execução de programas com este comando.
Índice
O que o tempo limite faz por você?
O timeout
comando 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.
timeout
faz 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 ping
comando será executado até que você o interrompa pressionando Ctrl + C. Se você não interromper, ele simplesmente continuará.
ping 192.168.4.28
Ao usar timeout
, podemos garantir que ping
ele não funcione indefinidamente, consumindo a largura de banda da rede e incomodando qualquer dispositivo que esteja recebendo ping.
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
Após 15 segundos timeout
termina a ping
sessão e voltamos ao prompt da linha de comando.
Usando o tempo limite com outras unidades de tempo
Observe que não precisamos adicionar um “s” atrás de 15. timeout
assume 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
ping
será executado por três minutos antes de iniciar timeout
e interromper a ping
sessão.
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 tcpdump
uma ferramenta de captura de tráfego de rede . Nas máquinas de teste em que este artigo foi pesquisado, 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 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
( 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ão e vêm e tcpdump
ainda 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 ls
mostra que ele cresceu para 209 K em questão de segundos. Esse arquivo estava crescendo rápido!
ls -lh capture.txt
O que aconteceu? Por que não timeout
parou tcpdump
?
Tem tudo a ver com sinais.
Enviando o sinal correto
Quando timeout
quer 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 timeout
para ser um pouco mais contundentes.
Podemos fazer isso pedindo timeout
para 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 -s
opção (sinal) para informar timeout
para enviar o sinal SIGKILL.
tempo limite -s SIGKILL 10 sudo tcpdump> capture.txt
Desta vez, assim que decorridos 10 segundos, tcpdump
é interrompido.
Perguntar educadamente primeiro
Podemos pedir timeout
para 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 -k
opção requer um valor de tempo como parâmetro.
Neste comando, estamos pedindo timeout
para deixá-lo dmesg
rodar por 30 segundos e então finalizá-lo com o sinal SIGTERM. Se dmesg
ainda estiver em execução após 40 segundos, significa que o SIGTERM diplomático foi ignorado e timeout
deve 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
dmesg
funciona por 30 segundos e para quando recebe o sinal SIGTERM.
Sabemos que não foi o SIGKILL que parou dmesg
porque 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.
timeout
fornece 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 timeout
está controlando.
Este comando permite ser ping
executado 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
O comando é executado por cinco segundos e o timeout
termina. Podemos então verificar o código de saída usando este comando:
echo $?
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 será 137.
Se interrompermos o programa com Ctrl + C, o código de saída do timeout
será zero.
tempo limite 5 ping Nostromo.local
echo $?
Se a execução do programa termina antes de timeout
terminá-lo, timeout
pode 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-status
opção.
Se usarmos a -c
opção (contagem) com um valor de cinco ping
, dispararemos apenas cinco solicitações. Se dermos timeout
a duração de um minuto, ping
terá 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 $?
ping
conclui 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 ping
a geração de um código de saída diferente. Se tentarmos enviar solicitações de ping para um endereço IP inexistente, ping
ocorrerá uma falha com um código de saída de erro. Podemos então usar echo
para verificar se o código de saída é diferente de zero.
tempo limite --preserve-status 1m ping -c 5 NotHere.local
echo $?
O ping
comando 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
timeout
trata 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 timeout
e deixe seu computador se auto-regular.