Force wget to timeout

6

Como posso forçar o wget a parar após X segundos?

Eu tenho um script que baixa imagens e, de tempos em tempos, fica preso e se recusa a "timeout".

O que eu tentei:

--tries=3 --connect-timeout=30

De ps aux :

root     26543  0.0  0.0  38636  1656 ?        S    20:40   0:00 wget -nc --tries=3 --connect-timeout=30 --restrict-file-names=nocontrol -O 18112012/image.jpg http://site/image.jpg
    
por teslasimus 05.12.2012 / 19:49

4 respostas

2

Você pode executar o comando wget como um processo em segundo plano e enviar um SIGKILL para forçá-lo a matá-lo depois de dormir por um determinado período de tempo.

wget ... &
wget_pid=$!
counter=0
timeout=60
while [[ -n $(ps -e) | grep "$wget_pid") && "$counter" -lt "$timeout" ]]
do
    sleep 1
    counter=$(($counter+1))
done
if [[ -n $(ps -e) | grep "$wget_pid") ]]; then
    kill -s SIGKILL "$wget_pid"
fi

Explicação:

  • wget ... & - a notação & no final executa o comando em segundo plano em oposição ao primeiro plano
  • wget_pid=$! - $! é uma variável de shell especial que contém o ID do processo do comando executado mais recentemente. Aqui nós o salvamos em uma variável chamada wget_pid .
  • while [[ -n $(ps -e) | grep "$wget_pid") && "$counter" -lt "$timeout" ]] - Procure o processo a cada segundo, se ainda estiver lá, espere até o limite de tempo limite.
  • kill -s SIGKILL "$wget_pid" - Usamos kill para forçar a destruição do processo wget executado em segundo plano enviando um sinal SIGKILL .
por 05.12.2012 / 19:52
10

A maneira mais fácil é usar o comando timeout(1) , parte do GNU coreutils, tão disponível em qualquer lugar onde o bash está instalado:

timeout 60 wget ..various wget args..

ou se você quiser danificar o wget se ele estiver rodando por muito tempo:

timeout -s KILL 60 wget ..various wget args..
    
por 05.12.2012 / 20:20
0

wiki da comunidade, porque isso é principalmente uma cópia da resposta de sampson-chen, mas eu queria apontar algumas coisas:

wget ... &
# Strictly speaking you can just use the job number,
# which is probably %1, but saving the pid is also fine.
wget_pid=$! 
counter=0
timeout=60
# use kill -0 to check if a pid is still running
while kill -0 "$wget_pid" && (( counter < timeout )); do
    sleep 1
    (( counter++ ))
done
# if killing nothing is distasteful, use kill -0 one more time.
# also think a SIGKILL is overkill since the question doesn't imply wget needs it.
kill -0 "$wget_pid" && kill "$wget_pid"
    
por 05.12.2012 / 20:31
0

Recentemente notei que o wget 1.14 estava silenciosamente ignorando a opção --timeout , funcionou bem quando eu atualizei para 1.19

    
por 08.07.2017 / 16:59