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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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:
#!/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
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:
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
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
Offline
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
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:
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
Jak zmienie na licznik++ to też ten sam komunikat.
Ostatnio edytowany przez torpeda80 (2012-05-04 00:27:26)
Offline
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 doneotrzymuje 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:
while read adres; do wgety -b "$adres" done < ~/stronyv0.txt
Offline
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
Konstrukcja
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ę:
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:
$ 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
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