LINUX.ORG.RU
решено ФорумAdmin

Зависание bash скрипта

 ,


1

1

Всем привет, есть след скрипт который выкачивает файлы с веб страницы через GUI

#!/bin/bash
 
URLArray=(
'URL1...'
'URL2...'
...
'URL n'
)
 
function BackUp
{
URL=$1
WebPageLoadingTime=180
 
    gnome-terminal -- bash -c "firefox '$URL'"
    sleep $WebPageLoadingTime
 
    xdotool key Ctrl+slash
    sleep 10s
 
    xdotool type "save local copy..."
    sleep 5s
 
    xdotool key KP_Enter
    sleep 820s
 
    xdotool key Ctrl+w # close page 
 
}
 
for i in "${URLArray[@]}"
do
FileName=$(echo $i | sed -e 's|.*/||' -e s/--/' '/g -e s/-/' '/g -e 's/$/.pic/')
[ ! -f "$HOME/Downloads/$FileName" ] && BackUp "$i" || echo "$FileName already exist";
done

Периодически скрипт «сам по себе» зависает... страница просто не закрывается и не открывается... Причем абсолютно случайно Иногда полностью отрабатывает. Такое чувство что каждый раз как хочет - так и отрабатывает... Подскажите - в чем может быть проблема? ОС - Ubuntu


Я бы смотрел в эту сторону:

gnome-terminal – bash -c «firefox ‘$URL’»

gnome-terminal здесь не нужен. Нужно просто запустить firefox как фоновый процесс, взять его PID, а через некоторое время прибить с помощью kill. Сможешь реализовать, или нужны детали?

Kroz ★★★★★
()
Ответ на: комментарий от dim4k

Можно вместо взятия PID убивать так?

pkill -f firefox

Насколько я помню, так оно завершит все запущенные firefox’ы. Если так сделать, то параллельно с запуском своего скрипта тебе нельзя будет серфить в Интернете. Если тебя это устраивает - ок.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Есть такая штука в баше: $$. Она возвращает PID предыдущей команды. Читайте маны. И присоединюсь к товарищам выше…

realbarmaley ★★
()
Последнее исправление: realbarmaley (всего исправлений: 1)
Ответ на: комментарий от realbarmaley

Зачем так сложно я не понимаю… Есть curl и wget, там не нужен это геморрой с xdotool и sleep

Я не знаю как у ТС, пусть он скажет.

Но лично я встречался с ситуациями когда для правильной визуализации страницы нужен JavaScript. Это особенно популярно сейчас в Enterprise решениях, где люди оргазмируют от всех этих новомодных фреймворков, где всё динамически.

Для этой цели, конечно, можно использовать что-то вроде Selenium. Или можно сделать плагин для Firefox (когда-то он даже был, потом поломали обратную совместимость). Но порог входа всего этого выше. Поэтому что-то из xdotool и sleep может быть приемлемым как quick and dirty.

Kroz ★★★★★
()
Ответ на: комментарий от realbarmaley

Потому что на сайте не существует средств для автоматического сохранения. Это все делает «кликер»… А такие длительные «ожидания» пока файл загрузится а потом скачается!

dim4k
() автор топика
Последнее исправление: dim4k (всего исправлений: 1)
Ответ на: комментарий от anc

На сайте - значит на сайте!!! Средства автоматического сохранения - это для меня «адекватные REST-запросы» - которые разрабы не умудрились добавить, они думали что людям нравится все сохранят «в ручную».

dim4k
() автор топика
Ответ на: комментарий от realbarmaley

Я о нём знаю… Но там проблема в том что браузеры все время обновляются и селениум тоже надо обновлять… Дополнительные проблемы от этого… Не хочу селениум. Я не могу понять почему нормально не может выполнится обычный bash скрипт на каких то 50 строк?! Что в этом такого сложного то?! Я пробовал делать под Windows на PS - там вообще жпа… Сайт загружал проц на 100% и система висла… Современные ОС + Web скатились в унылое гано!??!?!

dim4k
() автор топика
Ответ на: комментарий от dim4k

… Но там проблема в том что браузеры все время обновляются и селениум тоже надо обновлять…

Не надо селениум - неудобный он для таких задач. Юзай Puppeteer и будет тебе счастье.

vinvlad ★★
()
Последнее исправление: vinvlad (всего исправлений: 1)

Может лучше потыкаться в веб-консоль и реализовать с помощью curl?

sleep 820s

зависает

Хрен его знает.

У тебя ещё какая-то странная конструкция с if в самом конце.

Что делает конструкция «FileName=$(...»? Такое ощущение, что ты basename пытаешься изобразить.

Radjah ★★★★★
()
Последнее исправление: Radjah (всего исправлений: 1)
Ответ на: комментарий от Radjah

Конструкция if - проверяет наличие скачанного файла в папке Downloads, если он уже «существует» - качать его «по новой» - не будет. По поводу 820s - есть один файл который сохраняется 750s (Да - это файлы графики и они «тяжелые»)!

dim4k
() автор топика
Последнее исправление: dim4k (всего исправлений: 1)
Ответ на: комментарий от dim4k

А зачем тебе версии менять?) Там конкретная версия Chromium грузится при установке пакета Puppeteer в папочку node_modules - поменяться может автоматом только при апгрейде Puppeteer. Никаких проблем. Ну и обновлять пакет никто не заставляет. Вот с селениумом ты действительно намучаешься, поскольку он юзает веб-обозреватели, установленные в системе, и для каждого еще соответствующие версии веб-драйверов.

vinvlad ★★
()
Ответ на: комментарий от Radjah
  1. На хрен и 820s - уже ответил

  2. зачем if - сказал

  3. FileName=$ - тут все просто я «формирую» имя файла из URL и каждый раз при скачивании проверяю его наличие!

dim4k
() автор топика
Последнее исправление: dim4k (всего исправлений: 1)
Ответ на: комментарий от dim4k

так а в чем проблема, указываете жестко версию в package.json и npm вам качает конкретную версию puppeteer и тащит под нее конкретную версию headless chrome и пока вы сами не исправите версию на другую в package.json никаких других версий у вас установлено не будет, с selenium все тоже самое.

abcq ★★
()