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 timeout
comando. 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.
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.