Toon posts:

[Linux] [BASH] Backup script, tar output naar variabele

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met het volgende probleem, ik heb een simpel backup script geschreven om data uit een directory op een gemounte samba schijf te plaatsen in een tar.bz2 format.

Het script luid als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

#Start tijd backup
startt=`date +%T`

#Archief maken van data en op share plaatsen
mkarchiveinfo= tar -c -j -P --totals -f /mnt/smb-bu/backup.`date +%d.%m.%Y`.tar.bz2 /raid

#Backups ouder dan 14 dagen verwijderen
rmarchiveinfo= rm -f /mnt/smb-bu/*.`date --date='14 days ago' +%d.%m.%Y`.tar.bz2

#Eind tijd backup
eindt=`date +%T`

echo $mkarchiveinfo #alleen voor test
echo $rmarchiveinfo #alleen voor test

echo '\n'"Begin tijd van backup:" $startt'\n''\n'"Backup informatie:" $mkarchiveinfo '\n''\n'"Opruim Informatie:" $rmarchiveinfo '\n''\n'"Eind tijd van backup:" $eindt'\n'

Nou is het probleem dat ik de output van het inpakken en plaatsen van de bestanden uiteindelijk in een tekst bestand wil plaatsen om een soort log te creeren.
Maar ik heb gevoel dat de variabele niet goed aangemaakt word, omdat er geen output getoond word.
Weet iemand hier mogelijk een oplossing voor of wat ik verkeerd doe?

  • teigetjuh
  • Registratie: September 2000
  • Niet online
Nou ben ik geen scripter, maar ik zie nergens enige verwijzing naar een logbestand.
je zou je commando's dus moeten aanvullen met een output-redirection, zoals:
code:
1
commando >> logfile

Maar er is nog veel meer mogelijk, zoals een los errorlog. Output-redirection is dus het sleutelwoord.

Verwijderd

Topicstarter
Nee dat klopt momenteel plaatst hij alles nog rechstreeks op het scherm, het is echter de bedoeling straks de echo naar een bestand te plaatsen.
Om test doeleinden is het makkelijker om gelijk de output te zien i.p.v. telkens het tekst bestand te moeten openen :)

  • zomertje
  • Registratie: Januari 2000
  • Laatst online: 03-02 16:28

zomertje

Barisax knorretje

Wat komt er op je scherm dan? Want ik mis even wat er nu fout gaat.

het ultieme jaargetijde.... | #!/usr/bin/girl | Art prints and fun


  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Verwijderd schreef op vrijdag 03 november 2006 @ 11:07:

Het script luid als volgt:
code:
1
2
#!/bin/bash
mkarchiveinfo= tar -c -j -P --totals -f /mnt/smb-bu/backup.`date +%d.%m.%Y`.tar.bz2 /raid
Ik heb de indruk dat het hier al fout gaat, door de spatie achter de = wordt mkarchiveinfo een lege string en wordt vervolgens daar het tar commando door het script uitgevoerd.

Je zou hier
code:
1
mkarchiveinfo="tar -c -j -P --totals -f /mnt/smb-bu/backup.`date +%d.%m.%Y`.tar.bz2 /raid"

van moeten maken.

Ook lijkt het me handiger een find te gebruiken voor opschonen

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Verwijderd schreef op vrijdag 03 november 2006 @ 11:07:
code:
1
mkarchiveinfo= tar -c -j -P --totals -f /mnt/smb-bu/backup.`date +%d.%m.%Y`.tar.bz2 /raid
Deze syntax klopt van geen kant :)
Je kunt niet zonder meer een commando achter een ='je zetten en dan hopen dat het magischerwijs in iets voor het =-teken komt (en al helemaal niet als je er willekeurig spaties tussenzet).
Wat deze regel doet, is ken de lege waarde toe aan de variabele mkarchiveinfo (mkarchiveinfo= ), en doe dan tar. Dan gebeurt er natuurlijk helemaal niks anders dan wanneer je gewoon tar uit zou voeren.
Kijk eens naar backticks en lees een willekeurige scripting-howto over bash, daar staat precies uitgelegd hoe je de output van een commando in een variabele kunt stoppen (je doet het nota bene 3 of 4 regels erboven zelf al goed ) :)

Verwijderd

Topicstarter
Wat er op dit moment op mijn scherm komt is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tar: /mnt/smb-bu/backup.03.11.2006.tar.bz2: Functie open() is mislukt: No such file or directory
tar: Fout is niet herstelbaar -- tar sluit nu af.
tar: /raid: Functie stat() is mislukt: No such file or directory





Begin tijd van backup: 12:19:33

Backup informatie: 
 

Opruim Informatie: 
 

Eind tijd van backup: 12:19:33

Nou krijg ik nu nog een error van tar terug omdat het nog niet op de uiteindelijke pc draait.
Het is alleen de bedoeling dat de info die terug komt (in dit geval dus de error) onder "Backup informatie:" komt te staan en rm onder "Opruim informatie:" komt te staan

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
blaataaps schreef op vrijdag 03 november 2006 @ 12:25:
[...]
Deze syntax klopt van geen kant :)
Je kunt niet zonder meer een commando achter een ='je zetten en dan hopen dat het magischerwijs in iets voor het =-teken komt (en al helemaal niet als je er willekeurig spaties tussenzet).
Wat deze regel doet, is ken de lege waarde toe aan de variabele mkarchiveinfo (mkarchiveinfo= ), en doe dan tar. Dan gebeurt er natuurlijk helemaal niks anders dan wanneer je gewoon tar uit zou voeren.
Kijk eens naar backticks en lees een willekeurige scripting-howto over bash, daar staat precies uitgelegd hoe je de output van een commando in een variabele kunt stoppen (je doet het nota bene 3 of 4 regels erboven zelf al goed ) :)
Hehe , te laat. Ik denk alleen dat hij het commando in de variabele wil zetten en niet het resultaat, dus geen backticks maar quotes

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Verwijderd

Topicstarter
Nee nee, het is inderdaad de bedoeling de output van het commando in een variabele te plaatsen zodat ik dit later kan echo-en.

Ik heb echter totaal geen scripting ervaring en ik begrijp nu inderdaad dat het commando tussen haakjes zal moeten.
Ik las trouwens ook nog iets dat ik via "|" pipes de output van het commando ergens voor kan laten gebruiken is het hiermee ook mogelijk het naar een variabele te plaatsen en is dit een beter oplossing?

[ Voor 46% gewijzigd door blaataaps op 03-11-2006 12:37 . Reden: edit ipv quote, sorry ]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Nee nee, het is inderdaad de bedoeling de output van het commando in een variabele te plaatsen zodat ik dit later kan echo-en.

Ik heb echter totaal geen scripting ervaring en ik begrijp nu inderdaad dat het commando tussen haakjes zal moeten.
Waar lees jij over haakjes?
Ik las trouwens ook nog iets dat ik via "|" pipes de output van het commando ergens voor kan laten gebruiken is het hiermee ook mogelijk het naar een variabele te plaatsen en is dit een beter oplossing?
Pipes zijn er grofweg voor om de output van het ene programma te gebruiken als input voor het andere, dat heeft dus weinig met variabelen te maken. Maar, kijk nou gewoon eens naar je eigen script en lees een bash scripting howto :)

Verwijderd

Topicstarter
Bedankt iig voor de info, en de haakjes waren om het commando achter het variable uit te voeren.
Ik ben nu iig bezig met het lezen van een bash scripting howto en een search op google naar backticks leverde ook het een en ander op, nogmaals bedankt.

Als ik er nu nog niet uit kom zal er vanzelf weer iets gepost worden in dit topic :)

Verwijderd

Zoiets? :)

code:
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
#!/bin/bash

#Start tijd backup
startt="$(date +%T )"

#Archief maken van data en op share plaatsen
mkarchiveinfo="tar -c -j -P --totals -f /mnt/smb-bu/backup.`date +%d.%m.%Y`.tar.bz2 /raid"

#Backups ouder dan 14 dagen verwijderen
rmarchiveinfo="$(rm -fv /mnt/smb-bu/*.`date --date='14 days ago' +%d.%m.%Y`.tar.bz2 )"

#Eind tijd backup
eindt="$(date +%T )"


# Start script

echo -e "\nBegin tijd van backup: ${startt} \n"

echo -e -n "Backup informatie: " 

${mkarchiveinfo}

echo

echo -e "Opruim Informatie: $rmarchiveinfo \n"

echo -e "Eind tijd van backup: ${eindt} \n"

exit


//edit: heb even de optie -v meegegeven aan rm, anders geeftie natuurlijk geen output.

[ Voor 7% gewijzigd door Verwijderd op 03-11-2006 15:04 ]


Verwijderd

Topicstarter
Hey hardstikke bedankt, alleen zit ik nu met het punt dat er meerdere echo's gebruikt worden.
Hierdoor kan ik het niet naar 1 tekst bestand sturen, wat nou juist de bedoeling was ;)

Maar misschien dat ik ook wel kan zorgen dat de output van dit document word opgeslagen en dat ik dit bestand aanroep via een ander :)

EDIT: De oplossing :)

Bij deze werkt hij nu en voor de mensen die nog iets soortgelijks zoeken alhier:

Bestand 1 (runbackup.sh):
code:
1
2
3
./backup.sh > log.txt

exit 0


Bestand 2 (Het script, tevens bz2 naar rar veranderd):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

#Start tijd backup
startt="$(date +%T )"

#Archief maken van data en op share plaatsen
mkarchiveinfo="rar a -r -rr /plaats/van/de/backup/backup.`date +%d.%m.%Y`.rar /home/seconet/backupped/"

#Backups ouder dan 7 dagen verwijderen
rmarchiveinfo="rm -f -v /plaats/van/de/backup/*.`date --date='7 days ago' +%d.%m.%Y`.rar"

#Eind tijd backup
eindt="$(date +%T )"


# Start script
echo -e '\n'"Begin tijd van backup:" $startt '\n''\n'
echo -e "Backup informatie:"'\n'
$mkarchiveinfo
echo -e '\n''\n'"Opruim Informatie:"'\n'
$rmarchiveinfo
echo -e '\n''\n'"Eind tijd van backup:" $eindt '\n'

exit 0


Succes ermee, Mr.Anarchy :)

[ Voor 59% gewijzigd door Verwijderd op 04-11-2006 12:13 ]


Verwijderd

Ow :P Was te snel je script in gedoken, het loggen was me ontgaan. Gelukkig heb je de oplossing gevonden :)

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 04-02 23:43

SA007

Moderator Tweaking
Erm, al duurt he backuppen 1 compleet jaar, dan staat nog de begintijd en de eindtijd exact hetzelfde...
Je moet de eindtijd berekenen NADAT alles gedaan is ;)

Het kan btw makkelijk in 1 file door >> te gebruiken.
code:
1
2
echo "blaat" > log
echo "blaat2" >> log

Geeft uiteindelijk:
quote: log
blaat
blaat2
Pagina: 1