receiverbox
Goto Top

Linux Skript Problem bei automatischer Ausführung

Hallo,

ich habe vermutlich Tomaten auf den Augen.

Ein Skript soll Bilder von Überwachungskameras aussoriteren nach Hoch/Querformat.
Das Skript funktioniert auf der Konsole einwandfrei, jedoch sobald es mit crontab gestartet wird, wird die if-Bedingung für Hochkant nie wahr.
Ich komm einfach nicht drauf....

System ist Ubuntu Server 16.04LTS auf der bash.
identify überprüft die Orientierung, bei Drehung 6 (also Hochkant) soll es in einen anderen Ordner verschoben werden.
$f ist die Datei (in ner Schleife)
$POS und $NEG sind Verzeichnisse. Mit crontab wird nur noch der negative Zweig durchlaufen, die Bedingung wird nie positiv.
Das Skript ist beim crontab desselben Users eingetragen, so dass ich unterschiedliche Umgebungen eigentlich ausschließe:

ERG=$(identify -verbose $f | grep "exif:Orientation")  

if [[ $ERG == *"Orientation: 6"* ]]; then  
        mv $f $POS
# echo "positiv" 
else
        mv $f $NEG
# echo "-" 
fi

Ideen? Danke!

Content-ID: 385639

Url: https://administrator.de/contentid/385639

Ausgedruckt am: 05.11.2024 um 23:11 Uhr

holli.zimmi
holli.zimmi 06.09.2018 um 11:05:32 Uhr
Goto Top
Hi,

was gibst Du auf der Console ein?

Gruß

Holli
receiverbox
receiverbox 06.09.2018 aktualisiert um 11:09:01 Uhr
Goto Top
Das skript ist in einer "sort.sh". Auf der Konsole starte ich es mit ./sort.sh.

Das Skript wird definitiv von crontab gestartet und auch die MV-Befehle (vom negativen Zweig) werden korrekt ausgeführt. Der postive Zwei der if wird nie betreten - deswegen hatte ich nur die Bedingung herauskopiert - dort muss meiner Meinung nach irgendwo der Wurm sein...
holli.zimmi
holli.zimmi 06.09.2018 um 11:23:07 Uhr
Goto Top
Hi,

System ist Ubuntu Server 16.04LTS auf der bash.
identify überprüft die Orientierung, bei Drehung 6 (also Hochkant) soll es in einen anderen Ordner > verschoben werden.

 ERG=$(identify -verbose $f | grep "exif:Orientation")   

Frage: Woher weist das Script ob "Hochkant" ist?

Gruß

Holli
bloodstix
bloodstix 06.09.2018 um 11:24:20 Uhr
Goto Top
Gib mal für identify den kompletten absoluten Pfad an. Path-Variable funktioniert im Crontab etwas anders!
receiverbox
receiverbox 06.09.2018 um 11:27:33 Uhr
Goto Top
Die Hochkant-Information wird in den EXIF-Informationen gespeichert.
identify holt die generellen Informtionen vom Bild raus, darunter ggf. auch die EXIF. Die entscheidnende Zeile bei Hochkant lautet "exif:Orientation: 6". Eine Exif-Information gibt es manchmal bei Querformat auch - manchmal nicht. Dann kommt keine Zeile in die ERG-Variable.

In der IF-Bedingung wird dann genauer hingesehen.

Wenn crontab startet wird auch identify aufgerufen, das hatte ich mit TOP überprüft.
receiverbox
receiverbox 06.09.2018 um 11:28:11 Uhr
Goto Top
Wurde schon getestet /usr/bin/identify und /bin/grep bringen keine Verbesserung.
bloodstix
bloodstix 06.09.2018 um 11:29:52 Uhr
Goto Top
Dann log doch mal mit, was dein Script für Werte in ERG hat, bei den einzelnen Dateien.
So mit
echo "$ERG - $f" >> /tmp/mylogfile.txt  
Und prüf mal was da so steht für Dateien die definitiv Hochkant sind.
receiverbox
receiverbox 06.09.2018 um 12:07:08 Uhr
Goto Top
Das logfile zeigt für die richtigen Files die erwartungsgemeißen Einträge. ERG scheint also auch unter Cronjob richtige Inhalte zu haben.

Was wäre dann an der Bedingung "[[ $ERG == *"Orientation: 6"* ]];" unter cronjob falsch??
bloodstix
Lösung bloodstix 06.09.2018 um 12:27:50 Uhr
Goto Top
Was sollen denn die Sternchen? Poste doch bitte mal wie das Log genau aussieht, dann kann ich dir vielleicht eine zuverlässige Methode nennen.
Bash ist bei Strings nicht so unkompliziert wie man denken würde. Solche String-Prüfungen würde ich von daher mit grep machen.
Beispiel:
if echo "$ERG" | grep -qE ".*Orientation: 6.*"; then  
   echo "Hochkant"  
else
   echo "Quer"  
fi
receiverbox
receiverbox 06.09.2018 um 12:59:34 Uhr
Goto Top
Danke geht nun auch mit Cronjob.

Aber warum versagt die Doppelklammer bei Cronjob??

Ehrlich gesagt ist das was mich bei Linuxskripten auf meisten nervt: äußerst schwierig debugging zu betreiben - gerade bei untypisierten Variablen.... Überlege ehrlich gesagt schon auf die Powershell zu wechseln (in der Hoffnung dass das Debugging mit Visual Studio effizienter läuft)
BassFishFox
BassFishFox 06.09.2018 um 13:26:00 Uhr
Goto Top
bloodstix
bloodstix 06.09.2018 aktualisiert um 14:04:18 Uhr
Goto Top
Weil deine default-Shell die bash ist und dein Skript vom Cron mit einer anderen Shell gestartet wird (ich gehe von SH aus), da sieht das dann so aus:
~$ ME=mu
~$ [[ $ME == "mu" ]] && echo yes  
sh: 2: [[: not found

Schau mal in die Mails vom root oder ins syslog, da wird der Cron sicher gemeckert haben.
receiverbox
receiverbox 06.09.2018 um 14:39:23 Uhr
Goto Top
Wie sind deine Erfahrungen? Hatte vor über einem Jahr mit einer Beta gespielt. Lief im wesentlich ganz gut - sofern die Funktionaltität unterstützt wurde. Wies aber damals einige Lücken auf.
receiverbox
receiverbox 06.09.2018 um 14:40:43 Uhr
Goto Top
Also lieber doch mit "/bin/bash /home/user/skript.sh" im crontab arbeiten?? Wäre quasi die einfacher Lösung dann gewesen?
Lochkartenstanzer
Lochkartenstanzer 06.09.2018 aktualisiert um 15:50:14 Uhr
Goto Top
Zitat von @receiverbox:

Also lieber doch mit "/bin/bash /home/user/skript.sh" im crontab arbeiten?? Wäre quasi die einfacher Lösung dann gewesen?

Einfach ein
#!/bin/bash
als erste Zeile in Deine Skripten schreiben.

Dann "weiß" das System, daß Deine Skripten mit der bash laufen müssen.

lks

PS: "shebang" ist das Stichwort zum googlen, wenn Du mehr dazu wissen willst.
bloodstix
bloodstix 06.09.2018 um 16:02:58 Uhr
Goto Top
@receiverbox: Das was @Lochkartenstanzer erwähnt: 1. Erste Zeile vom Skript #!/bin/bash
2. chmod +x /pfad/zum/skript.sh
3. In der Crontab keine Shell explizit angeben sondern nurnoch den Skriptnamen als aufzurufndes Programm angeben
juhu01
juhu01 06.09.2018 um 21:05:42 Uhr
Goto Top
auch ein "set -x" im script ist eine hilfreiche debug möglichkeit .
Dazu den Trace von stderr in ein File umleiten und alles wird gut.

servus