6

Как я могу заставить wget остановиться через X секунд?

У меня есть скрипт, который загружает изображения, и время от времени он застревает и отказывается от «тайм-аута».

Что я пробовал:

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

Из 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

4 ответа4

10

Самый простой способ - использовать команду timeout(1) , входящую в состав GNU coreutils, поэтому она доступна практически везде, где установлен bash:

timeout 60 wget ..various wget args..

или если вы хотите жестко убить wget, если он работает слишком долго:

timeout -s KILL 60 wget ..various wget args..
2

Вы можете запустить команду wget как фоновый процесс и отправить SIGKILL, чтобы принудительно убить его после сна в течение определенного времени.

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

Объяснение:

  • wget ... & - запись & в конце запускает команду в фоновом режиме, а не на переднем плане
  • wget_pid=$! - $! является специальной переменной оболочки, которая содержит идентификатор процесса самой последней выполненной команды. Здесь мы сохраняем его в переменную с именем wget_pid .
  • while [[ -n $(ps -e) | grep "$wget_pid") && "$counter" -lt "$timeout" ]] - Поиск процесса каждую секунду, если он все еще там, продолжайте ждать до ограничения времени ожидания.
  • kill -s SIGKILL "$wget_pid" - мы используем kill чтобы принудительно уничтожить процесс wget, работающий в фоновом режиме, отправив ему сигнал SIGKILL .
0

Недавно я заметил, что wget 1.14 молча игнорирует параметр --timeout , он работал нормально, когда я обновил его до 1.19

0

Вики сообщества, потому что это в основном копия ответа сампсона-чена, но я хотел бы отметить несколько вещей:

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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .