OSX/Bash: Kommando aus Variable, nicht nachvollziehbare Fehler

17/01/2013 - 10:01 von Daniel Meszaros | Report spam
Hallo,

ich habe ein Backup-Script, das sich àußerst merkwürdig verhàlt.
Vielleicht könnte Ihr mir einen Tipp geben, was da schief làuft...

Ich pflege es immer so, am Anfang eines Scripts die benötigten Kommandos
in Variablen zu packen. Das erleichtert die spàtere Übernahme und
Anpassung auf andere Systeme, in denen die Pfade ggf. anders sind. Ich
weiß, hier scheiden sich die Geister, aber genau hier liegt nun auch
mein Problem.

Das Script soll die Daten des CalDAV-Servers von Mac OS 10.6.8 sichern.

Das Script sieht wie folgt aus...

-
#!/bin/bash
TAR=$(which tar)
TARPARAMS="czf"
SERVERADMIN=$(which serveradmin)
VOLUME="/"
PFAD="_backups/"
BACKUP_CAL="_Backup_CalendarServer.tgz"
JETZT=$(date +"%Y-%m-%d_%H-%M")
LOGDATEI="${VOLUME}${PFAD}${JETZT}.log"
EMAIL="ich@hier.da"

if [ -d ${VOLUME}${PFAD} ]; then
{
echo "-"
echo "Erstelle CalendarServer Backup"
$SERVERADMIN stop calendar
$TAR $TARPARAMS ${VOLUME}${PFAD}${JETZT}${BACKUP_CAL}
/Library/CalendarServer/Documents
du -h ${VOLUME}${PFAD}${JETZT}${BACKUP_CAL}
$SERVERADMIN start calendar
echo "-"
ORDNERGROESSE=$(du -h ${VOLUME}${PFAD} | cut -f 1)
echo "Groesse des Backup Ordners \"${VOLUME}${PFAD}\": $ORDNERGROESSE"
VOLUMEFREI=$(df -h $VOLUME | awk 'FNR == 2 {print $4}')
echo "Verleibender Speicherplatz auf \"$VOLUME\" : $VOLUMEFREI"
echo "-"
} >> $LOGDATEI 2>&1
else
{
echo "-"
echo " Konnte \"${VOLUME}${PFAD}\" nicht finden!"
echo " Bitte pruefen!"
echo "-"
} >> $LOGDATEI 2>&1
fi

mail -s "$JETZT - Backup CalendarServer" $EMAIL < $LOGDATEI
-

Wird dieses Script mittels "sudo ./script" direkt aus dem Terminal
abgefeuert, funktioniert alles prima.

Führe ich das Script jedoch per Cronjob aus, so bleibt die Variable
$SERVERADMIN leer. Wàhrenddessen wird $TAR jedoch sauber ausgeführt.

Definiere ich $SERVERADMIN fest...

SERVERADMIN="/usr/sbin/serveradmin"

...dann funktioniert es hingegen.

Wie gesagt: "$(which serveradmin)" funktioniert beim direkten Aufruf,
nicht jedoch beim Aufruf als Cronjob, wàhrend "$(which tar)" sowohl
direkt als auch als Cronjob tut, was es soll.

Achso, und:
# bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Copyright (C) 2007 Free Software Foundation, Inc.

CU,
Mészi.
 

Lesen sie die antworten

#1 Thomas Kempkes
17/01/2013 - 10:50 | Warnen spam
Daniel Meszaros wrote:
Hallo,

ich habe ein Backup-Script, das sich àußerst merkwürdig verhàlt.
Vielleicht könnte Ihr mir einen Tipp geben, was da schief làuft...

Ich pflege es immer so, am Anfang eines Scripts die benötigten Kommandos
in Variablen zu packen. Das erleichtert die spàtere Übernahme und
Anpassung auf andere Systeme, in denen die Pfade ggf. anders sind. Ich
weiß, hier scheiden sich die Geister, aber genau hier liegt nun auch
mein Problem.

Das Script soll die Daten des CalDAV-Servers von Mac OS 10.6.8 sichern.



Ich vermute stark, dass dein Problem mit den unterschiedlichen
Umgebungen (sprich: die Variable $PATH wird anders gesetzt sein) zu tun
hat. In deiner normalen Shell ist das Verzeichnis /usr/sbin/ in deinem
Suchpfad enthalten - vom cron-Service ausgeführte Skripte erhalten eine
andere Umgebung. Du müsstest im Kopf deines Skriptes entweder von Hand
die PATH-Variable erweitern (z.B. PATH=$PATH:/usr/sbin) oder die kannst
in der cronjob-Datei oben diese Variable für alle weiteren aufgerufenen
Skripte erweitern.

BYe Thomas

Das Script sieht wie folgt aus...

-
#!/bin/bash
TAR=$(which tar)
TARPARAMS="czf"
SERVERADMIN=$(which serveradmin)
VOLUME="/"
PFAD="_backups/"
BACKUP_CAL="_Backup_CalendarServer.tgz"
JETZT=$(date +"%Y-%m-%d_%H-%M")
LOGDATEI="${VOLUME}${PFAD}${JETZT}.log"
EMAIL=""

if [ -d ${VOLUME}${PFAD} ]; then
{
echo "-"
echo "Erstelle CalendarServer Backup"
$SERVERADMIN stop calendar
$TAR $TARPARAMS ${VOLUME}${PFAD}${JETZT}${BACKUP_CAL}
/Library/CalendarServer/Documents
du -h ${VOLUME}${PFAD}${JETZT}${BACKUP_CAL}
$SERVERADMIN start calendar
echo "-"
ORDNERGROESSE=$(du -h ${VOLUME}${PFAD} | cut -f 1)
echo "Groesse des Backup Ordners \"${VOLUME}${PFAD}\": $ORDNERGROESSE"
VOLUMEFREI=$(df -h $VOLUME | awk 'FNR == 2 {print $4}')
echo "Verleibender Speicherplatz auf \"$VOLUME\" : $VOLUMEFREI"
echo "-"
} >> $LOGDATEI 2>&1
else
{
echo "-"
echo " Konnte \"${VOLUME}${PFAD}\" nicht finden!"
echo " Bitte pruefen!"
echo "-"
} >> $LOGDATEI 2>&1
fi

mail -s "$JETZT - Backup CalendarServer" $EMAIL < $LOGDATEI
-

Wird dieses Script mittels "sudo ./script" direkt aus dem Terminal
abgefeuert, funktioniert alles prima.

Führe ich das Script jedoch per Cronjob aus, so bleibt die Variable
$SERVERADMIN leer. Wàhrenddessen wird $TAR jedoch sauber ausgeführt.

Definiere ich $SERVERADMIN fest...

SERVERADMIN="/usr/sbin/serveradmin"

...dann funktioniert es hingegen.

Wie gesagt: "$(which serveradmin)" funktioniert beim direkten Aufruf,
nicht jedoch beim Aufruf als Cronjob, wàhrend "$(which tar)" sowohl
direkt als auch als Cronjob tut, was es soll.

Achso, und:
# bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Copyright (C) 2007 Free Software Foundation, Inc.

CU,
Mészi.





BYe Thomas

Curse of the Day:
"May you be involved in a lawsuit in which you know you are right."

Ähnliche fragen