Iš pradžių norėjau papasakoti tik apie Ubuntu Notify-OSD pranešimų rodymą iš komandinės eilutės ir kaip juos privesti veikti iš crontab aplinkos. Tačiau galiausiai vistiek nusprendžiau papasakoti pilną istoriją, todėl kartu sužinosite ir apie atsarginiu kopijų darymą su rsync.
Notify-OSD pranešimai
Į Ubuntu 9.04 Jaunty Jackalope versiją buvo įdiegta nauja informacinių pranešimų sistema – Notify-OSD. Notify-OSD atsakinga už programų ir operacinės sistemos informacinių pranešimų valdymą ir rodymą vartotojui. Apie juos plačiau galite pasiskaityti Mark Shuttleworth bloge arba oficiame puslapyje. Man iškart kilo klausimas, kaip rodyti custom pranešimus. Notify-OSD biblioteka turi C, C# ir Python API. O ką daryti kitiems? Kitiems siūloma naudotis komandine eilute. Tereikia susiinstaliuoti libnotify-bin biblioteką ir bus galima naudotis notify-send komanda:
1 | notify-send "Title" "Info message" |
Gausime štai tokį informacinį pranešimą su tekstu (jop, neiškenčiau kartu nepaspaudinėti ir ekrano šviesinimo mygtuko):

Atsarginės kopijos
Kad reikia daryti atsargines kopijas – žinom visi. Nuo tada, kai pavogė mano seną nešiojamą kompiuterį, į visą šį reikalą žiūriu daug rimčiau. Atsarginių kopijų darymo principai skiriasi priklausomai nuo to, kokios yra naudojamos sistemos. Serveriuose naudojami vienokie būdai, namų kompiuteriuose – kitokie. Aš pats turiu nešiojamą kompiuterį. Mano atsarginių kopijų darymo tikslas – išsaugoti informaciją, jei kas nors nutiktų kompiuteriui, todėl dubliuoti duomenis tame pačiame diske yra nelogiška. Tam naudoju išorinį diską, jungiamą per USB jungtį. Čia iškyla keletas klausimų, kuriuos reikia išspręsti:
- Diskas ne visada yra prijungtas.
- Atsarginių kopijų kūrimas turi būti automatizuotas. Nesinori rankomis paleidinėti skripto, kai prijungiamas diskas.
Atsarginių kopijų kūrimo skriptas
Problemą išsprendžiau pasirašęs nesudėtingą bash skriptą, tikrinantį ar yra prijungtas mano nurodytas diskas. Jei diskas prijungtas, vykdomi duomenų sinchronizavimo darbai. Skriptą leidžiu periodiškai, porą kartų per dieną. Kadangi duomenų pokyčiai nėra dideli, tai tokio dažnumo man pilnai užtenka, turint omenyje, kad sinchronizavimas bus atliktas vidutiniškai kas 2-3 dienas (tada būsiu prisijungęs išorinį diską). Kadangi skriptas vykdomas periodiškai su crontab pagalba, tai pasinaudodamas Notify-OSD išvedu į ekraną informacinius pranešimus. Skriptas atrodo taip:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #!/bin/bash #author: Povilas Balzaravičius 2009 # BACKUP_DISK="/media/E"; #Checks if disk passed as parameter $1 is mounted to the system. is_mounted () { if [ -z "$1" ] then notify "Disk path is zero length." else if mount|grep $1 > /dev/null; then return 1; else return 0; fi fi } #Displays notify message balloon. notify () { /usr/bin/notify-send "Backup" "$1" } is_mounted $BACKUP_DISK disk_mounted=$? export DISPLAY=:0 #For cronjob using gui notifications. #If disk is mounted, let's do backups. if [ "$disk_mounted" -eq 1 ] then notify "Started" rsync -Pva /home/pawka/C/Documents/* "$BACKUP_DISK/backup/Documents"; rsync -Pva --delete /home/pawka/www/* "$BACKUP_DISK/backup/www"; rsync -Pva --delete /home/pawka/darbai/* "$BACKUP_DISK/backup/darbai"; rsync -Pva --delete /home/pawka/tools/* "$BACKUP_DISK/backup/tools"; notify "Finished" else notify "Disk $BACKUP_DISK is not mounted." fi exit 0; |
Atkreipkite dėmesį į šią eilutę:
31 | export DISPLAY=:0 #For cronjob using gui notifications. |
Ji reikalinga, kad vykdant blowcronjob būtų galima rodyti pranešimus vartotojo grafinėje aplinkoje. 0 (nulis) nurodo darbalaukio numerį. Jei nebūtų šios eilutės, informaciniai pranešimai nebūtų rodomi. Analogiškai, jei iš cron aplinkos norite paleisti kokią nors grafinę programą, taip pat turite nurodyti šį parametrą. Pavyzdžiui norėdami ryte atsibusti su muzika, į cron’ą turite įrašyti šią eilutę:
1 | 30 6 * * * export DISPLAY=:0 && vlc http://jungletrain.net/64kbps.m3u |
Atsarginių kopijų darymo skripte nusirodykite savo diską į kurį norite kopijuoti duomenis (BACKUP_DISK kintamasis), pakeiskite rsync katalogus, kuriuos norite išsaugoti ir naudokit į sveikatą.
{ 1 trackback }
{ 16 comments… read them below or add one }
Aš tai atsarginėms kopijoms daryti naudoju Back In Time programą – čia kaip sakant ne tokiems g33k’ams kaip tu :) Planuoju apie ją parašyt atskirai.
Beje, login ambasadoriaus ženkliuką jau gali nusiimt ;)
Karoli, O kur tu dedi duomenis? Į išorinį HDD ar kokį home-serverį? Jei į išorinį diską, tai kaip Back In Time elgiasi, kai diskas neprijungtas? Beje, ji veikia visada kaip atskiras daemonas ar surašo vykdymo skriptus į crontab’ą?
P.S. Ženkliuką išsiėmiau :-)
P.P.S. Radau atsakymą dėl cron’o – surašo duomenis į jį.
Jep, programa realiai yra tik UI keliems skriptams, tarp jų ir tam pačiam rsync’ui. O jei neranda išorinio HDD, paprašo, kad jį per 30 sekundžių įjungtum. Jei to nepadarai, tą backup praleidžia ir laukia kito eilės. Be to, ji daro inkrimentinius backup’us – t.y. išsaugo tik tai kas pasikeičia, o į kitus failus sudeda hardlink’us, todėl galima labai daug backup’ų sutalpint į vieną diską, o po to labai lengva pasirinkti kurį būtent nori atkurti.
Taip, mačiau, kad snapshoot’us daro. Pats irgi galvojau ar man reikia jų. Kadangi kompiuteriu naudojuosi pats vienas, o ne visa šeima ar giminė, tai nusprendžiau jų atsisakyti. Be to, kodui naudoju paskirstytą versijavimo sistemą (jei konkrečiai – GIT). Tai, kiekvienam projekte yra saugoma visa jo istorija. Dėl šios priežasties ir nusprendžiau atsisakyti snapshoot’ų, nes jų kaip ir nebereikia. Beje, jei pastebėjai, Documents katalogui visdėlto nepridėjau “–delete” parametro :-)
Saunus skriptas, bet kad ji jau viesini, keletas pastebejimu (kabinejimasis?):
1) Bet kokiam daznai naudojamam skripte patartina pasiupdatint aplinkos PATH kintamaji, del visa ko. Esu mates a6tveju, kai jis buna iskraipomas, saugoja nekorektiskus kelius.
2) Kai jau pasiupdatini PATH kintamaji, manau reiktu patikrint ar skripte naudojamos programos apskritai egzistuoja sistemoj…
3) Patartina idet loginima i faila (scripte ar cron’e), juk ne visada sedesi prie kompiuterio ir seksi i ekrana metomas zinutes.
4) Pamirsai paminet (nepastebejau?), kad kintamajam DESKTOP priskiriamas dydis (0) nera konstanta; ka reikia priskirt, prilauso nuo to, ant kurio desktopo (skaitytojai to taip pat neturetu maisyt su workspace’ais) sukasi tavo X’ai, kur nori matyt paleidziamos programos langa.
pheu… backups FTW!!!
@lioniax Dėl PATH ir komandų tikrinimo pritariu. Pradžioj galvoju, kur čia PATH man gali pakišti koją ir visai nepastebėjau, kad rsync nenurodęs pilno kelio :-) Loginimą esu pasidaręs, o dėl DISPLAY, tai paminėjau, kad tai darbalaukio numeris.
Taip pat sutinku, kad skriptą yra kur tobulinti. Šiaip, jei darant jį idealesniu, tai pasirašyčiau skriptą ar funkciją, kuriai nebūtų įhardkodinti sincrhonizuojami keliai, o persiduotų per parametrus/parametrų masyvą. Tačiau kol neplanuoju atskiros programos rašymo, viskas ok kaip yra :-)
na keliu apskritai nereikia harkodint, perdavinet per parametrus ar parametru masyvus, kam tada PATH reikalingas? pasirasai naudojamu komanda sarasiuka, cikla, kuris perbega ir patikrina ar programos egzistuoja PATH’e (komanda which) ir viskas, kazkas panasaus:
cmds=”ls grep awk”
which which > /dev/null 2>&1
if [ $? -eq 0 ] ; then
:
else
print “(EE) update your PATH” ; exit 1
fi
for cmd in ${cmds} ; do
which ${cmd} > /dev/null 2>&1
# gali kartot ankstensi if
done
ant bash gal siek tiek kitaip apsiraso, mm, nors turetu veikt…
Ar šiuo atveju nebūtų geriau pasirašyti UDEV taisyklę, kuri paleistų skriptą po mountinimo ?
@Vytautas ne, nes kiltų problemų pvz. prisijungiant diską siekiant persikopijuoti kelis muzikos failus ir bėgti su laptopu namo. Tada prasidėtų kopijavimas.
O kas dabar būna, kai “trumpam” prijungi diską ? Jei prieš ištraukiant diską prasideda backup ?
Prasideda atsarginių kopijų darymas :-) Tačiau geriau tai, nei kiekvieną kartą prijungiant diską. Tiksliau MAN taip patogiau. Nebent galima su kokiu zenity parodyti popup’ą su klausimu “ar daryti atsargines kopijas”.
As truputi pakeiciau tavo skripta
COUNT=0
export DISPLAY=:0 #For cronjob using gui notifications.
for i in `mount | awk ‘{print $3}’`
do
if [ -f $i/.make_backup ]; then
COUNT=`expr $COUNT + 1`
notify “Started ($i)”
rsync -Pva –del /home/tadas/Documents/* “$i/backup/Documents”;
rsync -Pva –del /home/tadas/Projects/* “$i/backup/Projects”;
notify “Finished ($i)”
fi
done
if [ $COUNT -eq 0 ]; then
notify “No backup media found.”
exit 1
fi
Einam per visus primountintus diskus ir ieskom to kuriam yra failas .make_backup. Jei randam padarom backup. Zinoma, dar geresnis budas butu susieti backup diska pagal jo serijini numeri, kad kartais netycia nepadarytu backup ten kur nereikia.
Tadai, o pas tave visuose tuose diskuose yra backupinamos tos pačios direktorijos?
Nelabai supratau ko klausi. Ka as anksciau parasiau yra skirta tam jei nenori nustatyti kazkokio tai pastovaus mount point savo backup diskui. Tiesiog sukuri diske faila .make_backup ir viskas. Butu galima padaryt isvis kietai. Pvz .make_backup galetu saugot katalogus kuriuos reikia backupint. Jei nori truputi daugiau saugumo gali pasidaryt sifruota diska su cryptsetup:
# cryptsetup luksFormat /dev/sdb2
# cryptsetup luksOpen /dev/sdb2 backup
# mkfs.ext3 /dev/mapper/backup
Ir poto naudoji kaip paprasta diska, tik pries montuojant reikes slaptazodi ivest. Ubuntu graziai su tuo susitvarko ir papraso slaptazodzio.
Tą ir norėjau pasiūlyt, kad į .make_backup nurodyt direktorijas, kurias reikia backupint. Nors šitas būdas turi vieną trūkumą. Backup’o konfigūraciniai failai būtų išmėtyti po diskus. Man patogiau atrodytų, kad visa konfigūracija būtų vienoje vietoje. Nors aišku čia priklauso nuo situacijos.
notify-send patogu naudoti parametrus -i /kelias/iki/ikonos.png ir -t 1000 (pranešimą rodys 1000 milisekundžių)