problem mit if-anweisung in sh-script

[moR-pH-euS]

Magnum P.I.
hy,
ich würde gerne automatisiert ein backup auf band erzeugen lassen (funktioniert auch). da aber der server vor ein paar wochen einmal eine kernel-panic hatte (war noch ein freebsd-5.3rc2, ist jetzt allerdings ein 5.3-release und erzeugt diesen fehler auch nicht mehr) würde ich trotzdem gerne immer eine e-mail bekommen wenn das backup durchgelaufen ist bzw. wenn das tar-kommando einen fehler erzeugt.
so schaut es nun aus:

Code:
#!/bin/sh

datum=`date '+%m%d%y'`
datum0=`date`

mkdir /raid/tar-archive/$datum
mkdir /raid/logs/$datum

tar cfyv /raid/tar-archive/$datum/angebote_$datum.tar.bz2 /raid/freigabe/angebote 2> /raid/logs/$datum/angebote.log

tar cfyv /raid/tar-archive/$datum/daten_g_$datum.tar.bz2 /raid/freigabe/daten_g  2> /raid/logs/$datum/daten_g.log

tar cfyv /raid/tar-archive/$datum/management_$datum.tar.bz2 /raid/freigabe/management 2> /raid/logs/$datum/management.log

tar cfyv /raid/tar-archive/$datum/programme_$datum.tar.bz2 /raid/freigabe/programme  2> /raid/logs/$datum/programme.log

tar cfyv /raid/tar-archive/$datum/projekte_$datum.tar.bz2 /raid/freigabe/projekte 2> /raid/logs/$datum/projekte.log

#tar cfyv /raid/tar-archive/$datum/transfer_$datum.tar.bz2 /raid/freigabe/transfer 2> /raid/logs/$datum/transfer.log

tar cfyv /raid/tar-archive/$datum/vertrieb_$datum.tar.bz2 /raid/freigabe/vertrieb  2> /raid/logs/$datum/vertrieb.log


if (`tar cv /raid/tar-archive/$datum/* 2> /raid/logs/$datum/bandsicherung.log`); then
        mutt -s "backup erfolgreich ausgefuehrt am $datum0" -a /raid/logs/$datum/bandsicherung.log sven.schleier@gmx.net  </dev/null

        else
        mutt -s "BACKUP ERZEUGTE FEHLER AM $datum0" -a /raid/logs/$datum/bandsicherung.log sven.schleier@gmx.net  </dev/null

fi

das backup funktioniert, bloss leider schickt er mir keine e-mail...
in der crontab wird es folgendermassen aufgerufen:

Code:
00      23      *       *       1-5     /home/morpheus/backup-scripts/backup-script-tar 2> /home/morpheus/testlogfile

und das steht komischerweise im teslogfile:

Code:
root@freebsd-backup# cat /home/morpheus/testlogfile
mutt: not found

das folgende script funktioniert aber auf dem gleichen system (habe testweise nur mal die if-schleife getestet):

Code:
root@freebsd-backup# cat mail_test
#! /bin/sh

datum=`date '+%m%d%y'`

if (`tar cvfy /raid/rechte-vergabe.tar.bz2 /raid/rechte-vergabe `); then
        mutt -s "backup erfolgreich ausgefuehrt am $datum0" sven.schleier@gmx.net </dev/null

        else
        mutt -s "BACKUP ERZEUGTE FEHLER AM $datum" sven.schleier@gmx.net </dev/null

fi

wenn rechte-vergabe vorhanden ist, schickt er mir eine email, dass das backup erfoglreich ausgeführt wurde, wenn ich die datei lösche und das script ausführe, schickt er mir eine e-mail mit "backup erzeugte fehler". also genauso wie ich es will...
wieso funktioniert nun das erste script nicht ?
 
Geb doch den vollständigen Pfad zum Programm (in diesem Fall "mutt" an).

MUTT=/usr/local/bin/mutt
[...]
$MUTT -s "....."
[...]
 
ok, thx. hab mal den vollständigen pfad im script eingetragen. bin ja mal gespannt ob eine e-mail morgen kommt ;-)
(will das script nicht manuell anschmeissen, da der server nicht in meiner reichweite steht und die mädels in der buchhaltung das band immer erst abends wechseln, sonst würde ich jetzt das gestrige backup überschreiben...)
 
Uuups, sorry, ich hätt erst mal auf refresh drücken sollen...

-------------------------------------------------------------

Hi,

gib im Script den absoluten Pfad zu mutt an und es sollte gehen.

CU

Martin
 
das problem hatte ich au mal, exakte pfad angaben sollten schon sein aber
das problem verbirgt sich ( zumindest bei openbsd ) an der relativen
mageren PATH Variable die im crontab definiert is und nicht auf /usr/local/bin|sbin verweist
 
bofh schrieb:
das problem hatte ich au mal, exakte pfad angaben sollten schon sein aber
das problem verbirgt sich ( zumindest bei openbsd ) an der relativen
mageren PATH Variable die im crontab definiert is und nicht auf /usr/local/bin|sbin verweist

hat die crontab nochmal eine eigene PATH-variable ? ich dachte da wird einfach die path-variable des users genommen unter der die crontab-befehle/scripte ausgeführt werden.
das würde natürlich erklären warum mein test-script das ich manuell ausführe funktioniert und das script das per cron ausgeführt wird nicht ;)
 
mutt ist nicht zum mailversenden gedacht, nimm mail(1).
Warum fuetterst du mutt mit /dev/null?
Warum um alles in der Welt stellst du den Befehl in Backticks?

if (`command`)

macht nur begrenzt Sinn.

Was spricht nochmal gegen:
Code:
tar cfy /raid/rechte-vergabe.tar.bz2 /raid/rechte-vergabe | mail -s"tar backup" sven.schleier@gmx.net
 
MrFixit schrieb:
mutt ist nicht zum mailversenden gedacht, nimm mail(1).
Warum fuetterst du mutt mit /dev/null?
mit mutt bekommt man aber per -a ein sauberes MIME attachment. (jaja, man
kann sich das auch selber basteln, aber d'uh..
Das /dev/null braucht man in der art bei mutt, da er zwar per -a ein attachment
anbuegelt, dann aber in interactive gehen wuerde, da er auf STDIN keinen
body findet. Mit /dev/null redirect bekommt man dann einen null-body und
mutt ist "happy" :->
Warum um alles in der Welt stellst du den Befehl in Backticks?
Ja, das frag ich mich auch. Voelliger ploetzinn..
 
MrFixit schrieb:
mutt ist nicht zum mailversenden gedacht, nimm mail(1).
Warum fuetterst du mutt mit /dev/null?
Warum um alles in der Welt stellst du den Befehl in Backticks?

if (`command`)

macht nur begrenzt Sinn.

Was spricht nochmal gegen:
Code:
tar cfy /raid/rechte-vergabe.tar.bz2 /raid/rechte-vergabe | mail -s"tar backup" sven.schleier@gmx.net


Natuerlich ist Mutt zum Versenden von Mail gedacht. Zu was denn sonst? Plaetzchen backen?

So, dann:

man mutt
-x Emulate the mailx compose mode.

Damit funktioniert mutt wie mailx + MIME.

Das < /dev/null macht er, weil mutt einen Messagebody erwartet, den er aber offenbar nicht senden moechte.

Eine Pipe leitet nur STDOUT um. Wenn er die Meldungen aus STDERR haben will, ist 2> vollkommen richtig.

Die Backticks sind natuerlich abenteuerlich ;-). man sh

Den Pfad der Crontab muss man uebrigens auch nicht erraten. In meiner Default /etc/crontab steht der drinne. Unter FreeBSD (bei den anderen weiss ichs nicht) existiert zudem /usr/share/examples/etc/, welches auch eine crontab enthaelt.

Ich empfehle an dieser Stelle, an PATH in der System crontab unter etc _nicht_ herumzuaendern. Das kann ggf. zu ungewollten Ergebnissen fuehren. Besser entweder in dem speziellen Skript PATH neu setzen/erweitern oder absolute Pfadangaben in den Programmaufrufen verwenden.

Ach ja, Dein Skript: Das schickt ihm eine leere Mail. Auf welchem Filedescriptor gibt tar gleich nochmal seine Fehlermeldungen aus? Die Antwort steht weiter oben.
 
die backquotes habe ich rausgenommen, da hatte ich wohl was falsch im gedächtniss, danke für den hinweis.
ansonsten läuft das script jetzt mit den absoluten pfaden. wie schon gesagt wurde, /dev/null verwende ich weil ich nur ein subject und das angehänte logfile wil und nicht mehr. ausserdem macht es ja keinen sinn bei einem script in den interactive mode zu gehen, deswegen musste ich den umgehen.
 
Mea culpa, stderr hatte ich uebersehen. Ein 2>&1 vor die Pipe reicht da ja. Warum das ganze als MIME-Attachment kommen muss, verstehe ich jetzt aber nicht.

Zu mutt: mutt ist nicht zum Mailversand gedacht. Noch nichtmal zum Mail erstellen. Verschickt werden die Mails mit sendmail, geschrieben mit $EDITOR.

Man *kann* ihn offensichtlich auch wie oben gezeigt einsetzen (das bestreite ich ja nicht), allerdings ist mutt nicht auf jedem FreeBSD installiert, mail(1) schon. Darum ging es mir eigentlich.
 
MrFixit schrieb:
Warum das ganze als MIME-Attachment kommen muss, verstehe ich jetzt aber nicht.

ein -i würde es wohl auch tun (mime brauche ich ja nicht wirklich, da hast du recht), aber als ich damals die mutt man-page gelesen habe, hatte ich es gleich mit -a probiert (steht ja gleich am anfang ;) )
 
MrFixit schrieb:
Warum das ganze als MIME-Attachment kommen muss, verstehe ich jetzt aber nicht.
Weil einfach manche Mail-Empfaenger damit mehr anfangen koennten?
Zu mutt: mutt ist nicht zum Mailversand gedacht. Noch nichtmal zum Mail erstellen. Verschickt werden die Mails mit sendmail, geschrieben mit $EDITOR.
Kleiner purist, hm?
Darum ging es mir eigentlich.
Ja, genau :-) Am Problem vorbeimosern ;-)
 
Zurück
Oben