Skryptologia i systemy kolejkowe Franek Rakowski, Maria Fronczak, Maciek Cytowski 3 czerwiec 2005 p.1/70
Program 1. Wstęp do skryptologii 2. Powłoka tcsh 3. Powłoka bash 4. Program awk 5. Program sed 6. Makefile - programy automatycznej kompilacji 7. Skrypty PBS 3 czerwiec 2005 p.2/70
1. Wstęp dp skryptologii 3 czerwiec 2005 p.3/70
Powłoki Środowisko pracy Powłoki sa po prostu programami Rodziny powłok: sh: bash csh: tcsh ksh 3 czerwiec 2005 p.4/70
Powłoki - interpretery poleceń Proste (bardzo) języki programowania Skrypty - programy Skrypty sa intepretowane Polecenia wbudowane - opisy w bashu: help nazwapoleceniawbudowanego (Polecenia zewnętrzne - opisy przez: man nazwapoleceniazewnętrznego) 3 czerwiec 2005 p.5/70
Ogólna budowa skryptu Linie zaczynajace się od # sa komentarzami Wyjatki: Wpisywanie w 1. wierszu, od 1. kolumny, nazwy interpretatora, dla którego skrypt jest przeznaczony: #!/bin/bash polecenia systemu kolejkowego: #PBS -l cput=24:00:00 3 czerwiec 2005 p.6/70
Uruchomienie skryptu Nadajac mu prawa do wykonywania i uruchamiajac jak każdy program: chmod +x nazwaskryptu./nazwaskryptu (Wykonanie przez interpreter potomny) Wywołujac interpreter z nazwa skryptu: bash nazwaskryptu (Wykonanie przez interpreter potomny) Korzystajac z polecenia source: source nazwaskryptu (lub krócej:. nazwaskryptu (Wykonanie przez bieżacy interpreter) 3 czerwiec 2005 p.7/70
Różnice przy różnych sposobach uruchamiania > less skrypt1: #!/bin/bash export ZMIENNA1=newvalue cd /home/users/mfroncz/src > pwd /home/users/mfroncz > echo $ZMIENNA1 oldvalue 3 czerwiec 2005 p.8/70
Różnice przy różnych sposobach uruchamiania >./skrypt1 > pwd /home/users/mfroncz > echo $ZMIENNA1 oldvalue > source skrypt1 > pwd /home/users/mfroncz/src > echo $ZMIENNA1 newvalue 3 czerwiec 2005 p.9/70
2. Powłoka tcsh 3 czerwiec 2005 p.10/70
Powłoka csh i tcsh przykład: #!/bin/tcsh set a while ( $a <= 20 ) echo $a @ a=$a + 1 # Operacje arytmetyczne, uwaga na spacje! end 3 czerwiec 2005 p.11/70
Powłoka csh i tcsh opcje: -f unset, setenv, unsetenv @ a++ 3 czerwiec 2005 p.12/70
Powłoka csh i tcsh Zmienne - definiowanie i odwoływanie się do zmiennych: set a a = 3 echo $a unset a set lancuch=(mag jest dziwny) echo $lancuch[2] echo $lancuch 3 czerwiec 2005 p.13/70
Powłoka csh i tcsh set lancuch=(mag$a jest dziwny) ale set lancuch=(mag $a jest dziwny) czy set lancuch= mag jest dziwny 3 czerwiec 2005 p.14/70
Powłoka csh i tcsh Substytucje zmiennych: $$ numer procesu $argv[*] $argv[number] ${?name} ${#name} wszystkie parametry wywołania parametr wywołania 1 jeśli zmienna name istnieje, 0 liczba słów w zmiennej name 3 czerwiec 2005 p.15/70
Powłoka csh i tcsh Modyfikatory zmiennych: set a=plik.txt np: echo $a :r rdzeń nazwy pliku :e rozszerzenie nazwy pliku 3 czerwiec 2005 p.16/70
Powłoka csh i tcsh wyrażenia logiczne: ( $a <= 20 ) $$ i == = >= < lub!=! glob-pattern <= > pętla foreach: foreach i (wordlist)... end 3 czerwiec 2005 p.17/70
Podstawienia Variable substitution: $$ numer procesu history substitution:! ostatnie polecenie command substitution: wykonuje polecenie w cudzysłowie 3 czerwiec 2005 p.18/70
Podstawienia ale foreach i (*) == foreach i ( ls ) foreach i in ( seq 1 10 ) echo $i end 3 czerwiec 2005 p.19/70
Podstawienia Instrukcje warunkowe: if (expr1) then... else if (expr2) then... else... endif expr1 warunek logiczny np. ( $i <= 100 ), ( $a!= ) lub -op plik opcje filetest np. ( -e plik ), op= -efxrwzd... 3 czerwiec 2005 p.20/70
Cudzysłowy i dołaczenia - zachowuje wszystkie znaki, nawet, zwraca jedno słowo. - zachowuje znaki podstawień zmiennych np. $, bez podstawień plików np. *,?, zwraca jedno słowo. - wykonuje polecenie i zwraca jego wynik - ciag wyrazów. Dołaczanie innych plików z przenoszeniem zmiennych: source./plik.tcsh 3 czerwiec 2005 p.21/70
3. Powłoka bash 3 czerwiec 2005 p.22/70
Wejście/wyjście - wiadomości podstawowe Deskryptory: 0 - standardowe wejście (stdin) 1 - standardowe wyjście (stdout) 2 - standardowy strumień diagnostyczny (stderr) Każdemu otwartemu plikowi odpowiada co najmniej jeden deskryptor 3 czerwiec 2005 p.23/70
Przekierowywanie stdin i stdout Przekierowanie: pliku na standardowe wejście: < nazwapliku standarowego wyjścia na plik z nadpisaniem (skasowanie poprzedniej treści tego pliku) > nazwapliku standarowego wyjścia na plik z dopisaniem na koniec tego pliku: > > nazwapliku Np.:./program < plikwejściowy > > plikwyjściowy 3 czerwiec 2005 p.24/70
Przekierowywanie stderr Przekierowanie: standarowego strumienia diagnostycznego na plik z nadpisaniem (skasowanie poprzedniej treści tego pliku): 2> nazwapliku standarowego strumienia diagnostycznego na plik z dopisaniem na koniec tego pliku: 2> > nazwapliku To zadziała zawsze:./program 2> plikwyjściowy 3 czerwiec 2005 p.25/70
Przekierowywanie stdout i stderr jednocześnie Skopiowanie stderr na stdout: 2>&1 W bashu można użyć do jednoczesnego przekierowania po prostu:./program > plik 2> plik W tcsh przejdzie tylko:./program >& plik Uwaga:./program 2>&1 > plik przekieruje na plik tylko stdout. Stderr trafi na stdout (sprzed przekierowania) 3 czerwiec 2005 p.26/70
Zmienne zwykłe - bash Nie trzeba ich deklarować, ale można: help declare Sprawdzanie wartości: echo $NAZWAZMIENNEJ Ustawianie wartości (domyślnie napisy, można zadeklarować inaczej) NAZWAZMIENNEJ=WARTOŚĆ (bez spacji!) Np.: napis1= Ala ma kota ; napis2=$napis1 Często przypisanie wraz z eksportowaniem: export NAZWAZMIENNEJ=WARTOŚĆ 3 czerwiec 2005 p.27/70
Zmienne środowiskowe - bash Zmienne takie jak: HOME, SHELL, USER, PWD. Sprawdzenie wartości wszystkich: set Operacje (poza deklarowaniem) jak na zmiennych zwykłych Przypisanie nawet bez export widoczne w programach wywoływanych z bieżacej instancji interpretera 3 czerwiec 2005 p.28/70
Parametry wywołania skryptu Do kolejnych parametrów skryptu odwołujemy się przez: $1, $2,..., $9, ${10}, ${11},... $0 - nazwa skryptu $# - liczba parametrów $* lub $@ - napis złożony ze wszystkich parametrów $? - kod zakończenia ostatniego polecenia 3 czerwiec 2005 p.29/70
Parametry wywołania skryptu - c.d. Do poruszania się po liście parametrów służy shift: shift n przesuwa listę w lewo o n pozycji: parametr o numerze n + 1 staje się pierwszy shift (bez parametrów) równoznaczne z shift 1 Uwaga! set NAPIS1 NAPIS2 w bashu ustawi $1 na NAPIS1, $2 na NAPIS2, a wyzeruje wszystkie dalsze parametry ($3, $4,...) (W tcsh set NAPIS1 NAPIS2 ustawi wartość zmiennej NAPIS1 na NAPIS2) 3 czerwiec 2005 p.30/70
Kody zakończenia poleceń Polecenia przekazuja kody zakończenia: 0 - zakończenie pomyślne, 1 - zakończenie z błędem. Polecenia można łaczyć: rm -f plik echo Błąd w rm polecenie1; polecenie2 - zwykłe złożenie: wykonaj polecenie1, potem wykonaj polecenie2 polecenie1 && polecenie2 - wykonaj polecenie2 jeśli polecenie1 zakończylo się sukcesem polecenie1 polecenie2 - wykonaj polecenie2 jeśli polecenie1 zakończyło się porażka 3 czerwiec 2005 p.31/70
Instrukcja if if COMMANDS1 then COMMANDS2 [else COMMANDS3] fi if COMMANDS1 then COMMANDS2 [else COMMANDS3]fi Wykonywane COMMANDS1 i zależnie od kodu ich zakończenia COMMANDS2 albo COMMANDS3. Przy zagnieżdżaniu można używać elif 3 czerwiec 2005 p.32/70
Polecenie wbudowane test Polecenie test używane jako warunek if: Porównywanie liczb: -eq -ne -lt -le -gt -ge Porównywanie napisów: =,!= ; -z - pusty, -n niepusty Testowanie plików: -d katalog, -f plik zwykły Łaczenie testów: negacja!, koniunkcja -a, altermatywa -o Inne: help test if test -w $1 -a -f $1; then...; fi 3 czerwiec 2005 p.33/70
Operacje arytmetyczne Zadeklarowanie zmiennej jako całkowitoliczbowej i zwykłe operatory: declare -i k=0; k=k+1; Polecenie wbudowane let lub $[ ] lub $(( )): k=0; let k=k+1; k=0; k=$[k+1]; Jeśli obliczone wyrażenie daje 0, kodem zakończenia let jest 1, wpp. 0. Polecenie zewnętrzne expr (dla każdej operacji nowy proces!): k=0; k=$(expr $k + 1) (spacje sa istotne) 3 czerwiec 2005 p.34/70
Pętla while while COMMANDS1 do COMMANDS2 done while COMMANDS1; do COMMANDS2; done Póki kod zakończenia COMMANDS1 równy 0, wykonuje COMMANDS2 3 czerwiec 2005 p.35/70
Pętla for for NAME [ in WORDS...] do COMMANDS done WORDS jest lista obiektów Jeśli nie podamy WORDS, for iteruje się po parametrach skryptu `seq n` daje listę liczb naturalnych od 1 do n Nowsza składnia: for (( expr1; expr2; expr3)); do list; done for k in 1 2; do echo $k; done 3 czerwiec 2005 p.36/70
Funkcje (bash) [ function ] NAME () { COMMANDS; } Wywołanie: nazwafunkcji [arg] Odwołania do parametrów przez $1, $2,... (przesłonięcie parametrów skryptu) deklaracja zmiennych lokalnych: local i Kodem zakończenia funkcji jest kod ostatniego wykonanego polecenia Do wyniku (ostatnio wołanej) funkcji można się odwołać przez $? 3 czerwiec 2005 p.37/70
4. Program awk 3 czerwiec 2005 p.38/70
Wklejanie innych programów - awk awk BEGIN{...na dobry początek...} \ {... polecenia awk przetwarzające \ każdy rekord pliku...} \ END{...polecenia na zakończenie...} <plik awk BEGIN{} { if(fnr>4){e=\$5*627.5;printf("%d\t%f\n",\$1,e)} } END{} < plik.inp > plik.out 3 czerwiec 2005 p.39/70
awk (Aho, Weiberger, Kernighan) #!/bin/tcsh set a=ala set lan=(mag jest dziwny) echo lan awk {print $1 " $a "} Operacje zmiennoprzecinkwe: set y= echo 3 awk {e=$1*2.23;print e} echo $y lub set y= echo scale=2;3*2/20 bc -l 3 czerwiec 2005 p.40/70
awk (Aho, Weiberger, Kernighan) elementy awk: sformatowane wyjście: printf operacje arytmetyczne zmiennoprzecinkowe, wbudowane funkcje: sin(),cos(),exp(),... if ()...;else... for(i-1;i<=3;i++)...; break,exit,continue. array[] - tablice wbudowane zmienne: NF,NR,FNR,FILENAME,ARGC,ARGV 3 czerwiec 2005 p.41/70
5. Program sed 3 czerwiec 2005 p.42/70
Sed Język skryptowy do operacji na plikach, przetwarza je linia po linii Kopiuje podane pliki na standardowe wyjście, dokonujac przy okazji ich edycji zgodnie z podanymi komendami Komendy można podać wywołujac seda badź podać sedowi jako skrypt: sed -e s/pies/kot/g plik sed -f skrypt plik Postać komend: [adres1 [, adres2]] funkcja [argumenty] 3 czerwiec 2005 p.43/70
Wyrażenia regularne Sed używa wyrażeń regularnych takich jak grep. ˆ - pasuje do poczatku linii $ - pasuje do końca linii. - pasuje do pojedynczego znaku (znak)* - pasuje do dowolnie wielu wystapień znaku pod rzad (znak)? - pasuje do 0 lub 1 wystapień znaku [ajz] - pasuje do któregoś z wyminionych znaków [ajz] - pasuje do dowolnego znaku poza wyminionymi 3 czerwiec 2005 p.44/70
Komenda podstawienia [adres1[, adres2]]s/wzorzec/czymzastapić/[flagi] Możliwe flagi: g - zastap wszystkie wystapienia wzorca n - zastap n-te wystapienie wzorca Adresy identyfikuja linie, w których chcemy dokonywać podstawień Możliwe adresy: /wyrażenieregularne/ - linie, których część pasuje do wyrażenia numer linii ($ - ostatnia linia) 3 czerwiec 2005 p.45/70
Adresy - dokładniej Jeśli w liście adresów podamy 2 adresy: adres1, adres2, komenda dotyczyć będzie linii: od pierwszego wystapienia adres1 do pierwszego wystapienia adres2 od wystapienia adres1 po już trafionym wystapieniu adres2 do następnego wystapienia adres2 Operator negacji! wskazuje, że komenda odnosi się do linii nieybranych przez adres (badź adresy). 3 czerwiec 2005 p.46/70
Przykład podstawienia > cat plik Ala ma kota, ale nie ma psa. Ala ma kota i psa. > sed -e /nie/s/psa/chomika/g plik Ala ma kota, ale nie ma chomika. Ala ma kota i psa. 3 czerwiec 2005 p.47/70
Komenda usunięcia [adres1[, adres2]]d > cat plik Ala ma kota, ale nie ma psa. Ala ma kota i psa. Ala ma psa, ale nie kota. > sed -e 2,$d plik Ala ma kota, ale nie ma psa. 3 czerwiec 2005 p.48/70
Wstawianie tekstu Komenda i wstawia tekst przed bieżac a linia: sed -e 1iJakisTekst plik wstawi JakisTekst przed poczatkiem pliku. Komenda a wstawia tekst za bieżac a linia: sed -e $ajakistekst plik wstawi JakisTekst na końcu pliku. Komenda c pozwala zastapić zawartość linii: sed -e 10cNowaZawartośćLinii10 plik 3 czerwiec 2005 p.49/70
Komendy różne Wiele komend: sed -e 1,4d 6,9d plik lub: sed -e 1,4d -e 6,9d plik Wyłaczenie wypisywania na stdout: sed -n -e komenda (lub #n w pierwszej linii sedowego skryptu) Wypisywanie: sed -n -e 1,10p 3 czerwiec 2005 p.50/70
Makefile - programy automatycznej kompilacji 3 czerwiec 2005 p.51/70
Reguły Reguły sa postaci: cel: lista zależności TAB polecenie Np.: prog: prog.o err.o gcc -Wall -o prog prog.o err.o Plik Makefile może zawierać wiele reguł Domyślnie wykonywana jest pierwsza reguła z pliku Można wywołać make podajac nazwę celu, np: make prog, make clean 3 czerwiec 2005 p.52/70
Cele i zależności clean: Cele moga, choć nie musza być nazwami plików do zbudowania Lista zależności to oddzielona spacjami lista nazw plików i celów Nazwy plików w zależnościach określaja pliki, których zmiana powoduje ponowne wybudowanie celu Nazwy plików w regule moga zawierać uogólnienia (np. *), rozwijane jak w shellu. rm -f *.o core 3 czerwiec 2005 p.53/70
Zmienne W Makefile można używać zmiennych, definiuje się je przez: NAZWAZMIENNEJ = wartosc Odwołanie się do zmiennej jak do zmiennych w shellu: $NAZWAZMIENNEJ Można odwoływać się do zmiennych shellowych, ale definicje zmiennych w Makefile przysłaniaja wartości ze środowiska Znaki specjalne w wartości zmiennej (jak *) rozwijane sa dopiero w momencie użycia 3 czerwiec 2005 p.54/70
Zmienne - przykład CC = gcc CFLAGS = -Wall prog: prog.o err.o $(CC) $(CFLAGS) -o prog prog.o err.o 3 czerwiec 2005 p.55/70
Zmienne specjalne By nie powtarzać identycznych definicji $@ - nazwa celu danej reguły $< - nazwa pierwszego celu, od którego zależy cel w danej regule $? - lista nazw celów, od których zależy cel w danej regule, a które sa nowsze niż ten cel $ˆ - lista nazw wszystkich celów, od których zależy cel w danej regule $* - nazwa celu w bieżacej regule bez rozszerzenia (.c,.h,.o) 3 czerwiec 2005 p.56/70
Reguły domyślne Stosowane, gdy żadna jawna reguła nie pasuje do podanej nazwy celu Do zdefiniowania reguły domyślnej używa się reguły, która w nazwie celu ma % (% może też występować w zależnościach) %.o : %.c $(CC) -c $(CFLAGS) $< Alternatywna, jeszcze krótsza notacja dla powyższego:.c.o : $(CC) -c $(CFLAGS) $< 3 czerwiec 2005 p.57/70
Inny styl definiowania zaleznosci objects = err.o prog.o prog: $(objects) cc -o prog $(objects) $(objects) : defs.h 3 czerwiec 2005 p.58/70
Budowa Makefile a, opcje make Znak # rozpoczyna komentarz, który ciagnie się do końca wiersza Typowe cele: all, clean Opcje make: -f nazwapliku używa podanego pliku zamiast Makefile -n - wypisuje polecenia, jakie byłyby wykonane, ale bez wykonania -i - ignoruje błędy 3 czerwiec 2005 p.59/70
7. Skrypty PBS 3 czerwiec 2005 p.60/70
PBS w ICM System kolejkowy PBS w ICM znajdziemy na: halo tornado latimerii Wykonywanie obliczeń na tych maszynach dozwolone jest tylko i wyłacznie przy użyciu PBS. 3 czerwiec 2005 p.61/70
Idealny użytkownik Idealny scenariusz pracy: przygotowanie programu identyfikacja zasobów których potrzebuje program załaczenie programu do systemu kolejkowego, właściwie określajac zasoby Dzięki kontroli nad systemem kolejkowym mamy (praktycznie) pełna kontrolę nad przepływem pracy na danej maszynie. 3 czerwiec 2005 p.62/70
o PBS dostępny na wszystkich systemach unix-owych klastry Linux-owe dwie gałęzie: OpenPBS oraz PBSpro 3 czerwiec 2005 p.63/70
Zasoby w orębie jednego CPU, PBS wymaga określenia co najmniej dwóch zasobów: czasu CPU Ilości pamięci dla równoległych zadań wieloprocesorowych, PBS musi również wiedzieć ile node ów/cpu zajmie zadanie inne rzeczy do rozważenia: nazwa zadania? gdzie skierować standardowe wyjście i bład? czy system powinien zawiadomić nas mail em po zakończeniu zadania? 3 czerwiec 2005 p.64/70
Przydatne opcje PBS -l mem=n[kmg] (zadanie wykorzysta N [kilo mega giga] bajtów pamięci) -l cput=hh:mm:ss (maksymalny czas CPU na zadanie PBS) -l walltime=hh:mm:ss (maksykalny czas zegarowy na zadanie PBS) -l nodes=n:ppn=m (zadanie wykorzysta N node ów, w tym na każdym po M procesorów) halo!!! -I (uruchom jako zadanie interaktywne) -N jobname (nazwa zadania) 3 czerwiec 2005 p.65/70
Przydatne opcje PBS cd. -S shell (użyj powłoki shell zamiast domyślnej do interpretacji skryptu PBS) -q queue (zadanie ma być wstawione do wskazanej kolejki queue) -o outfile (skieruj standardowe wyjście do pliku outfile) -e errfile (skieruj bład do pliku errfile) -j oe (połacz standardowe wyjście i bład) -m e (wyślij mail a do użytkownika po zakończeniu zadania) 3 czerwiec 2005 p.66/70
PBS różnice na latimerii: konieczne jest ustawianie limitow na: pamiec, czas oraz liczbe procesow liczbę procesorów ustawiamy za pomoca: -l ncpus=n na tornado: liczbę procesorów ustawiamy za pomoca: -l mppe N dla MSP lub -l mppssp N dla SSP 3 czerwiec 2005 p.67/70
Operacje na zadaniu Załaczanie zadania: z użyciem polecenia qsub: sheed@halo:# qsub submit.pbs Opcje moga być również podane z linii komend. Monitorowanie zadania: z użyciem polecenia qstat qstat qstat -a qstat -f qstat -Q Modyfikacja i zabijanie zadania: qalter w celu zmiany przydzielonych zasobów oraz qdel w celu zabicia zadania identyfikowanego poprzez job_id 3 czerwiec 2005 p.68/70
Przykładowy skrypt #!/bin/tcsh #PBS -N zadanie #PBS -l nodes=8:ppn=2 #PBS -l walltime=24:00:00 #PBS -l file=5gb #PBS -m e echo Job started echo " " at date echo " " on host hostname echo " " working directory is $PBS_O_WORKDIR echo " " will run on cat < $PBS_NODEFILE set numprocs= wc -l < $PBS_NODEFILE #uruchamiamy zadanie mpi owe programem mpiexec #ponizsza komenda jest rownowazna w stosunku do #mpirun -nolocal -np $numprocs -machinefile $PBS_NODEFILE./cpi mpiexec -transform-hostname=s/^n/a/./cpi echo Job finished at date 3 czerwiec 2005 p.69/70
Co dalej? zapraszamy na kolejne szkolenia działu KDM zapraszamy na dni otawrte działu KDM (info na http://www.icm.edu.pl/kdm/) adres pocztowy grupy kdm-support: kdm-support@icm.edu.pl inne wydarzenia w ICM 3 czerwiec 2005 p.70/70