Adatmentő script – példa

Linux scriptek
Linux scriptek

Megírunk egy nagyon egyszerű szkriptet, ami nem tesz mást csak lementi az elmúlt órában módosított doksikat. Ez önmagában nem egy nagy cél, hiszen számos adatmentő eszköz létezik.
A célom inkább ennél kissé érdekesebb: hogyan lehet egyszerűen egy szkriptet összerakni, ha semmi komolyabb programozói ismereted nincs. 
Adatmentés. Mindenki ismeri, de sokan nem szeretnek ezzel foglalkozni. Én sem. Ezért próbálom automatizálni a dolgokat. Sok jó és hasznos programot lehet találni, de most egy saját megoldást mutatok be.

A "hogyan rakjunk össze egy nagyon egyszerű szkriptet" cél mellett megismerkedünk a cron-nal is. Ha ezt az egyszerű módszert, lehetőséget ismerjük, akkor már időzíteni tudunk programokat. Bár a legendárium szerint a cron egy nagyon bonyolult eszköz, de a cikk végére kiderül, hogy nem is nehéz használni.

A cél nagyon egyszerű volt: az elmúlt egy órában módosított fájlokat rakja be egy mappába, aminek a neve az adott időpont legyen.

Ez nem a hagyományos megoldás, hiszen a cél a mentésen kívül még az idő szerinti rendezés. Ez nekem fontos, mert így bármilyen dokumentumom régebbi verziójára vissza tudok térni, még akkor is, ha azt teljesen átszerkesztettem. Természeten én is elfelejtem sokszor átnevezni a dokumentumokat, mielőtt átszerkesztek egy svg-t, vagy egy szöveget…

Egyszerű mentő szkript

A megoldás egy egyszerű szkript, amit mindenki a saját igényére formálhat. A feladathoz nem kell más mint a find, az mkdir, cd, date parancs. Meg a kedvenc szöveges szerkesztőd.

Nyiss meg üres szövegfájlt, aminek bármi nevet adhatsz. A legtöbb rendszeren a kedvenc fájlkezelődben (caja, thunar, dophin, PCManFM, SpaceFM) a jobb egérgomb lenyomása után van olyan, hogy új létrehozása. Ha más nem, akkor könyvtárat vagy egy szövegfájlt tudsz létrehozni.

Én a beszélő neveket szeretem: menth.sh

Majd tedd futtathatóvá. A legegyszerűbb: a kedvenc fájlkezelődben kattints a jobb egérgombbal rá, majd a tulajdonságoknál állíts be a futtathatóságot. De

chmod +x menth.sh

parancssorból is megteheted, javasolt begyakorolni. Sok esetben terminálban is dolgozunk, ilyenkor már macerásabb egy grafikus fájlkezelőt csak azért megnyitni, hogy egy jogosultságot átállíts. Az üres fájlt megnyitva már szerkesztheted is.

Az első sor kötelezően ilyen:

#!/bin/bash

Ez mondja meg, hogy a bash értelmezővel akarjuk feldolgoztatni, python stb. programoknál mást kell beírni, de most az a lényeg, hogy ezt így a #! kezdve írd be.

Az első lépésben létre kell hozni azt a könyvtárat, amibe majd a megfelelő fájlokat másolja a szkript. Ehhez nyilván az mkdir parancsot használjuk. Illetve egy változó értéket a date paranccsal, ami megmondja neki, hogy a könyvtár neve az év-hó-nap-óra legyen. A változókatmár használtuk a honlapfigyelő szkriptnél.

mkdir /home/laci/Dok/backup/$(date +%Y-%m-%d-%H)

Az mkdir egyértelmű, ez hozza létre a könyvtárat.

A /home/laci/Dok/backup/ pedig az az elérési útvonal, ahova létre kell hozni. Ahogy látni én taxatíve kiírom mindig a teljes elérési utat. Ha te a ~ jellel jobban szereted megadni a HOME könyvtárt, akkor használd azt, az elegánsabb és univerzálisabb. A legtöbb fájlkezelőben ki tudjuk másolni az elérési utakat, így használjuk ki ezt, és ne kézzel írjuk be.

$(date +%Y-%m-%d-%H)

A dollárjel (ALtGr é ) megmondja, hogy ez egy olyan érték, amit a date parancs fog elkészíteni, minden futáskor. Maga a paraméterezés egyszerű, év-hó-nap-óra formátumot ad.

Itt is érdemes a szokott módon előbb parancssorból lefuttatni a date +%Y-%m-%d-%H rész, majd az egészet, mert jobb ha most derül ki a hiba és nem később, amikor már teszteljük a szkriptet.

A date sokkal több formátumot ismer kimenetként, így a man date és a date -h olvasgatása ajánlott. Mint mindig: ha egy új parancsot látsz, vagy olyan paramétert, amit nem ismersz, akkor szánj rá fél percre a help-re. A Linux egyik nagy előnye az agyondokumentáltság, a legtöbb esetben igen részletes leírást is mellékelnek. Ami ott van a gépeden, csak használni kell(ene).

A következő lépésben megkeressük az új, egy óránál nem régebben módosult fájlokat. Ezt a find paranccsal lehet "egyszerűen" megtenni. Itt is igaz, hogy a find messze többet tud, mint amit itt használunk, így…

find /home/laci/Dok/Dokumentumok/ -mmin -61 -type f

A parancs és az elérési út egyértelmű. Az -mmin adja meg azt, hogy olyant keressen, aminek az adatai „n” percben módosultak. Természetesen több hasonló kapcsoló is van: -mtime, -amin, -atime, -cmin stb. Ha mostani elvárásnál pontosabb kell, akkor ezeket lehet nézegetni.

A -type f pedig azt írja elő, hogy csak fájlokat vizsgálja.

Így már megkapjuk azokat a fájlokat, amikkel foglalkozni kell. Miért 61 percet adtam meg, nem 60-at? Mert jó ha van egy kis átfedés, így nem lesz olyan hiba, hogy valami kimaradt a vizsgálatból. Már csak a kívánt műveletet kell elvégeztetni. Most közvetlenül adjuk át egymásután feldolgozásra a fájlokat, mert ezt is megoldhatjuk.

-exec cp {} /home/laci/Dok/backup/$(date +%Y-%m-%d-%H)/ \;

A find képes az -exec utáni parancsokat végrehajtani a talált fájlokon, így rögvest egy sorban megadjuk a cp-t, azaz a másolást. Itt a már megismert mód adjuk meg a célkönyvtárat: a date parancs segítségével. Nagyon figyeljünk rá, hogy itt pontosan, az mkdir-nél megadottal teljesen megegyező legyen a célkönyvtár! Ne írd be újra, inkább másold!

Ezután már csak copy/paste ha másik könyvtárat is menteni akarsz. Én a /home/laci/.bin/-ben tárolom a saját szkripteket (és egyebeket is, de erről később). Ezt is menteni akarom.

#!/bin/bash

mkdir /home/laci/Dok/backup/$(date +%Y-%m-%d-%H)

find /home/laci/.bin/ -mmin -61 -type f -exec cp {} /home/laci/Dok/backup/$(date +%Y-%m-%d-%H)/ \\;
find /home/laci/Dok/Dokumentumok/ -mmin -61 -type f -exec cp {} /home/laci/Dok/backup/$(date +%Y-%m-%d-%H)/ \\;

Ennyi az egész. Negyed óra kutatás a google, és a man oldalakon, és kész a saját igénynek megfelelő „program”. Ha keresgélés közben találsz olyan érdekesebb megoldást, amit későbbiekben használni szeretnél érdemes a codeMass-t használni.

Cron használata egyszerűen

Kipróbálás után már csak annyit kell elérni, hogy le is fusson automatikusan óránként. Elvileg a crontab-ba illene beírni az ilyen időzítéseket, de most én egy egyszerűbb megoldást mutatok. Ha órás, napos, hetes ciklusban kell valamit futtatni, akkor a

/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly

megfelelő könyvtárba érdemes bemásolni az adott szkriptet, és akkor a rendszered gondoskodik a megfelelő gyakorisággal való futtatásról. Ha valami miatt nem megy, akkor használ a crontab bejegyzéseket. Kezdetben sokkal egyszerűbb a másolás, mint a crontab szerkesztése, és ha csak ilyen egyszerű (fusson le óránként) a feladat, akkor ez is megfelel. A fenti könyvtárakba csak root joggal tudsz másolni, vagy az ottani fájlokat szerkeszteni. Használd a sudo parancsot!

Mindig lehet fejleszteni a szkriptet!

A fenti szkriptnek van egy hibája: akkor is létrehoz egy üres könyvtárat, ha abba nem kerül semmi a későbbiekben. Így nagyon sok üres könyvtár lesz, ha napi egy-két órát dolgozol és egész nap megy a gép. Engem nem zavar, így nem fejlesztettem tovább, de akit zavar egy sima rmdir-t használva a /home/laci/Dok/backup/ könyvtárban ezt is megoldhatja.

Hogyan tovább? Én havi ciklikusban tömörítem a mentési könyvtáramat. Ezzel helyet takarítok meg, és rendezettebb a mentés. De ez már más téma...

Ami fontos: ez nagyon egyszerű és egy célra készített kis szkript, ami csak arra való, hogy az elmúlt órában módosított fájlokat mentse le. Így ha módosítok egy fájlt, vissza tudok egy régebbi verzióhoz térni  - jó eséllyel. Nem helyettesíti a komolyabb mentési funkciókat, csak egy részfeladatot végez el, így nem váltja ki pld. a LuckyBacup használatát!

Amit ma megtanultunk:

  1. Tudunk szkriptet, mini programot írni
  2. Mindig olvassuk el a man-t és a -help-et
  3. Periodikusan tudunk futtatni egy szkriptet. És ez nem ördöngösség, nem kell hozzá programozói ismeret

A leírtakat Arcolinux alatt, 2020. februárjában teszteltem.
Átnézve:2023-09-13