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-Key: 385639

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

Printed on: May 6, 2024 at 07:05 o'clock

Member: holli.zimmi
holli.zimmi Sep 06, 2018 at 09:05:32 (UTC)
Goto Top
Hi,

was gibst Du auf der Console ein?

Gruß

Holli
Member: receiverbox
receiverbox Sep 06, 2018 updated at 09:09:01 (UTC)
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...
Member: holli.zimmi
holli.zimmi Sep 06, 2018 at 09:23:07 (UTC)
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
Member: bloodstix
bloodstix Sep 06, 2018 at 09:24:20 (UTC)
Goto Top
Gib mal für identify den kompletten absoluten Pfad an. Path-Variable funktioniert im Crontab etwas anders!
Member: receiverbox
receiverbox Sep 06, 2018 at 09:27:33 (UTC)
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.
Member: receiverbox
receiverbox Sep 06, 2018 at 09:28:11 (UTC)
Goto Top
Wurde schon getestet /usr/bin/identify und /bin/grep bringen keine Verbesserung.
Member: bloodstix
bloodstix Sep 06, 2018 at 09:29:52 (UTC)
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.
Member: receiverbox
receiverbox Sep 06, 2018 at 10:07:08 (UTC)
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??
Member: bloodstix
Solution bloodstix Sep 06, 2018 at 10:27:50 (UTC)
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
Member: receiverbox
receiverbox Sep 06, 2018 at 10:59:34 (UTC)
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)
Member: BassFishFox
BassFishFox Sep 06, 2018 at 11:26:00 (UTC)
Goto Top
Member: bloodstix
bloodstix Sep 06, 2018 updated at 12:04:18 (UTC)
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.
Member: receiverbox
receiverbox Sep 06, 2018 at 12:39:23 (UTC)
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.
Member: receiverbox
receiverbox Sep 06, 2018 at 12:40:43 (UTC)
Goto Top
Also lieber doch mit "/bin/bash /home/user/skript.sh" im crontab arbeiten?? Wäre quasi die einfacher Lösung dann gewesen?
Member: Lochkartenstanzer
Lochkartenstanzer Sep 06, 2018 updated at 13:50:14 (UTC)
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.
Member: bloodstix
bloodstix Sep 06, 2018 at 14:02:58 (UTC)
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
Member: juhu01
juhu01 Sep 06, 2018 at 19:05:42 (UTC)
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