linux crontab führt bash shell script nicht richtig aus?
Hallo,
ich will über einen crontab eine bash shell script ausführen lassen. innerhalb des Bash shell scriptes werden Python scripte mit Pfadangaben als Argumente zur Datien die diese einlesen sollen übergeben. Danach werden im selben Verzeichniss Dateien auf Basis der eingelesenen Dateien erstellt. Zur Kontrolle habe ich innerhalb des Scriptes ein Echo befehl den ich in eine Log Datei schreiben lasse. Das Problem ist das der Echo befehl in die Log Datei geschrieben wird aber es werden nicht die Datieen erzeugt die erstellt werden sollen. Ich habe das Skript ohne crontab also manuell ./bashshellscript.sh getestet, da funktioniert es einwandfrei. Weiß jemmand woran das ligen könnte?
Das Script:
#!/bin/bash
echo 'philipstestausgabe'
sicherung=Sicherungen\_Philips\_mdm
mkdir -p $sicherung
array=()
while IFS= read -r -d $'\0'; do
array+=("$REPLY")
done < <(find . -name "*.mdm" -exec cp '{}' Sicherungen_Philips_mdm/ \; )
for var in "${array[@]}"
do
python3 Simple_XML_HLSeven_Converter.py $var $sicherung
python3 HL7_Generator.py $var $sicherung
done
der crontab
* * * * * /home/vmfr/philips/philips.sh >> /home/vmfr/philips/xy.log 2>&1
4 Antworten
Das liegt daran, dass der Aufruf des Skripts jeweils von anderen Arbeitsverzeichnissen aus geschieht. Rufst du das Skript manuell mit
./philips.sh
auf, dann ist das Arbeitsverzeichnis, sofern du den absoluten Pfad in der Crontab richtig angegeben hast:
/home/vmfr/philips
Der Cronjob wird zwar unter Voranstellung des absoluten Pfades, jedoch immer aus dem Arbeitsverzeichnis
/home/$USER
aufgerufen. Dabei ist $USER der Benutzer, mit dem du die Crontab bearbeitet hast, in deinem Fall vermutlich vmfr. Da du im Skript selbst keine absoluten Pfade angegeben hast, werden Verzeichnisse und Dateien beim Cronjob an anderer Stelle erzeugt, als bei manuellem Aufruf. Was ich auch nicht verstehe: warum hast du die Underscores hier
sicherung=Sicherungen\_Philips\_mdm
auskommentiert? Das hast du hier
done < <(find . -name "*.mdm" -exec cp '{}' Sicherungen_Philips_mdm/ \; )
ja auch nicht getan, und ist auch nicht notwendig. Also: ich gehe mal davon aus, dass das Verzeichnis Sicherungen_Philips_mdm unterhalb von /home/vmfr/philips angelegt werden soll, und dass sich auch die Dateien Simple_XML_HLSeven_Converter.py und HL7_Generator.py in diesem Verzeichnis befinden. Dann würde ich vorschlagen, das Skript wie folgt abzuändern:
#!/bin/bash
echo 'philipstestausgabe'
standort=/home/vmfr/philips
sicherung=Sicherungen_Philips_mdm
mkdir -p $standort/$sicherung
array=()
while IFS= read -r -d $'\0'; do
array+=("$REPLY")
done < <(find $standort -name "*.mdm" -exec cp '{}' $standort/Sicherungen_Philips_mdm/ \; )
for var in "${array[@]}"
do
python3 $standort/Simple_XML_HLSeven_Converter.py $var $standort/$sicherung
python3 $standort/HL7_Generator.py $var $standort/$sicherung
done
Dann sollte es bei manuellem Aufruf und beim Aufruf per Cron gleichermaßen funktionieren.
In Cron gibt es keine (oder eine andere) Path-Variable. Zu allen Programmen und Pfaden musst du also den absoulten Pfad angeben (also vom Root aus).
Im Falle von Python wäre dies dann /usr/bin/python3
sicherung=Sicherungen\_Philips\_mdm
Verwendest du auch absolute Pfade? Im Cronjob ist es gut möglich, dass der Quellpfad ein anderer ist, sodass die Pfade nicht korrekt sind.
hast du den crobtab über den befehl crontab -e editiert?
oder bist du im ordner cron.d (oder cron.daily etc)
ersteres könnte probleme haben weil ggf der sudo fehlt
zweiteres dürfte Probleme haben weil der Nutzer der den Befehl ausführt fehlt