Ali je strežnik še živ?
Ena izmed manj prijetnih lastnosti službe sistemskega upravitelja je gotovo odgovornost za nenehno delovanje strežnikov v podjetju. Strežniki, še posebej poštni in spletni, morajo delovati nepretrgoma, 24 ur na dan vseh sedem dni v tednu. Če ne delujejo, se na upravitelja vsuje plaz pritožb. Zato je gotovo v njegovem interesu, da je redno in hitro obveščen o vseh težavah, ki bi lahko povzročile izpad delovanja. Še posebej pa je v njegovem interesu to, da se vsaj manj zahtevne izmed težav, ki se občasno pojavljajo, rešijo same od sebe, avtomatsko. Poglejmo nekaj načinov za diagnosticiranje morebitnih težav, nato pa še njihovo odpravljanje.
Preverjanje
Poštni strežnik je zagotovo storitev, ki mora delovati nepretrgoma. Pa vendar lahko odpove tako strojna kot programska oprema. Slednje danes sploh ni več tako nenavadno, saj se v strežnik zgrinjajo gore nezaželene pošte in virusov, osnovni strežnik SMTP pa mora sodelovati z moduli za protivirusno delovanje, za čiščenje nezaželene pošte, ne nazadnje pa mora še zavračati pošto iz strežnikov, ki so na kateri izmed črnih list. Kako redno preverjati, ali poštni strežnik še deluje? Enostavno - redno (vsakih nekaj minut) mu pošiljamo pošto. Najbolje na neki naslov, ki ga potem avtomatsko brišemo. Uporabimo torej katerega izmed zastonjskih programčkov, ki omogočajo pošiljanje elektronske pošte iz ukazne vrstice. Priporočamo GBMailer (v Googlu ga boste brez težav našli), ki omogoča pošiljanje pošte v poljuben strežnik SMTP in ob neuspehu vrne kodo Errorlevel, ki jo lahko v datoteki BAT prestrežemo.
Za spletni strežnik velja enako - delovati mora nepretrgoma. Kako preverimo, ali še deluje? Tako, da po njem nenehno brskamo, seveda. Redno klikati po gumbu za osvežitev v našem brskalniku ni ravno praktično, zato bo bolje uporabiti enega izmed programov, ki iz ukazne vrstice preberejo določeno spletno stran (iz našega spletnega strežnika) in spet s spremenljivko Errorlevel sporočijo, če jim ni uspelo. Uporabimo lahko kar httpcmd.exe, ki je del Windows 2000 Resource Kit, ali pa poprosimo kolega programerja, da nam napiše kaj podobnega (tako smo storili tudi mi). Ostane le še izbira strani HTML, ki naj jo tako redno (vsakih nekaj minut) beremo. Ker ne želimo, da bi se tako branje poznalo na analizi spletnih dostopov, bo najbolje, da beremo datoteko, ki je v spletnih strežnikih bolj ali manj vedno na voljo, hkrati pa je uradno določena za ignoriranje med analizo dostopov. To bo kar robots.txt, datoteka, v katero se sicer vpisujejo imeniki, ki naj jih iskalniki (Google, Yahoo...) ne preiskujejo.
Še najenostavneje bo preverjati dostopnost oz. "živost" datotečnega strežnika. Enostavno bomo uporabili ukaz copy in poskušali prepisati neko datoteko iz njega (ali vanj). Če ukazu ne bo uspelo, bo vrnil rezultat v obliki spremenljivke Errorlevel.
Obveščanje
Eden izmed zgornjih treh načinov odkrivanja napak v delovanju je torej ugotovil, da strežnik ne deluje, in postavil Errorlevel na 1. Kaj zdaj?
Poizkus reševanja tega stanja bomo prepustili avtomatiki, kljub temu pa ne bo slabo, če najprej izpeljemo obveščanje upravitelja, se pravi sebe. Lahko si pošljemo elektronsko pošto (uporabimo zgoraj omenjeni program gbmail), vendar bo to opozorilo neuporabno, če ne bomo ravno sedeli za računalnikom. Boljša rešitev je pošiljanje sporočila SMS mobilnemu telefonu. V "starih časih" bi za kaj takega uporabili elektronsko sporočilo, ki bi ga poslali strežniku linux.mobitel.si (in upali, da bo dostavljen vsaj relativno hitro) ali pa raje strežniku gsm.mobitel.si (kar bi zagotovilo trenutno obveščanje). Žal slednji že nekaj časa ne deluje več, saj je Mobitel to (sicer plačljivo) storitev opustil. Iz istega razloga, kot so bile opuščene skoraj vse spletne strani za pošiljanje SMSov - ker so bile zlorabljene za pošiljanje nezaželene pošte oz. SMSov. Kaj lahko torej uporabimo danes? Lahko si kupimo poseben industrijski "telefon GSM", ki ga na računalnik priključimo prek zaporednih vrat in SMSe pošiljamo prek njega, oz. uporabimo kar svoj telefon, priklopljen prek infrardeče ali bluetooth povezave. O ne, žrtvovati svoj telefon samo zaradi občasnega pošiljanja SMSov, to za (manj premožne) upravitelje gotovo ne pride v poštev. K sreči je še vedno na voljo brezplačna rešitev - uporaba poštnega naslova, ki omogoča SMS obveščanje o prispeli pošti. Za naročnike Mobitela bo to kar pinkponk.com. Torej, na omenjeni strani si (zastonj) uredite svoj spletni naslov (npr. janez.novak@pinkponk.com) in v nastavitvah odkljukajte, da bi bili radi o novi pošti obveščeni prek SMS. Kadarkoli bo na ta naslov prišla elektronska pošta (ki jo bo poslal vaš diagnostični program!), bo na telefon priletela njena naslovna vrstica. In če boste kot to uporabili nekaj takega kot "Spletni strežnik se ne odziva!", ste svoje potrebe po obveščanju rešili. Če nekaj podobnega uporabite tudi na koncu skripte, ko bo avtomatika težave že rešila, si boste prihranili še nekaj dodatnih živcev - pošljete si SMS z naslovno vrstico "Vse je spet v najlepšem redu!".
Če si poganjanje objavljenega (ali podobnega) skripta nastavimo na pet minut, smo lahko prepričani, da bomo o vsaki težavi res pravočasno obveščeni.
Vi ste torej obveščeni, kaj pa uporabniki? Če je obveščanje del skripte, ki bo prej ali slej znova zagnala strežnik (in s tem odrezala tudi uporabnike, ki najprej "umrle" storitve sploh niso pogrešali), bo morda smiselno obvestiti tudi njih. Elektronska pošta ne pride v poštev, saj je običajni uporabniki pač ne berejo vsako sekundo (za razliko od nekaterih upraviteljev ;)). Uporabimo torej neposredno obveščanje prek ukaza NET SEND. V skripto vpišemo nekaj takega kot:
net send /domain:domena "Dragi uporabniki, strežnik se bo pravkar znova zagnal, zato, prosim, brez panike."
In si operemo roke.
Ukrepanje
Kaj pomeni "ukrepanje", je zelo odvisno od tega, ali je odpovedal ves strežnik (tu brez dodatne in/ali prilagojene strojne opreme ni pomoči) ali morda le katera izmed njegovih storitev (spletno streženje, poštni strežnik...). Verjetno pa bomo najprej poizkusili z legalnim ustavljanjem in vnovičnim zagonom "umrle" storitve. Zapisali bomo torej nekaj takega kot (za primer Microsoft Exchange):
net stop "Microsoft Exchange Information Store"
net stop "Microsoft Exchange Event"
net stop "Microsoft Exchange MTA Stacks"
net stop "Microsoft Exchange Routing Engine"
net stop "Microsoft Exchange IMAP4"
net stop "Microsoft Exchange Management"
net stop "Microsoft Exchange POP3"
net stop "Microsoft Exchange Site Replication Service"
net stop "Microsoft Exchange System Attendant
net stop "Microsoft Exchange Search"
Če se bodo ti ukazi lepo končali, lahko vse skupaj še znova zaženemo:
net start "Microsoft Exchange Information Store"
net start "Microsoft Exchange Event"
net start "Microsoft Exchange MTA Stacks"
net start "Microsoft Exchange Routing Engine"
net start "Microsoft Exchange IMAP4"
net start "Microsoft Exchange Management"
net start "Microsoft Exchange POP3"
net start "Microsoft Exchange Site Replication Service"
net start "Microsoft Exchange System Attendant
net start "Microsoft Exchange Search"
in upamo, da smo s tem stvar rešili. No, kar velika verjetnost je, da je nismo, saj je storitev odpovedala v taki meri, da se tudi na legalno zahtevo po ustavitvi ne odziva (ukaz net stop sporoči napako oz. timeout).
Uporabiti bo torej treba močnejše orodje; program, ki programa oz. storitve ne poprosi, ali bi se, lepo prosim, sama ustavila, temveč jo enostavno - ubije. V Oknih v osnovi ni priloženega takega programa (za razliko od vseh vrst Unixa), vendar so ga dobri ljudje že davno napisali. Priporočamo odličen program PSKill avtorja Marka Russinovicha, ki ga dobimo na strani www.sysinternals.com. Je majhen in zanesljivo pobije vse, kar se da pobiti, in to tudi v oddaljenem računalniku, kar potrebujemo v našem primeru.
No, včasih je tudi tako orožje preslabotno (nam se je to v praksi zgodilo le enkrat) in storitve tudi PSKill ne more pobiti. V tem primeru pomaga le vnovični zagon strežnika. Potrebujemo torej program, ki bo zagnal strežnik, in sicer na daljavo. Takih programov je kar nekaj, priporočamo brezplačni reboot.exe, ki ga najdete na www.bbdsoft.com/utils.html. Med drugim omogoča tudi vnovični zagon z zamikom (če hočemo našim uporabnikom dati nekaj časa, da se pripravijo na šok).
Ena izmed možnih rešitev
Vse osnovne gradnike, ki jih potrebujemo za nadzor in reševanje strežnikov, smo zapisali, čas je torej za zgled celotne rešitve. Spodnji program preverja delovanje spletnega in poštnega strežnika in dogajanje zapisuje v dve ločeni datoteki LOG. Upravitelja obvešča prek elektronske pošte in SMS, po odpravi napake pa pošlje še eno, odrešilno sporočilo. Če ne deluje spletni strežnik, ne naredi nič (razen obveščanja), če odpove poštni strežnik, pa računalnik poskuša vnovič zagnati, pred tem pa ustrezno obvesti uporabnike.
Zaradi boljše sintakse stavka IFF/THEN/ELSE je uporabljen dialekt ukaznega jezika, ki ga razume program 4NT, naslednik nekdaj legendarnega 4DOS, in ga je moč dobiti na www.jpsoft.com. To pomeni, da je treba v okenski "scheduler" (do njega najlaže pridemo z ukazom AT) dejansko vpisati posredno datoteko bat, ki vsebuje nekaj takega kot
4NT.EXE /c preveri.bat
(4NT.EXE mora seveda biti v istem imeniku kot vsi zgoraj opisani programi s ključno datoteko - skripto PREVERI.BAT)
Pred vnovičnim zagonom strežnika lahko damo uporabnikom še nekaj časa, da pospravijo za seboj.
Še nekaj opomb
Vsebina preveri.bat:
set mail_podjetje_si_crashed=0
set www_podjetje_si_crashed=0
rem *****www.podjetje.si********
httpget http://www.podjetje.si/robots.txt
iff "%errorlevel" != "0" then &
set www_podjetje_si_crashed=1
else &
iff exist www_podjetje_si_crashed.flag then &
del www_podjetje_si_crashed.flag
gbmail.exe -file www.podjetje.si.OK.txt -h mail.siol.net -from watchdog@podjetje.si -to janez.novak@pinkponk.com -s "www.podjetje.si spet OK"
gbmail.exe -file www.podjetje.si.OK.txt -h mail.podjetje.si -from watchdog@podjetje.si -to janez.novak@podjetje.si -s "www.podjetje.si spet OK"
& endiff
& endiff
rem *****mail.podjetje.si********
gbmail.exe -file testni_mejl.txt -h mail.podjetje.si -from watchdog@podjetje.si -to administrator@podjetje.si -s "Preverjamo zivost mail.podjetje.si."
iff "%errorlevel" != "0" then &
set mail_podjetje_si_crashed=1
else &
iff exist mail_podjetje_si_crashed.flag then &
del mail_podjetje_si_crashed.flag
gbmail.exe -file mail.podjetje.si.OK.txt -h mail.siol.net -from watchdog@podjetje.si -to janez.novak@pinkponk.com -s "MAIL.podjetje.si spet OK"
gbmail.exe -file mail.podjetje.si.OK.txt -h mail.siol.net -from watchdog@podjetje.si -to janez.novak@siol.net -s "MAIL.podjetje.si spet OK"
& endiff
& endiff
rem **********************************************************************************
Iff "%www_podjetje_si_crashed" == "1" .and. not exist www_podjetje_si_crashed.flag then &
gbmail.exe -file www.podjetje.si.txt -h mail.siol.net -from watchdog@podjetje.si -to janez.novak@pinkponk.com -s "Crknil www.podjetje.si"
gbmail.exe -file www.podjetje.si.txt -h mail.podjetje.si -from watchdog@podjetje.si -to janez.novak@podjetje.si -s "Crknil www.podjetje.si"
echo www.podjetje.si " crash.log
date /t " crash.log
time /t " crash.log
echo ---------------------------- " crash.log
echo sent! > www_podjetje_si_crashed.flag
& endiff
Iff "%mail_podjetje_si_crashed" == "1" .and. not exist mail_podjetje_si_crashed.flag then &
gbmail.exe -file mail.podjetje.si.txt -h mail.siol.net -from watchdog@podjetje.si -to janez.novak@pinkponk.com -s "Crknil MAIL.podjetje.si"
gbmail.exe -file mail.podjetje.si.txt -h mail.siol.net -from watchdog@podjetje.si -to janez.novak@siol.net -s "Crknil MAIL.podjetje.si"
net send /domain:domena "Streznik STREZNIK (e-mail, racunovodstvo, datoteke) se bo cez 10 minut ponovno zagnal. Prosim da zaprete vse programe."
rebootaj.exe \\streznik /timeout:600 "/MSG:Streznik (e-pošta, racunovodstvo, datoteke) se bo cez 10 minut ponovno zagnal. Prosim da zaprete vse programe."
echo mail.podjetje.si " crash.log
date /t " crash.log
time /t " crash.log
echo ---------------------------- " crash.log
echo sent! > mail_podjetje_si_crashed.flag
& endiff
date /t " scheduler.log
time /t " scheduler.log
echo ---------------------------- " scheduler.log