Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
Az időhöz kötődő parancsok Az idő nyilvántartása............................................................................................................................1 A date parancs .....................................................................................................................................2 A time parancs .....................................................................................................................................4 A sleep parancs.....................................................................................................................................5 Időzített programfuttatás..................................................................................................................6 Az at parancs .......................................................................................................................................6 A UNIX démonok............................................................................................................................6 A cron démon .....................................................................................................................................7
Az idő nyilvántartása -UTC koordinált világidő (Coordinated Universal Time, Temps Universel Coordonné) -precíz órával követett, nemzetközi időreferencia, standard idő -a GMT (Greenwich Mean Time) időt helyettesítette -időzónák: az UTC ezen a szinten ugyanazt a felosztást követi mint a GMT, ezért ez most is így jelenik meg a gépek időnyilvántartásában. Tehát a GMT az időzóna referencia -nyári időszámítás befolyása a nyilvántartott időre (DST: Daylight Saving Time) -az időzónáknak is van külön elnevezése: pl. Kelet Európai Zóna (EET: Eastern European Time) -gépek összehangolása: NTP (Network Time Control) protokoll -www.ntp.org -Interneten 10 ms szinten hangol össze, lokális hálózaton 200 mikroszekundum szinten -bármelyik gép órája eltérhet a pontos időtől, mert azok a rezgőkörök amelyekre a egy PC-n az órajelek épülnek sem egészen pontosak -rendszer hardver órája (a BIOS tárolja) Kapcsolódó állományok és parancsok: /sbin/hwclock másolja át a hardver időt a rendszerbe indításkor /etc/sysconfig/clock tartalmazza azt az információt, hogy UTC vagy helyi időt használok, és melyik időzónában vagyok (Fedora Linux-on): $ cat /etc/sysconfig/clock # The ZONE parameter is only evaluated by system-config-date. # The time zone of the system is defined by the contents of /etc/localtime. ZONE="Europe/Bucharest" $
-időmérés a UNIX-ban: a referencia 1970 január 1 (UNIX Epoch), szekundum alapú -egy 32 bites egész számban tárolja ezt az értéket -2038-ig működhet így -a C nyelvben használatos függvények képezik az alapját bármilyen programból történő időkezelésnek:
1
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
A time_t time(time_t * t); szekundumban visszaadja az Epoch óta eltelt időt, clock_t times(struct tms *buf); órajelekben (clock ticks) adja vissza a pillanatnyi időt, illetve a UNIX time parancsa által mért felhasználói és rendszer időket, a sysconf(_SC_CLK_TCK) hívással lehet lekérni az egy szekundumra eső órajelek számát, ez rendszerenként különböző lehet, 100/szekundum például. Az int gettimeofday(struct timeval *tv, struct timezone *tz); szekundumban és mikroszekundumban is visszaadja a pillanatnyi időt. Az idő lekérdezése: a rendszernek tudnia kell melyik időzónában van, és azt, hogy érvényben van-e nyári időszámítás. Így kijelöléskor az UTC időbélyegből ki tudja számítani a helyi időt. A rendszer órája (system time) vagy az UTC, vagy a helyi időt használja, beállítás szerint. A legtöbb alkalmazás többnyire az UTC idő időbélyegével (szekundumok Epoch óta) jelöli meg objektumait (állományok, adatbázis rekordok). Van eset amikor helyi időbélyeget használnak, de ilyenkor fel van tüntetve mellette az UTC-hez viszonyított eltérés (adatbázisoknál timestamp with time zone és timestamp without time zone típusú mezők). Így a világ bármely részén nézünk meg egy állományt, rekordot, az illető alkalmazás pontosan ki tudja írni létrehozásának, módosításának idejét a helyi idő kijelölésével. A shell programozásnál az idő lekérdezésénél legtöbbször a date parancsot használjuk.
A date parancs Használat lekérdezéshez: date +FORMAT
használat idő beállításhoz (csak root használhatja így): date
[MMDDhhmm[[CC]YY][.ss]]
valamint a GNU date rendelkezik a -d kapcsolóval konverziókhoz, használata: date -d idősztring +FORMAT
Az idő beállítását csak root végezheti el, ilyenkor a parancs argumentuma számjegyekből áll, és a hónapot (MM), napot (DD) , órát és percet (hhmm) tartalmazza. Ha szükséges, a sztring további részében megjelenhet az év (CCYY) és a szekundum. Az első használati módnál a FORMAT sztringben ugyanazok a formázó karakterek használhatóak, mint a C nyelv strftime() függvényében. Ilyenkor a date a megfelelő formázással kiírja a pillanatnyi időt. Ha valamilyen nevet kell kiírnia (nap, hónap) az LC_TIME környezeti változót veszi alapul a nyelv megállapításához, ha ez nincs akkor a LANG változót. Pl.: $ date Sat Dec 8 18:07:44 EET 2007 $ date +"%Y. %B %d %A" 2007. December 08 Saturday $ export LANG=hu_HU.utf-8 $ date +"%Y. %B %d %A" 2007. december 08 szombat
2
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás $
Gyakran használjuk a date által előállított sztringet állománynevek előállítására: $ date +"%Y-%m-%d" 2007-12-08 $ echo a > $(date +"%Y-%m-%d").txt $ ls *.txt 2007-12-08.txt $
A formázó sztringben az alábbi jelöléseket használhatjuk: %% %n %t
literális % újsor vízszintes tabulátor
Időmezők: %H %I %k %l %M %p %r %s %S %T %X %Z
óra (00..23) óra (01..12) óra ( 0..23) óra ( 1..12) perc (00..59) a helyi AM vagy PM 12-órás idő (hh:mm:ss [AP]M) az Koordinált Világidő (UTC) szerinti 1970-01-01 00:00:00 ót eltelt másodpercek másodperc (00..61) 24-órás idő (hh:mm:ss) a helyi idő ábrázolása (%H:%M:%S) időzóna (pl. EDT), vagy semmi, ha nem határozható meg időzóna
Dátummezők: %a %A %b %B %c %d %D %j %m %U %w %W
a helyi nap rövidített neve (Sun..Sat) a helyi nap teljes neve, változó hosszal (Sunday..Saturday) a helyi hónap rövidített neve (Jan..Dec) a helyi hónap teljes neve, változó hosszal (January..December) a helyi dátum és idő (Sat Nov 04 12:02:33 EST 1989) a hónap napja (01..31) dátum (mm/dd/yy) az év napja (001..366) hónap (01..12) a hét sorszáma az évben úgy, hogy vasárnap a hét első napja (00..53) a hét napja (0..6) úgy, hogy 0 vasárnapnak felel meg a hét sorszáma az évben úgy, hogy hétfő a hét első napja (00..53)
3
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás %x %y %Y
a helyi dátum ábrázolása (mm/dd/yy) az év utolsó két számjegye (00..99) év (1970...)
további kapcsolók, részletek, lásd man date vagy info date. Ha időbélyeggel dolgozunk, és ki kell írnunk a legalkalmasabb formátum az ISO-8601 standard által definiált, ennek két alakja (a második könnyebben olvasható): $ date "+%Y-%m-%dT%H:%M:%S%z" 2007-12-02T22:50:23+0200 $ date "+%Y-%m-%d %H:%M:%S %Z" 2007-12-02 22:50:36 EET $
A GNU date egy olyan kapcsolóval is rendelkezik amelyik konverziót enged meg, a -d vagy –date kapcsoló. Ilyenkor a date nem a pillanatnyi időt írja ki, hanem a -d kapcsoló argumentumaként megadott időt. Ezt vagy standard ISO-8601 jelöléssel adjuk meg, (pl.: -d '2007-11-02' ) vagy egy relatív időpillanatokat leíró nyelvvel (ez nem standard, a GNU által kidolgozott. A date parancs kézikönyveiben rosszul dokumentált, de érdekességként megtalálható itt: http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120. Néhány példa: $ date "+%Y-%m-%d %H:%M" 2007-12-02 22:39 $ date -d tomorrow "+%Y-%m-%d %H:%M" 2007-12-03 22:40 $ date -d '-1 year' "+%Y-%m-%d %H:%M" 2006-12-02 22:40 $ date -d 'next week friday' "+%Y-%m-%d %H:%M" 2007-12-14 00:00 $ date -d '-1 week friday' "+%Y-%m-%d %H:%M" 2007-11-30 00:00 $ date -d '-5 week friday' "+%Y-%m-%d %H:%M" 2007-11-02 00:00 $ date -d 'this friday' "+%Y-%m-%d %H:%M" 2007-12-07 00:00 $ date -d 'last friday' "+%Y-%m-%d %H:%M" 2007-11-30 00:00 $#vagy egyszerű konverzióhoz használjuk az ISO-8601 formátumot $ date -d '2007-12-01 11:52pm' "+%s" 1196545920 $
A time parancs Mire megy el az idő egy program futtatása alatt? 1. Az az idő, amit a a programok az ún. "felhasználó neve alatt futó" állapotban töltenek (user state). Ebbe beletartozik a program minden utasítása + a felhasznált könyvtárak utasításai, kivéve a kernel függvényeit (User-state CPU time) . 2. Az az idő, amit a program rendszer (system state) állapotban tölt: a rendszerhívások ideje és a kernel által a program adminisztrálására fordított idő (System-state CPU time) . 4
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
pl. egy strcpy hívás a felhasználó idejét terheli, egy printf vagy fork hívás a kernelét. 3. A Be/Ki idő: mennyi időt tölt az operációs rendszer Be/Ki alrendszere a program kiszolgálásával (pl. várakozás hard diszk időkre)(I/O time). 4. Hálózati idő. Mennyi idő telik el hálózati kérések kiszolgálásával (Network time) . 5. Más programok futtatásával töltött idő . 6. Mennyi idő telik el virtuális memória kezeléssel (Virtual memory performance) . A legegyszerűbb módja egy program által eltöltött idő vizsgálatára a time parancs: time opciók parancs
% time sort nagyfile.txt > rendezett.txt real user sys
0m0.610s 0m0.556s 0m0.016s
Implicit módban a time a valós időt (amennyit én érzékeltem), a felhasználói módban és a rendszermódban használt időt írja ki.
A sleep parancs Gyakran használjuk a héjprogramozásban várakozásokra. sleep szám[smhd] s m h d
másodperc perc óra nap
$ sleep 2d $ $ sleep 0.1s
Az argumentuma más programoktól eltérően tizedes szám is lehet, tehát sleep 0.01 lehetséges: $ time sleep 0.01 real user sys $
0m0.012s 0m0.000s 0m0.001s
5
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
Időzített programfuttatás Az at parancs at időpont < szkript at időpont -f szkript batch idopont < szkript batch idopont -f szkript
Az időpont formái: HH:MM, now, midnight, noon, teatime , HH:MMpm; dátumot is megadva: HHNNÉÉ . A programok kimenetét illetve a hibakimenetet levélben, a MAIL környezeti változóban megadott címre (lásd alább a cron parancsnál) küldi el. $ at 12:25 -f test.sh job 12 at 2007-12-09 12:25 $ at 10am 121306 -f test.sh job 13 at 2006-12-13 10:00
Segédparancsok: atq : a végrehajtandó at sor (at queue) feladatait listázza atrm : feladatot töröl a sorból A batch-el indított parancsok akkor indulnak amikor a rendszer terheltsége megengedi. A terheltség vizsgálatára az uptime parancs áll rendelkezésünkre. Az uptime az alábbi információkat írja ki:. A pillanatnyi idő, mennyi ideje fut a rendszer, hány felhasználó van pillanatnyilag belépve, és rendszer átlagos terheltsége (load) az elmúlt 1, 5, és 15 percre. $ uptime 12:36:16 up 30 min,
2 users,
load average: 0.07, 0.02, 0.00
A parancsok kimenetét a rendszer e-mailen juttatja el a felhasználóhoz. Az at használatát a /etc/at.allow vagy /etc/at.deny állományokkal lehet engedélyezni vagy tiltani.
A UNIX démonok A UNIX alatt azokat a programokat, amelyek folyamatosan aktívak, nem felhasználóhoz és terminálhoz kötöttek démonoknak nevezzük. Ezeket a rendszer indulásakor általában az init vagy más rendszerindító folyamatok által lesznek indítva, és különböző rendszerszintű szolgáltatásokat látnak el. A háttérben futnak, nincsenek felhasználóhoz és terminálhoz kötve: kimenetük rendszerint egy napló állományba kerül. A UNIX/Linux rendszerek alatt ilyenek az inetd, sendmail, crond.
6
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
A cron démon A rendszerszintű feladatindításokat a cron nevű démon végzi (crond). A konfigurációs állományai az /etc könyvtárban vannak (cron.deny , cron.weekly/ , cron.daily/ , cron.hourly/ , crontab ) .
cron.monthly/,
Az egyes felhasználók rendszeresen futtatott időzített feladataikat egy szöveges állományba írhatják, amennyiben erre engedélyük van (cron.allow és cron.deny állomámyok a /etc könyvtárban). Az állományt a crontab nevű parancs segítségével szerkeszthetjük. A crontab használata: crontab -l : kilistázza a feladatokat crontab -e : behívja a szövegszerkesztőt a feladat szerkesztésre crontab -r : törli az adott crontab állományt
Pl. crontab állományra: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=petike HOME=/ 00 02 * * * /home/petike/bin/napi_backup.sh 00 03 * * 5 /home/petike/bin/heti_backup.sh
A crontab sorok formátuma: perc óra nap hónap hét_napja
parancs
Tehát az öt mező tartalma: 1. 2. 3. 4. 5.
perc (0-59), (0-23), hónap napja (1-31), melyik hónap (1-12), a hét melyik napján fut (0-6 0=Vasárnap).
A mezőkben a * jelenti a "minden kiválasztva" értéket, tehát az első mezőben a * jelentése: minden percben lefut. Kimenetét ugyancsak e-mailben küldi el a rendszer az állományban megadott környezeti változó szerinti email címre.
7