Linux bash script kérdés

Fórumok

Sziasztok,

Van egy VPS amin fut apache+php+myqsl.
A web fájlokról (tömörítve) és az adatbázis dumpokról minden éjszaka az aznapi mentés helyben tárolódik 5 napig.
Minden éjszaka az azanapi mentés a saját gépemre másolódik át.
Van egy db könyvtár az adatbázis dompoknak, és egy web a web fájloknak.

4 weboldal fájljai a web mappában, 19 adatbázis fájljai a db mappában, és mind a saját nevű mappájába van mentve. pl. teszt1 adatbázis a teszt1 mappában

A mentések a /home/joda/mentes/ mappába felcsatolt merevlemezre mennek, 1 évre visszamenőleg tárolom.

Adatbázisok mappái:
/home/joda/mentes/db/teszt1
/home/joda/mentes/db/teszt2
/home/joda/mentes/db/drupal1
/home/joda/mentes/db/drupal2

web fájlok mappái:
/home/joda/mentes/web/weblap1
/home/joda/mentes/web/weblap2
/home/joda/mentes/web/weblap3
/home/joda/mentes/web/weblap4

Szükségem lenne egy olyan scriptre, amiben be tudom állítani, hogy pl. a 2015.03.05.-i-ei mentést másolja át a /home/joda/munka/ könyvtárba. A web fájlok a web mappába az adatbázis fájlok a db mappába kerüljenek, mind a saját nevű mappája alá, ugyanúgy, mint ahogy a mentésben van a struktúra.
Ez egy ideiglenes mappa, tartalma csak addig kell amíg lemezre írom, aztán törlöm.
A dátumot nekem mondják, hogy miről írjak lemezt, teljesen logikátlanul.

Kinek milyen ötelete lenne erre?

Előre is köszönöm a segítséget.
Joda.

Hozzászólások

szia,

nem egy bonyolult dolog. tudnám javallani esetlegesen a bash scriptet, olvass utána, kevés tudással is szép eredményeket lehet elérni.
---
debian stable

Természetesen megoldható, de biztos, hogy azt akarod?

Egy óvatlan touch parancs, vagy egy fájl rossz könyvtárba másolása (és kitörlése) 2015.06.09-én az egyébként 2015.01.02-i mentés valamelyik fájlján/könyvtárán, és egy másnapi visszaállítás sorás csak lesel, hogy hová lett félévnyi anyag.

Mi akadályozza meg, hogy a backup eleve a backup napjának megfelelő nevű könyvtárba kerüljön?
Ha valami komolyan akadályozza, akkor mi akadályozza azt, hogy a könyvtárba bekerüljön egy pici metainfo fájl, amelynek neve vagy a tartalma a dátum?

Szóval figyeljünk picit jobban a(z utólagos) tervezésre, mint tót az édesanyjára.

Hiszen már lejjebb is beléd kötöttek! :)

Neve? A bash-ra gondolsz?
Vélemények?
Hallottam olyanról, aki meg volt győződve, hogy multitaskingra csak a VAX gépek processzora képes.
Olyannal viszont beszéltem, aki szerint a tranzakció, mint olyan, csak Oracle-ben létezhet.
Mivel a topicnyitó kijelentette, hogy nem tud programozni, lehetett volna egy értelmes hozzászólás:
Én sem tudok programozni, te sem tudsz programozni, ajánlom a bash scriptet (ahhoz én sem értek), és majd segítek.
Ja, a neve: script? Erre gondoltál?
No, akkor lenne egy kérdésem:
Az a
- végesállapotú gép elven működő
- kb. 100 automatát futtató (folyamatos, automatikus üzemű, önjavító)
- webet kiszolgáló
- adatbázisszerverrel kommunikáló
- 25.000.000 backupot kezelő
- 100 klienssel kapcsolatot tartó
- 4800 soros
bash script az

a) program
b) olajos hal
(Csak egy válasz jelölhető meg! ;)

Háttérinformációk:
A tudományos alaposságot mellőzve a következő program fajtákat ismerjük (no, ebbe aztán biztosan beleköt valaki!):
- szkript (interpretált, sőt a shell és a COMMAND.COM is egy command interpreter)
- p-code (ezt egy közbülső kódra fordítjuk)
- bináris (ezt "teljesen" lefordítjuk)
- gépi kód - ez meg nem is programnyelv
Ezen cuccosok mindegyike program, csak más eszközökkel készül és másképp fut.

nem értem minek kell ehhez szkript, miért nem másolod át simán?

szerk.: sztem szedd kicsit össze a gondolataid, hogy tudd mit szeretnél is írd át a fenti kérést. pl. ilyenekre gondolok, hogy mindennap mi alapján választod ki a dátumot és a cél mappát ahova átmásolnád a mentést? stb.

--------------------
http://grant-it.com/

hogy akarnád ezt hasznáni? mert a nyitóból nem tiszta, hogy most rendszeresen oda akarod pakolni, vagy egy egyszeri dolog kell?

Kérdés még, hogy a fileok nevéből kiderül-e, hogy mikori mentés, illetve hogy hogyan akarod megmondani, hogy melyik web/adatbázis mentése kell.

Szóval részletesebb specifikációt :)
- ilyen filejaim vannak
- minek a hatására
- melyiknek
- hova kéne kerülni
- és később minek kéne történni vele

Nem értesz a bash-hez, és gondolom a fejlesztési idő minimalizálása lenne a cél, ezért faék egyszerűségű megoldást mondok: excel-ben (libreoffice, stb) legenerálod a visszamásoló shell script-et, az eredményt bedobod egy #!/bin/bash kezdetű text file-ba, adsz rá futtatási parancsot és elengeded.

Ehhez kell egy template, mittomén A1 cella a dátumot tartalmazza (javaslom, hogy text legyen), Az A2..An cellák pedig a megfelelő könyvtárakat, pl. db/teszt1, web/weblap2, stb.

Ha a 2015.03.05.-ei mentések a nevükben pl. a 20150305 string-et, akkor az


mkdir -p /home/joda/munka/db/teszt1 && cp /home/joda/mentes/db/teszt1/*20150305* /home/joda/munka/db/teszt1/

sort, ha pedig a valamilyen könyvtárstruktúrban vannak a dátumok, akkor pl. a


mkdir -p /home/joda/munka/db/teszt1 && cp /home/joda/mentes/db/teszt1/2015/03/05/mentes.tgz /home/joda/munka/db/teszt1/

sor kell legenerálnod. Minimális excel tudással ez eléggé triviális, mittomén B2 tartalma


="mkdir -p /home/joda/munka/"&A2&" && cp /home/joda/mentes/"&A2&"/*"&$A$1"&* /home/joda/munka/"&A2&"/"

az első példára, már ha el nem írtam.

szerintem a cp -r kellene, annak rekurzívan kellene másolnia. Legalábbis nálam így működik


me@mystation:~$ mkdir joda
me@mystation:~$ cd joda
me@mystation:~/joda$ mkdir -p susu111gugu/1
me@mystation:~/joda$ mkdir -p susu111gugu/2
me@mystation:~/joda$ mkdir -p susu111gugu/3
me@mystation:~/joda$ cp -r *111* target/
me@mystation:~/joda$ ls target
susu111gugu
me@mystation:~/joda$ ls target/susu111gugu/
1  2  3

Én így próbálom, hogy ne kelljen minden mappára külön script:

cp -r /home/joda/mentes/db/*2015-06-09* /home/joda/munka/db/

De nem jó,

Ha bővül a az adatbázis ne kelljen a szkriptet bővíteni.

Adatbázisok mappái példafájlokkal:

/home/joda/mentes/db/teszt1/teszt1-2015-06-09-sql.gz
/home/joda/mentes/db/teszt2/teszt2-2015-06-09-sql.gz
/home/joda/mentes/db/drupal1/drupal1-2015-06-09-sql.gz
/home/joda/mentes/db/drupal2/drupal2-2015-06-09-sql.gz

Ja, hogy így. Szóval a db név szerint egyrészt külön könyvtárban is van, másrészt pedig a neve is tartalmazza a db nevet.

A fenti parancs nyilván nem jó, vagyis hát pont jó, mert olyat másolnál ami nincs is. Szóval az elvárásoknak megfelelően működik.
A fenti struktúrához viszont nem kell rekurció, egyszerűen csak ennyi:


cp /home/joda/mentes/db/*/*2015-06-09* /home/joda/munka/db/

Vagyis a /home/joda/mentes/db/ összes alkönyvtárából elmásolja a *2015-06-09*-re match-elő file-okat.
Így lehet egyszerűsíteni a dolgokat, ha a kiírt médián nem kell db-nként külön könyvtárban lennie.
Csak halkan mondom: baromi nehéz így segíteni, hogy csak csepegteted az infókat.

Miert nem csinalsz egy egyszeru templatet, amiben csak a datumot kell valtoztatnod?
Valami olyat mibt itt.


#!

EV=2015
HO=05
NAP=06

#Adatbazi Utvonalak
DB_1_SOURCE=/var/www/akarmi/dump/teszt1
DB_2_SOURCE=/var/www/akarmi/dump/teszt2
DB_3_SOURCE=/var/www/akarmi/dump/teszt3
DB_4_SOURCE=/var/www/akarmi/dump/teszt4

DB_1_DESTINATION=/home/joda/mentes/db/teszt1
DB_2_DESTINATION=/home/joda/mentes/db/teszt2
DB_3_DESTINATION=/home/joda/mentes/db/drupal1
DB_4_DESTINATION=/home/joda/mentes/db/drupal2

cp $DB_1_SOURCE/adatbazisnev-$EV-$HO-$NAP.tgz $DB_1_DESTINATION/adatbazisnev-$EV-$HO-$NAP.tgz

Valami ilyesmi nem működhet?


#!/bin/bash
cd /home/joda/mentes
find . -name "*$1*" -or  -name "*${1//-}*" | xargs cp --parents -t /home/joda/munka

Használat:
./script 2015-05-01

Find megkeresi a fájlokat aminek a nevében benne van, hogy 2015-05-01 vagy 20150501 majd a cp --parents kapcsolója gondoskodik arról, hogy a forrással megegyező struktúrába másolódjon a munka könyvtárba. De lehet félreértettem és bonyibb. :)