ubuntuusers.de

pg_dump Skript als Cronjob testen

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

siezen

Anmeldungsdatum:
12. August 2015

Beiträge: Zähle...

Guten Morgen, folgendes Problem: Ich habe ein Skript geschrieben welches meine PostgreSQL Datenbank von meinen Raspberry(Raspbian)(soll Server sein) auf einem USB Stick speichern soll, falls angeschlossen, und wenn nicht lokal im Verzeichnis /home/pi/backup. Das Skript sieht wie folgt aus:

 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
#!/bin/bash
#backup-postgresql.sh
if [ -d "/dev/sda" ]
then
sudo apt-get -y install ntfs-3g hfsutils hfsprogs exakt-fuse
if [ ! -d "/media/usbstick" ]
then
sudo mkdir /media/usbstick
fi
sudo mount -t vfat -o utf8,uid=pi,gid=pi,noatime /dev/sda /media/usbstick
BASE_DIR="/media/usbstick"
elif [ -d "/dev/sda1" ]
then
sudo apt-get -y install ntfs-3g hfsutils hfsprogs exakt-fuse
if [ ! -d "/media/usbstick" ]
then
sudo mkdir /media/usbstick
fi
sudo mount -t vfat -o utf8,uid=pi,gid=pi,noatime /dev/sda1 /media/usbstick
BASE_DIR="/media/usbstick"
elif [-d "/media/usbstick" ]
then
BASE_DIR="/media/usbstick"
else
if [ ! -d "/home/backup" ]
then
sudo mkdir /home/backup
fi
BASE_DIR="/home/backup"
fi

YMD=$(date +"\%Y-\%m-\%d_\%H-\%M")

DIR="${BASE_DIR}/labor_${YMD}.sql"

sudo pg_dump -U postgres -f ${DIR} labordb

Bei YMD habe ich darauf geachtet das ich vor jedes Prozent ein Backslash getan habe, damit kein Zeilenumbruch passiert

Ich habe mit dem Befehl

1
$ sudo crontab -e

die Crontabelle aufgerufen und

1
*/2 * * * * /home/pi/backup-postgresql.sh

eingetragen.

Wenn ich

1
$ tail -f /var/log/syslog

aufrufe, erscheint auch

1
..... /USB/SBIN/CRON[2424]: {root} CMD (/home/pi/backup-postgresql.sh)

Woraus ich schließe, dass dieser Prozess auch durchgeführt wird.

Ebenso habe ich

1
 sudo nano ~/.pgpass

aufgerufen und

1
*:*:labordb:postgres:admin

eingetragen.

Und danach

1
sudo chmod 600 ~.pgpass

ausgeführt, wobei ich zugeben muss das ich nicht wirklich verstehe was das tut.

So das sind alle Sachen die ich gefunden habe,damit das eig klappen sollte, wenn ich das ganze als Skript aufrufe mit

1
bash /home/pi/backup-postgresql.sh

fragt er mich immer noch nach dem Passwort, sollte das sein?

Ich bin langsam echt ratlos und würde mich über Tipps und Ratschläge freuen.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21853

Wohnort: Lorchhausen im schönen Rheingau

Guten Morgen

siezen schrieb:

fragt er mich immer noch nach dem Passwort, sollte das sein?

Du benutzt mehrfach sudo und ohne entsprechende Konfiguration fragt sudo nach dem Passwort...

Ich bin langsam echt ratlos und würde mich über Tipps und Ratschläge freuen.

Ich würde das Problem sowieso anders angehen, also dein Skript anders aufbauen.

siezen

(Themenstarter)

Anmeldungsdatum:
12. August 2015

Beiträge: 4

Danke schonmal, leider muss ich sagen das ich damit nicht ganz soviel anfangen kann. Bin blutiger Anfänger was das alles angeht.. Habe jetzt

1
sudo nano /etc/sudoers

aufgerufen und dadrin steht

1
pi All=(ALL) NOPASSWD: ALL

Heißt das nicht, dass er alles ohne Passwortabfrage durchführen darf ?

Wie finde ich denn raus, was den cronjob stört ?

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21853

Wohnort: Lorchhausen im schönen Rheingau

siezen schrieb:

Heißt das nicht, dass er alles ohne Passwortabfrage durchführen darf ?

Soweit mir bekannt ist (der Wikiaritkel sieht das genauso) soll das

pi      ALL = NOPASSWD: ALL

heissen. grundsätzlich bearbeitet man nie die sudoers direkt, sondern mit visudo damit beim Speichern eine Syntaxprüfung vorgenommen wird. Auch DAS erklärt der Wikiartikel.

Wie finde ich denn raus, was den cronjob stört ?

Im Zweifelsfall indem Du die Befehle einzeln ausführst. zB sieht der eigentlich pg_dump-Befehl komisch aus. Grundlegend würde ich wie gesagt erst mal das Skript überarbeiten, das gehört eigentlich in einen neuen Thread im passenden Forum:

  1. Du installierst (jedes mal) NTFS-Tools, mountest dann aber vfat

  2. Der Zweig ab Zeile 12 wird nie mMn ausgeführt. Wenn es /dev/sda1 gibt ist automatisch auch /dev/sda vorhanden, das heisst der vorherige Zweig ist bereits ausgeführt.

    1. Warum überhaupt /dev/sda und /dev/sda1? Wir reden hier von (hoffentlich) exklusiven Backupmedien - da kannst Du doch das layout bestimmen.

    2. Normalerweise ist sda das System, auf jeden Fall ist die Zuordnung nicht fix. Warum verwendest Du keine UUID

  3. Du definierst wunderbar eine Variable Basedir, aber du benutzt sie nicht.

    1. Warum setzt Du sie nicht am anfang auf /home/backup/... und setzt sie nur um, wenn der USB-Stick angesteckt ist?

    2. Warum prüfst Du nicht einmal auf Vorhandensein von Basedir und erstellst das Verzeichnis dann?

  4. Warum ist das Zeug nicht ordentlich eingrückt? So kann ja keiner erkennen, in welchen if-Zweig er gerade ist.

  5. Um Kollision mit Systemvariablen zu vermeiden sollte man eigene Variablen klein schrieben. Lese mal einen ordentlich Bash-Skripting-Guide, im entsprechenden Unterforum finden sich da viele Hinweise drauf.

  6. Warum benutzt Du sudo in jedem Befehl, wenn Du auch das komplette Skript mittels sudo aufrufen könntest?

Zusammengefasst, um mal Komplexität rauszunehmen:

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

base_dir="/home/backup"
uuid="HIER_DEINE_UUID"

### Abfrage nach dem USB-Stick ###
if [[ -e /dev/disk/by-uuid/$uuid ]]
then
  apt-get -y install ntfs-3g hfsutils hfsprogs exakt-fuse ## Meiner Meinung nach unnötig
  if [[ ! -d /media/usbstick ]]
  then
     mkdir /media/usbstick
  fi
  mount -t vfat -o utf8,uid=pi,gid=pi,noatime /dev/disk/by-uuid/$uuid /media/usbstick
  base_dir="/media/usbstick"
fi

if [[ ! -d $base_dir ]]
then
  mkdir $base_dir
fi

YMD=$(date +"\%Y-\%m-\%d_\%H-\%M")

DIR="${base_dir}/labor_${YMD}.sql"

sudo pg_dump -U postgres -f ${DIR} labordb

siezen

(Themenstarter)

Anmeldungsdatum:
12. August 2015

Beiträge: 4

Ich habe das Skript jetzt wie folgt geändert

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

base_dir="/home/backup"
uuid="HIER_DEINE_UUID"

### Abfrage nach dem USB-Stick ###
if [[ -e /dev/disk/by-uuid/$uuid ]]
then
  if [[ ! -d /media/usbstick ]]
  then
     mkdir /media/usbstick
     mount -a
  fi
  base_dir="/media/usbstick"
fi

if [[ ! -d $base_dir ]]
then
  mkdir $base_dir
fi

YMD=$(date +"\%Y-\%m-\%d_\%H-\%M")

DIR="${base_dir}/labor_${YMD}.sql"

sudo pg_dump -U postgres -f ${DIR} labordb

Das statische einbinden habe ich über einen Eintrag in die etc/fstab vorgenommen

1
UUID=5198-0A37 /media/usbstick vfat default,noatime 0 0 

Und die Rechte habe ich mit visudo

1
pi ALL = NOPASSWORD : ALL

gesetzt.

Leider funktioniert das ganze immer noch nicht, habe jetzt in der Crontab

1
..... 2> fehler.txt

ergänzt. In diese wird eingetragen: Permission denied. Woraus ich schließe, dass mit der .pgpass immer noch nicht was passt. Kann mir da jemand weiterhelfen ?

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21853

Wohnort: Lorchhausen im schönen Rheingau

Sekunde mal... Du schreibst nach $base_dir, darf denn der user, der da hin schriebt das überhaupt?

siezen

(Themenstarter)

Anmeldungsdatum:
12. August 2015

Beiträge: 4

Wenn ich das ganze manuell ausführe

1
sudo bash /home/pi/backup-postgresql.sh 2> fehler.txt

kommt keine Fehlermeldung. Jedoch werde ich trotzdem nach dem Passwort gefragt. Ich hoffe ich hab deinen Rat richtig verstanden

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21853

Wohnort: Lorchhausen im schönen Rheingau

siezen schrieb:

Jedoch werde ich trotzdem nach dem Passwort gefragt.

Na klar. Du führst ja auch das Kommando bash aus, nicht dein Skript. Das ist ein UNterschied.

Antworten |