Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-05-02 19:46:12

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

[+] skrypt terminal-wget

Witam
Mam pytanie jak można zrobić skrypt (czy jest to w ogóle możliwe)  który odpali mi np od 1 do 5 terminali (petla for) i uruchomi w nich program wget który pobierze z pliku zewnętrznego o nazwie np lista.txt 5 adresów stron internetowych (znajdujących się w tym pliku) i odpali je osobno w odpowiadających mu otwartych 5 terminalach.

Nie wiem za bardzo czy jest możliwości odpalenie terminala z opcją odpalenia wget?

początek bym zaczął tak:

Kod:

#!/bin/bash
a=roxterm;
b=wget --recursive --server-response <lista.txt;
for a in ' seq 1 5';
do a;
for b in' seq 1 5';  
do b;
done;
done;

Tylko, że mi tak na prawdę nie łączy wgeta z terminalami. Proszę ewentualnie o pomoc albo wskazówkę gdzie szukać.

Ostatnio edytowany przez torpeda80 (2012-05-04 19:49:41)

Offline

 

#2  2012-05-02 20:40:00

  kondziu jah - Użytkownik

kondziu jah
Użytkownik
Skąd: Zgorzelec
Zarejestrowany: 2011-05-04

Re: [+] skrypt terminal-wget

Kod:

lista=$(cat ~/pirackie_programy/linki.txt)
for adres in lista
do
nazwa_terminala -e wget [opcje] adres
done

Sprawdź manual swojego terminala - zazwyczaj otwiera się nowe okno opcją '-e'.

Jeśli lista jest dłuższa niż 5 pozycji, to można ograniczyć terminale/wgety do wymaganych 5, np. tak:

Kod:

licznik=0
lista=$(cat ~/pirackie_programy/linki.txt)
until [ "$licznik" = "5" ]
do
for adres in lista
do
nazwa_terminala -e wget [opcje] adres
licznik=$(licznik+1)
done
done

Ostatnio edytowany przez kondziu jah (2012-05-02 20:47:51)

Offline

 

#3  2012-05-03 16:38:39

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: [+] skrypt terminal-wget

torpeda80 napisał(-a):

Nie wiem za bardzo czy jest możliwości odpalenie terminala z opcją odpalenia wget?

jak już wyżej kolega napisał. przełącznik -e


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

#4  2012-05-03 17:08:34

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [+] skrypt terminal-wget

torpeda80 napisał(-a):

Witam
Mam pytanie jak można zrobić skrypt (czy jest to w ogóle możliwe)  który odpali mi np od 1 do 5 terminali (petla for) i uruchomi w nich program wget który pobierze z pliku zewnętrznego o nazwie np lista.txt 5 adresów stron internetowych (znajdujących się w tym pliku) i odpali je osobno w odpowiadających mu otwartych 5 terminalach.

Czekaj.

Po pierwsze, każdy terminal ma pobrać swój plik lista.txt zawierający 5 adresów, czy jest jeden plik lista.txt z którego każdy z 5 terminali ma wziąć jeden adres? Bo w pierwszym przypadku mówimy o 25 plikach, w drugim — o 5. Różnica dość znaczna.

Po drugie, Ty chcesz te 2?5 stron otworzyć w różnych terminalach, czy chcesz 2?5 plików pobrać na dysk?
Bo w tym drugim przypadku właściwie nie potrzeba Ci żadnego emulatora terminala, ale dla wygody możesz skorzystać z jednego. Więcej nie jest w żadnym razie potrzebne.

Offline

 

#5  2012-05-04 00:13:11

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

Re: [+] skrypt terminal-wget

Chodziło mi o to aby każdy terminal pobrał jeden adres do siebie i zaczął pobierać stronę na dysk. kazdy terminal pobiera oddzielnie jeden inny adres strony.
Dodotkowo przy opcji:

Kod:

licznik=0
lista=$(cat ~/stronyv0.txt)
until [ "$licznik" = "5" ]
do
for adres in lista
do
roxterm -e wget -recursive --serwer-response adres
licznik=$(licznik+1)
done
done

otrzymuje komunikat

Kod:

./www2.sh: line 11: licznik+1: nie znaleziono polecenia

Jak zmienie na licznik++ to też ten sam komunikat.

Ostatnio edytowany przez torpeda80 (2012-05-04 00:27:26)

Offline

 

#6  2012-05-04 00:46:56

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [+] skrypt terminal-wget

torpeda80 napisał(-a):

Chodziło mi o to aby każdy terminal pobrał jeden adres do siebie i zaczął pobierać stronę na dysk. kazdy terminal pobiera oddzielnie jeden inny adres strony.

OK.

Po co Ci te emulatory terminala? Chcesz pobrać X plików z X różnych stron. Zrobisz to wywołując wgeta w pętli. wget domyślnie kontynuuje pobieranie w przypadku kłopotów z łączem (zobacz dokumentację parametru --tries i szereg opcji --timeout — domyślne ustawienia są dość wysokie). Wyjście możesz przekierować do pliku przy pomocy opcji -o (małe o — wielkie służy do czegoś innego).

Przypuszczam, że terminale są Ci potrzebne po to, aby móc równolegle pobierać te pliki, które pewnie są dość duże (chociaż o ile problemem nie prędkość wysyłania po stronie serwera, to nie ma większej różnicy między uruchamianiem wgetów równolegle a po kolei). Normalnie mógłbyś wgeta wysłać w tło przy pomocy & (tzw. etka, ampersand), ale akurat wget jest tak miły, że sam potrafi się sforkować przy pomocy przełącznika -b.

A może chcesz móc śledzić postęp pobierania tych równolegle pobieranych plików? Możesz to robić przy pomocy tail z przełącznikiem -f. Możesz również skorzystać z programu multitail albo uruchamiać kolejne wgety w osobnych oknach jednej sesji screena, pomiędzy którymi będziesz się przełączał.

W każdym wypadku możesz chcieć zrobić jakąś pomocniczą funkcję, która będzie śledziła zachowanie wgeta i w przypadku nieudanego pobierania wyśle Ci e-maila, zostawi gdzieś jakiś plik, zapisze coś do sysloga, wyśle powiadomienie (notify-send z pakietu libnotify-bin), pokaże okienko (np. zenity, kdialog, xmessage) czy zrobi cokolwiek innego.

Szczerze mówiąc, nie potrafię sobie wyobrazić dlaczego mógłbyś chcieć otwierać osobne okno emulatora terminala dla każdego wgeta.

torpeda80 napisał(-a):

Kod:

licznik=0
lista=$(cat ~/stronyv0.txt)
until [ "$licznik" = "5" ]
do
for adres in lista
do
roxterm -e wget -recursive --serwer-response adres
licznik=$(licznik+1)
done
done

otrzymuje komunikat
./www2.sh: line 11: licznik+1: nie znaleziono polecenia

Zapomniałeś w argumencie wgeta poprzedzić „adres” znakiem dolara.
Niby mógłbym napisać, że rozwiązaniem Twojego problemu jest let (let licznik+=1), ale wolę pokazać, jak zrobić to dobrze:

Kod:

while read adres; do
   wgety -b "$adres"
done < ~/stronyv0.txt

Offline

 

#7  2012-05-04 01:24:44

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

Re: [+] skrypt terminal-wget

Dzięĸuję jestem pełen podziwu. Działą bezbłędnie. Chciałem otworzyć wgety w osobnych terminalach aby moc przeglądać postęp ściagania stron ale widzę, że było to zbyteczne (dziękuję za przetarcie oczu :-)).
Jeżeli mogę jeszcze prosić o małe wyjaśnienie aby w pełni zrozumieć zapis tego skryptu.

Do póki czyta adresy stron z pliku ~/stronyv0.txt ma wykonywać wgety odnosząć się do adresu?
Ale skąd on wie, że adres to jest jeden wiersz z pliku stronyv0.txt?

Offline

 

#8  2012-05-04 12:31:22

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [+] skrypt terminal-wget

Konstrukcja

Kod:

while read nazwa_zmiennej; do ; done < /plik/wejściowy

Czyta /plik/wejściowy linia po linii i przy każdej iteracji przyporządkowuje odczytane dane do zmiennej nazwa_zmiennej. Zazwyczaj pisze się:

Kod:

while read line

co jasno wskazuje, że czytamy linia po linii, ale w tym wypadku wiemy, że /plik/wejściowy zawiera adresy stron internetowych (i tylko te adresy), więc dla czytelności możemy zmienną nazwać adres.

A tak swoją drogą — z tego co widzę, pobierasz całe strony na dysk. Być może nie znasz programu httrack, który właśnie do tego służy, a który może uznasz za lepiej odpowiadający Twoim potrzebom niż wget.

Ale wracając do pętli — chyba że pytasz o to, skąd ona wie, że ma przeczytać właśnie jedną linię, a nie np. jej część. Szczerze? Nie mam większego pojęcia. Na pewno ma to coś wspólnego ze zmienną $IFS, której zawartość powłoka wykorzystuje przy odczytywaniu poleceń (oddzielaniu komend od siebie, opcji od komend, argumentów od opcji itd.). Jakoś nigdy nie wnikałem szczegółowo w ten mechanizm. Przyjmuję jako pewnik, że tak po prostu działa polecenie read.

Swoją drogą, warto wiedzieć, że read może przyjmować jako argument więcej niż jedną zmienną. Dzięki temu zamiast męczyć się cutem czy awk, można wykorzystać samą powłokę. Taki szkolny przykład:

Kod:

$ cat /tmp/passwd.sh 
#!/bin/sh
IFS=":"
while read userlogin password userid groupid username homedir loginshell; do
        if [ "$userid" -ge 1000 ]; then
                echo "Użytkownik ${userlogin} (${userid}) mieszka w ${homedir} i loguje się przy pomocy ${loginshell}"
        fi
done < /etc/passwd
$ /tmp/passwd.sh 
Użytkownik nobody (65534) mieszka w /nonexistent i loguje się przy pomocy /bin/sh
Użytkownik minio (1000) mieszka w /home/minio i loguje się przy pomocy /bin/bash
Użytkownik test (1001) mieszka w /home/test i loguje się przy pomocy /bin/bash

Ostatnio edytowany przez Minio (2012-05-04 12:34:54)

Offline

 

#9  2012-05-04 19:49:22

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

Re: [+] skrypt terminal-wget

Dziękuję jeszcze raz za pomoc oraz za wyjaśnienie. Z programem httrack się zapoznam ale przykład skryptu wiele mnie nauczył.
Temat zamykam.
pozdrawiam

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)