Batch Datei erstellen Consolen Befehl

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Jester84
Beiträge: 69
Registriert: 06.06.2007 20:34:21
Wohnort: Frankfurt

Batch Datei erstellen Consolen Befehl

Beitrag von Jester84 » 05.03.2009 09:36:13

Hallo zusammen,

ich versuche seit ein paar Stunden, leider vergebens eine ausführbare Datei zu erstellen
die ich dann mittels Cronjob täglich ausführen lassen kann...

Normalerweise gebe ich immer per Hand in die Console ein:

su postgres
pg_dump -Fc davical >/daten/davicalxx.xx.xx.pgdump

xx.xx.xx steht immer für das aktuelle Datum
Das jeden Tag selbst zu einzugeben, macht nicht wirklich Spaß ;-)
Was muss ich dafür in meine Datei backup.command schreiben
damit es funktioniert? Bin langsam am verzweifeln...

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Duff » 05.03.2009 09:40:59

Einfach mal mit man date schauen, welches Format du gerne hättest und dann einfach diesen Befehl in einer Variablen speichern und an der entsprechenden Stelle im Skript einfügen.

Beispiel:

Code: Alles auswählen

# > DATUM=$(date '+%d.%m.%Y %H:%M')
# > echo $DATUM
05.03.2009 09:39
Oh, yeah!

Jester84
Beiträge: 69
Registriert: 06.06.2007 20:34:21
Wohnort: Frankfurt

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Jester84 » 05.03.2009 09:58:48

Hi, danke für die schnelle Antwort :-)

da ich noch nicht wirklich viel damit gemacht habe kann ich dir noch nicht ganz folgen.

Also erstes Problem wäre überhaupt erstmal ein Script anlegen
welches die Datei täglich abspeichert,
dazu kommt dann das wenn möglich nicht immer der selbe Dateiname erstellt
wird sondern möglichst mit Datum dabei.
Was sollte dann in der Datei stehen:

#!/bin/sh
# > DATUM=$(date '+%d.%m.%Y %H:%M')
# > echo $DATUM
su postgres
pg_dump -Fc davical >/daten/davical$DATUM.pgdump

Benutzeravatar
hikaru
Moderator
Beiträge: 13950
Registriert: 09.04.2008 12:48:59

Re: Batch Datei erstellen Consolen Befehl

Beitrag von hikaru » 05.03.2009 10:33:45

Dein Ansatz ist schonmal nicht schlecht. Wie wäre es damit?:

Code: Alles auswählen

#!/bin/sh

su postgres
DATUM=$(date'+%y.%m.%d')
pg_dump -Fc davical >/daten/davical$DATUM.pgdump
Das erzeugt eine Datei nach dem Schema in deinem ersten Post. Ich finde YY.MM.DD sinnvoller als andersrum. Wenn du das anders siehst, vertausche einfach %y und %d.

Das Script machst du jetzt noch ausführbar:

Code: Alles auswählen

chmod u+x SCRIPTNAME
Mit Postgres habe ich zuletzt vor zwei Jahren gearbeitet. Ich weiß nicht mehr, wie es dort mit der Passwortabfrage bei der Anmeldung des Users war. Das könnte dir im Script auf die Füße fallen. Wenn du das Script direkt als User postgres ausführst, kannst du dir die su-Zeile sparen.
Wenn du einen Cron für den User Postgres erstellst brauchst du die Anmeldung ohnehin nicht.

Jester84
Beiträge: 69
Registriert: 06.06.2007 20:34:21
Wohnort: Frankfurt

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Jester84 » 05.03.2009 11:39:25

Mit dem Datum hats du recht das schaut wie von dir vorgeschlagen besser aus...

Also diese DB Sicherung führe ich immer manuell mit

Code: Alles auswählen

su postgres
als root eingeloggt aus.
Mit dem Skript scheint es da dann wohl ein Problem zu geben.
Habe es eben einfach mal als root mit

Code: Alles auswählen

./davicalbackup.command
ausgeführt
und dann kam

Code: Alles auswählen

server:/etc/cron.daily# ./davicalbackup.command
postgres@server:/etc/cron.daily$
leider nichts weiter sonst passiert...
Und als postgres user ausführen wie funktioniert das, also
wie stelle ich ein das er das skript als ein bestimmte user ausführt?

btw: lustiges Avatar :D

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: Batch Datei erstellen Consolen Befehl

Beitrag von nepos » 05.03.2009 12:10:35

Bau das Skript so, dass es nur den Dateinamen baut und pg_dump aufruft, kein su.
Dann fügst du das Skript in /etc/crontab ein:

Code: Alles auswählen

0 6 * * * postgres /dein/backup/script
Dadurch wird um 6 Uhr täglich dein Skript unter dem User postgres gestartet.

Benutzeravatar
hikaru
Moderator
Beiträge: 13950
Registriert: 09.04.2008 12:48:59

Re: Batch Datei erstellen Consolen Befehl

Beitrag von hikaru » 05.03.2009 12:40:03

Mit su dürfte es wirklich nicht funktionieren, denn nach dem su bist bist du ja in einer Shell die postgres gehört. Das Script läuft aber in einer root-Shell. Also entwedr machst du das mit sudo oder besser so, wie von nepos vorgeschlagen.


btw: Hab ich gemacht Foto von mich selbst nach teuer Inspektion von User yeti.

Jester84
Beiträge: 69
Registriert: 06.06.2007 20:34:21
Wohnort: Frankfurt

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Jester84 » 05.03.2009 12:55:18

Danke für eure Erklärung, ist absolut nachvollziehbar das es so nicht tun kann :-)
Hab das Script jetzt so

Code: Alles auswählen

#!/bin/sh

DATUM=$(date'+%y.%m.%d')
pg_dump -Fc davical >/daten/davical$DATUM.pgdump
abgelegt und den Eintrag entsprechend deiner Vorgabe in der crontab Datei gemacht.
Bin gespannt ob es dann morgen früh läuft und eine Sicherung passietr ist.
Wann müsste er die denn machen?

Vielen Dank erstmal für die super Unterstützung!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Duff » 05.03.2009 12:58:38

Ich wüde zum Testen mal den crontab-Eintrag auf 13:10 Uhr oder so setzen.

Hier die Erklärung der einzelnen Spalten (aus man 5 crontab):

Code: Alles auswählen

              field          allowed values
              -----          --------------
              minute         0-59
              hour           0-23
              day of month   1-31
              month          1-12 (or names, see below)
              day of week    0-7 (0 or 7 is Sun, or use names)
Das Beispiel von nepos bezieht sich also auf 06:00 Uhr morgens jeden Tag.
Oh, yeah!

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: Batch Datei erstellen Consolen Befehl

Beitrag von nepos » 05.03.2009 13:32:40

hikaru hat geschrieben:Mit su dürfte es wirklich nicht funktionieren, denn nach dem su bist bist du ja in einer Shell die postgres gehört.
Doch, mit su gehts auch. Dafür hat es die Option -c:

Code: Alles auswählen

su - -c id
Password: .....
uid=0(root) gid=0(root) groups=0(root)
Das Problem im ursprünglichen Script ist, dass hier zwar su postgres gemacht wird, aber dann kein Kommando übergeben wird. Also wird nur eine Shell für den User postgres gestartet, die dann auf Eingaben wartet...

Jester84
Beiträge: 69
Registriert: 06.06.2007 20:34:21
Wohnort: Frankfurt

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Jester84 » 06.03.2009 12:01:21

Guten morgen ;-)

Also mit dem Script so

Code: Alles auswählen

#!/bin/sh

DATUM=$(date'+%y.%m.%d')
pg_dump -Fc davical >/daten/davical$DATUM.pgdump
hat es leider nicht geklappt da kein dump abgelegt wurde...

Wie von dir beschrieben wartet er mit der ersten Scriptversion in der Shell auf Eingaben...

Um es mit su- -c id auszuführen müsste es dann so aussehen?
Das Passwort muss dann im Klartext in der Datei stehen?

Code: Alles auswählen

#!/bin/sh

su - -c root
Password: XYZ123
DATUM=$(date'+%y.%m.%d')
pg_dump -Fc davical >/daten/davical$DATUM.pgdump

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Duff » 06.03.2009 12:09:15

Zum Testen das Skript ausführbar machen (chmod +x <script>) und es anschließend mit ./sciptname ausführen.

Wenn das funktioniert, dass Skript in die crontab aufnehmen und als Zeit in 10 Minuten oder wählen und kontrollieren. Bei der Ausführung in der crontab kann es schon mal zu Problemen aufgrund des Environments kommen.
Oh, yeah!

Jester84
Beiträge: 69
Registriert: 06.06.2007 20:34:21
Wohnort: Frankfurt

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Jester84 » 06.03.2009 12:12:57

Du warst schneller als ich ;-)
Habe genau das gerade getestet unn wollte es posten...
Hab mich als postgres eingeloggt und das script ausgeführt, da kam folgende Meldung:

Code: Alles auswählen

#!/bin/sh

DATUM=$(date'+%y.%m.%d')
pg_dump -Fc davical >/daten/davical$DATUM.pgdump
/usr/local/bin/script/davicalbackup.command: line 3: date+%y.%m.%d: command not found
/usr/local/bin/script/davicalbackup.command: line 4: /daten/davical.pgdump: Keine Berechtigung

Benutzeravatar
hikaru
Moderator
Beiträge: 13950
Registriert: 09.04.2008 12:48:59

Re: Batch Datei erstellen Consolen Befehl

Beitrag von hikaru » 06.03.2009 12:33:29

Der erste Fehler liegt am fehlenden Leerzeichen zwischen date und '+%y....
Der Zweite sieht stark nach fehlenden Schreibrechten im Zielordner aus.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Duff » 06.03.2009 12:38:49

zu 1) Der date-Befehl ist falsch, er sollte so aussehen: DATUM=$(date +'%y.%m.%d')
zu 2) Laut Fehlermeldung hast du in dem Verzeichnis /daten keine Schreibrechte.

[edit]
Da war jemand schneller...
[/edit]
Oh, yeah!

Jester84
Beiträge: 69
Registriert: 06.06.2007 20:34:21
Wohnort: Frankfurt

Re: Batch Datei erstellen Consolen Befehl

Beitrag von Jester84 » 06.03.2009 13:25:09

Suuuper, es läuft :D
Nach beheben der beiden Fehler tut es nun wenn ich die Datei selbst ausführen als postgres,
und auch über den cronjob, eben getestet... Echt klasse!
Vielen Dank für den super Support!

Es tut nun zwar alles aber rein aus neugier,
die Idee mit dem su - -c id hatte ich nicht ganz verstanden und ich kann auch keine Beschreibung dazu
finden was dieser Befehl genau macht und wie er funktioniert?

Code: Alles auswählen

su - -c id
Password: .....
uid=0(root) gid=0(root) groups=0(root)

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: Batch Datei erstellen Consolen Befehl

Beitrag von nepos » 06.03.2009 14:51:53

Das war nur ein Beispiel, wie man su mittels -c Kommandos übergibt ;)
Sorry, id war hier wohl als Befehl etwas verwirrend. Man hätte auch su -c ls machen können, aber da sieht ja keiner, dass das als root ausgeführt wird ;)
Für deinen Zweck ist die Lösung ohne su -c eh besser. Wenn man da aufwendigere Kommandos reinpackt, kann man leicht über das teilweise nötige Escaping von Zeichen für die Shell stolpern...

Antworten