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
[quote=torpeda80]Nie wiem za bardzo czy jest możliwości odpalenie terminala z opcją odpalenia wget?[/quote]
jak już wyżej kolega napisał. przełącznik -e
Offline
[quote=torpeda80]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.[/quote]
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
[quote=torpeda80]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.[/quote]
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 [tt]--tries[/tt] i szereg opcji [tt]--timeout[/tt] — domyślne ustawienia są dość wysokie). Wyjście możesz przekierować do pliku przy pomocy opcji [tt]-o[/tt] (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 [tt]-b[/tt].
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 [tt]-f[/tt]. Możesz również skorzystać z programu [deb]multitail[/deb] albo uruchamiać kolejne wgety w osobnych oknach jednej sesji [deb]screen[/deb]a, 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 [deb]libnotify-bin[/deb]), 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.
[quote=torpeda80]
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[/quote]
Zapomniałeś w argumencie wgeta poprzedzić „adres” znakiem dolara.
Niby mógłbym napisać, że rozwiązaniem Twojego problemu jest [tt]let[/tt] ([tt]let licznik+=1[/tt]), 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 [deb]httrack[/deb], 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
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00095 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.191.178.16' WHERE u.id=1 |
0.00073 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.191.178.16', 1732762195) |
0.00049 | SELECT * FROM punbb_online WHERE logged<1732761895 |
0.00055 | SELECT topic_id FROM punbb_posts WHERE id=201204 |
0.00005 | SELECT id FROM punbb_posts WHERE topic_id=21190 ORDER BY posted |
0.00055 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=21190 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00199 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=21190 ORDER BY p.id LIMIT 0,25 |
0.00091 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=21190 |
Total query time: 0.0064 s |