Jednoduchý skript na hlídání volného místa na disku

Rubrika: Počítače

Cíl: máte počítač, říkejme mu server (bez ohledu na to, jaká serverová služba na něm běží) a Vy chcete, aby se nestalo to, že na disku tohoto serveru dojde místo a Vy o tom nebudete vědět. Samozřejmě jedná se o server, na který se denně nepřihlašujete, tak by bylo dobré, aby Vám server dal nějak vědět. Jednoduše, až se posune pod kritickou mez, tak aby Vám poslal mail, že místo dochází a že s tím máte něco dělat (třeba smazat příliš podrobné logy, nebo já nevím).

Výchozí stav: na Vašem serveru je (tj. ten počítač, který chceme hlídat) je operační systém Windows (třeba Windows Server 2003, ale de-facto je to téměř jedno, která verze). Teda můžete mít i server s Linuxem, pak bude pro Vás situace ještě jednodušší a určitě budete schopni si z níže uvedeného postupu vytáhnout pouze tu podmnožinu, která Vám potřebnou funkcionalitu zajistí. Tento článek ovšem předpokládá Windows server. Dále potřebujete poštovní server se SMTP rozhraním a mám na mysli jakoukoliv možnou variantu SMTP serveru: může běžet přímo na výše uvedeném počítači, který chceme hlídat, může to být úplně jiný server ve firmě nebo můžete použít i veřejný, jako např. seznam.cz.

Řešení: jak už to tak bývá, řešit takovou úlohu je možné různými způsoby a já jsem samozřejmě zvolil jen jeden z nich. Za nejjednodušší jsem považoval poskládat řešení z pár příkazů, které mají svůj původ na Unixu, ale ve Windows je nenaleznete. To ovšem vůbec nevadí, protože existuje balíček Cygwin, který právě unixové příkazy do Windows nainstaluje a vy je pak můžete používat stejně účinně, jako linuxáři.

Instalace Cygwin

Takže si stáhněte instalační program pro Cygwin a spusťte. Instalační program je maličký, neobsahuje v sobě všechny ty soubory, které se chystáme na počítač nainstalovat — ty si bude stahovat z internetu až během samotné instalace, a pouze ty, které si vybereme, žádné jiné. Takže si v instalaci zvolte zdrojový server na internetu, z kterého se bude dál stahovat, nejspíše některý český, protože z něj budete sosat nejrychleji.

Instalace Cygwinu má samozřejmě jakési výchozí nastavení, které balíčky stáhnout a které raději nestahovat. A jak už možná tušíte, toto výchozí nastavení nestačí. Výchozí instalace totiž neobsahuje příkazy pro odeslání mailu. Takže když budete během instalace stát před volbou, které balíčky nainstalovat, najděte kategorii Mail a z ní přidejte ještě balíček ssmtp. (klikněte u této položky na sloupec, ve kterém je napsáno Skip, tak aby se tam objevila verze, která bude instalována). Mimo tuto změnu můžete všude nechat výchozí nastavení a naklikat Next → Next → Finish a spokojeně pozorovat, jak setup balíčky stahuje a instaluje na Váš server.

Instalace Cygwin - výběr ssmtp
Instalace Cygwin - výběr ssmtp

Takže Cygwin máme nainstalovaný a já budu pro předpokládat, že jste ho nainstalovali na výchozí cestu, tedy do C:\cygwin. Pokud jste ho nainstalovali jinam, pak jste určitě dostatečně zkušení na to, abyste tento návod adaptovali na Vámi zvolené umístění.

Unixové soubory

V následujícím textu budeme editovat několik textových souborů. Protože námi nainstalovaný balíček cygwin pochází z Unixu, očekávají jeho programy, že textové soubory jsou v unixovém formátu — ten se od Windows liší tím, že zatímco v systému od Microsoftu je nový řádek označen dvěma znaky 0x0D 0x0A, tak v Unixu je pouze 0x0A. To v důsledku znamená, že nemůžete použít k editací těchto souborů Notepad nebo některý jiný obyčejný textový editor ve Windows, ale musíte najít takový, který Vám umožní uložit soubor v unixovém formátu. Řekněme si dvě možnosti, ať máte na výběr:

Osobně preferuji program UltraEdit. Jedná se o placený program, můžete si jej ale po 45 dnů zkoušet zdarma, takže pro náš úkol Vám bude plně stačit i demoverze. Jedná se o editor, který je velice schopný a podle mě jeho cena je velmi přijatelná na to, co za ty peníze dostanete. Když v UltraEditu máte otevřený textový soubor, pak ve stavové řádce vidíte formát, ve kterém soubor je (typicky je tam napsáno DOS), z menu pak vyberete File → Conversions → DOS to UNIX a to je vše — můžete si všimnout, že ve stavovém řádku se informace změnila. Soubor se pak již bude ukládat tak, jak chceme.

Pokud ale nechcete utrácet žádné peníze a nemáte pro UltraEdit využití, můžete zkusit český PSPad. Neumí sice toho tolik, ale to co potřebujeme tentokrát zvládne, a navíc je zdarma a v češtině. V tomto programu se stejně jako v UltraEditu zobrazuje formát souboru ve stavové řádce, změna je pak intuitivnější než v placené konkurenci, prostě na dotyčnou informaci na stavovém řádku klikněte a nápis DOS se přepne právě na UNIX.

Soubor v UNIXovém formátu v editoru UltraEdit
Soubor v UNIXovém formátu v editoru UltraEdit

Tedy, pokud budeme dále v textu editovat (vytvářet) jakýkoliv textový soubor, dbejte na to, aby byl v Unixovém formátu.

Nastavení ssmtp mailového programu

Máme tedy nainstalovaný Cygwin i s balíčkem ssmtp, ten je ale zapotřebí vykonfigurovat — aby věděl, kde na něj čeká poštovní server, přes který budeme odesílat maily. Takže v textovém editoru vytvořte konfigurační soubor, který bude obsahovat:

root=postmaster
mailhub=10.0.0.10
hostname=můjserver.honza.info

První řádek s parametrem root je povinný, ale pro naše účely není důležitý. Na skutečném Unixu (Linuxu) by se jednalo o účet, na který se zasílají systémové maily, což nebudeme potřebovat.

Parametr mailhub už je velice důležitý a je to IP adresa našeho poštovního serveru, který musí podporovat SMTP službu. Na tento server budou odesílány maily. Takže nastavte skutečnou IP adresu Vašeho poštovního serveru.

Třetí parametr hostname by pak měl být názvem našeho počítače, z kterého se maily posílají.

Pokud SMTP server, který chcete použít, vyžaduje autentifikaci pomocí účtu a hesla, pak ještě přidejte další řádky do tohoto souboru:

AuthUser=username
AuthPass=password

Zkontrolujte, že máte náš konfigurační soubor ve formátu pro Unix a uložte do C:\cygwin\etc\ssmtp\ssmtp.conf

Více o konfiguračním souboru pro ssmtp zde.

Dále vytvoříme testovací mail, který si zkusíme poslat. Takže v textovém souboru vytvořte další soubor, do kterého vložte:

To: můjmail@honza.info
From: můjserver@honza.info
Subject: Zkouska mailu

Toto je testovaci mail, jestli funguje ssmtp

Samozřejmě nastavte správné e-mailové adresy na řádcích To a From. Soubor uložte na disk do C:\cygwin\test.mail

Nyní spusťte bash shell, měli byste mít ikonku z instalace Cygwinu na ploše. V shellu pak skočte do adresáře, kde jsme umístili náš testovací mail a zkuste jej odeslat (samozřejmě na svou emailovou adresu):

cd /cygdrive/c/cygwin
/usr/sbin/ssmtp můjmail@honza.info < test.mail

ssmtp testovací mail

Tak, nyní záleží na tom, jestli Váš poštovní server bude mail ještě předávat někam dál, ale prostě za chvilku byste měli mít ve schránce mail potvrzující, že ssmtp funguje, jak má.

Vytvoření skriptu pro bash

V této kapitolce vytvoříme náš hlavní skript, ale ještě předtím si vytvoříme ten mail, který nám náš skript v kritické chvíli pošle. Takže šup do textového editoru a vytvoříme soubor podobný našemu testovacímu mailu:

To: můjmail@honza.info
From: můjserver@honza.info
Importance: High
X-Priority: 1 (High)
Subject: Dochází místo na serveru, disk D má k dispozici %D

Dochází místo na serveru, disk D má k dispozici %D

Takže si opět nastavte na řádcích To a From skutečné mailové adresy. Další dva řádky v souboru nastavují důležitost našeho mailu a pokud máme jen trošku rozumný mailový program, pak náš mail bude uvozen červeným vykřičníkem a my bychom jej neměli jednoduše přehlídnout mezi záplavou ostatní nedůležité komunikace. Řádek s parametrem Subject je předmětem mailu a můžete si jej poeditovat, jak chcete. A pod ním se již nachází tělo naší zprávy a i zde můžete zapojit svou fantazii. Jak v předmětu, tak v těle mailu jsem použil parametr %D, který náš následující skript nahradí skutečnou hodnotou, kolik místa na serveru zbývá, takže doporučuji jej nemazat a případně jej mít někde dostatečně vepředu v mailu, pokud si přeposíláte maily na mobil jako SMS, abyste ten údaj viděli i tam.

Hotový soubor v UNIXovém formátu uložte do C:\cygwin\df-check.mail

Nyní vytvoříme náš hlavní skript, který zkontroluje místo a pokud ho bude málo, pak pošle mail. Takže v textovém editoru opět vytvořte nový soubor, do kterého vložte:

test $(/bin/df | /bin/grep '/cygdrive/d' | /bin/awk '{ print $4 }') -le 1000000 && sed "s/%D/$(/bin/df -h | /bin/grep '/cygdrive/d' | /bin/awk 'BEGIN { ORS="" } { print $4 }')/" < /cygdrive/c/cygwin/df-check.mail | /usr/sbin/ssmtp můjmail@honza.info

Důležité: výše uvedený příkaz je velice dlouhý, abyste jej na této stránce viděli pohodlně celý, je zalomen do více řádků. Ve skutečnosti je nezbytně nutné, aby v textovém editoru byl celý na jednom jediném řádku. Mějte toto na paměti!

V příkazu je samozřejmě několik míst, která si budete chtít upravit dle sebe. Jedná se o tato:

  1. úplně na konci příkazu je opět e-mailová adresa, na kterou se bude mail posílat. Nastavte skutečnou.
  2. výše uvedený příkaz testuje dostupné místo na disku D: — pokud chcete testovat místo na jiném disku, nahraďte v příkazu /cygdrive/d za takový disk, jaký chcete testovat, např. /cygdrive/c bude testovat disk C: Pozor! tento parametr je v příkazu uveden dvakrát, potřebujete ho nahradit na obou místech.
  3. Výše uvedený příkaz začne posílat maily, pokud dostupné místo klesne pod 1GB. To zajišťuje číslo 1000000 v příkazu, jedná se o počet dostupných jedno-kilobajtových bloků na disku. Upravte číslo dle vlastních představ, kdy má skript začít varovat.

Takže upravte soubor podle výše uvedených bodů, zkontrolujte, že je v UNIXovém formátu a uložte do C:\cygwin\df-check.sh

Asi by bylo dobré skript vyzkoušet, jestli funguje. Pokud máte nyní na disku více místa, než je ta mez, kterou chcete hlídat, kontrola by vyhodnotila vše v pořádku a mail by nedošel. Proto buď dočasně zvyšte uvedené číslo, případně můžete změnit parametr -le (argument less or equal, tedy menší nebo rovno) za -ge (greater or equal, větší nebo rovno). Pokud Vám zůstal bash spuštěný od okamžiku, kdy jsme posílali testovací mail, tak do něj skočte, jinak jej znova pusťte. Zadejte v něm pak spuštění našeho příkazu:

/cygdrive/c/cygwin/df-check.sh

Měl by Vám dorazit mail s varováním, ve kterém uvidíte, kolik místa na disku ještě zbývá. Vraťte nyní zpátky příkaz tak, aby skutečně hlídal Vámi zvolenou mez.

Naplánování pravidelného spouštění

Nyní máme vytvořený hlídací skript, ale ještě je nutné zajistit jeho pravidelné spouštění. Protože se jedná o Unixový skript, ale náš systém je Windows, nemůžeme jej spouštět přímo a namísto cronu musíme použít plánování úloh.

Takže spouštění zajistíme dávkovým souborem BAT. Otevřete si v průzkumníkovi adresář C:\Cygwin a v něm najdete soubor Cygwin.bat. To je soubor, který spouští náš bash shell, který jsme využívali výše. Vytvořte si kopii tohoto souboru a přejmenujte ji na df-check.bat. Otevřete v textovém editoru a upravte, aby obsahovala:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i -e "/cygdrive/c/cygwin/df-check.sh"

Jak vidíte, pouze jsme přidali ke spuštění příkazu bash parametr, který zajistí vykonání našeho skriptu. Tento soubor samozřejmě nepřevádějte do UNIXového formátu, je to dávkový soubor pro Windows, takže jej pěkně ponechejte ve formátu DOS.

Nakonec je zapotřebí tento dávkový soubor naplánovat, aby se pravidelně spouštěl. Takže v Ovládacích panelech přejděte do naplánovaných úloh, zde vytvořte nový záznam, jako spouštěný soubor vyberte námi vytvořenou dávku df-check.bat a zadejte si, jak často ji chcete spustit (předpokládám jednou za den, ale třeba to bude jinak). Uložte a hotovo.

Naplánování df-check

Závěr

Vytvořili jsme jednoduchý skript, který nám bude hlídat dostupné místo na disku a pokud by mělo dojít, bude nás včas varovat. Takovou úlohu lze samozřejmě řešit i jinak, než jsme to udělali my. Určitě by bylo možné napsat podobný skriptík ve Windows Power Shellu. Pochopitelně ještě rozumnější je nasazení nějakého silnějšího softwaru pro monitorování serveru, který Vám kromě místa na disku může hlídat spoustu dalších parametrů, třeba obsazení paměti, vytížení procesoru, propustnost sítě, stav řadiče diskového pole atd. A takový software Vás ani nemusí stát žádné peníze, pokud si třeba koupíte naprosto libovolný (i ten nejlevnější) server od IBM, pak automaticky získáte program IBM Director, který takové věci umí a licence Vám ho umožní nasadit až na 50 serverech ve Vaší firmě, i když ostatní servery nejsou od IBM. Ale jedná se o software relativně komplikovaný, který budete dlouho konfigurovat, aby byl dle Vašich představ. Pokud Vám jde jen a pouze o jediné a to je hlídání dostupného místa na jednom disku, pak pro Vás může být rychlejší a jednodušší řešení, které je popsáno Výše. Tak přeji šťastné používání a aby to místo na disku nikdy nedošlo!