Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 27.03.2024 01:40:45

Hallo Gemeinde
Ich schnalls gerade total nicht mehr.

Script 1 (game_reboot.sh):

Code: Alles auswählen

#!/bin/bash

anzahl_user=0
while IFS= read -r line
do
    if [ "$line" != "robot" ] && [ "$line" != "roboteasy" ] && [ "$line" != "-" ]; then
        ((anzahl_user=anzahl_user+1))
    fi
done < user_liste.txt
if [ "$anzahl_user" -eq 0 ]; then
    killall -9 python3
    killall -9 robot.py
    killall -9 roboteasy.py
    killall -9 game_server.py
    date +"%F %T Game Reboot ausgefuehrt. Anzahl User: $anzahl_user" >> /home/galaxis/log/galaxis_log.txt
else
    date +"%F %T Game Reboot NICHT ausgefuehrt. Anzahl User: $anzahl_user" >> /home/galaxis/log/galaxis_log.txt
fi
Script 2 (robofehler.sh):

Code: Alles auswählen

#!/bin/bash

strich_vorhanden=false
anzahl_user=0
while IFS= read -r line
do
    if [ "$line" == "-" ]; then
        strich_vorhanden=true
    fi
    if [ "$line" != "robot" ] && [ "$line" != "roboteasy" ] && [ "$line" != "-" ]; then
        ((anzahl_user=anzahl_user+1))
    fi
done < user_liste.txt
if [ "$anzahl_user" -eq 0 ] && [ $strich_vorhanden == true ]; then
    killall -9 robot.py
    killall -9 roboteasy.py

    date +"%F %T Robot Reboot ausgefuehrt. Anzahl User: $anzahl_user" >> /home/galaxis/log/robot_neustart.log
else
    date +"%F %T Robot Reboot NICHT ausgefuehrt. Anzahl User: $anzahl_user" > /dev/null
fi
Beide Scripts laufen bei Direktaufruf über die Konsole.
Werden sie per Cron aufgerufen, läuft Script 1 problemlos.
Script 2 läuft sicher bis zur Zeile 4 (hab ich mit einer echo Ausgabe in eine Datei getestet). Bei Zeile 7 in der while Schleife kommt es nie an.
"service crond restart" hab ich auch schon ausgeführt.
Was ist da los?

PS:
Zur Koplettierung, hier noch der Cron:

Code: Alles auswählen

*/5 * * * * /home/galaxis/robofehler.sh &
1 3 * * 2 /home/galaxis/game_reboot.sh & > /home/galaxis/log/game_reboot.log
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von Meillo » 27.03.2024 08:00:09

Die Datei user_liste.txt braucht einen absoluten Pfad. Cronjobs werden aus einem Systemverzeichnis heraus ausgefuehrt.
Use ed once in a while!

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 27.03.2024 09:11:47

Ok. aber warum funktioniert das Script 1? Das ist genau gleich!
Das Script 2 beendet wie beschrieben zwischen Zeile 4 und 7.
Und da wird die txt noch nicht angesprochen.
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von Meillo » 27.03.2024 09:17:45

Ganz einfach:

Wenn es beim ersten Script die Datei nicht gibt, dann ist `anzahl_user' weiterhin 0 und das untere If wird ausgefuehrt.

Wenn dagegen im zweiten Script die Datei nicht da ist, dann bleibt `strich_vorhanden' false und das untere If wird *nicht* ausgefuehrt.

Beide Scripte funktionieren wie erwartet. Das Problem ist lediglich, dass die Datei user_liste.txt nicht dort liegt, wo das Script (innerhalb von Cron) sie erwartet.
Use ed once in a while!

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 27.03.2024 09:24:25

Ich steh auf dem Schlauch.
anzahl_user ist eine Variable...
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von tobo » 27.03.2024 09:29:47

Das kann schon mit diesen relativen Angaben zum Dateinamen funktionieren: Gib' dir mal in beiden Skripten $PWD aus (in der 2. Zeile) ...

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 27.03.2024 09:34:43

Wenn, dann user_liste.txt

Code: Alles auswählen

#!/bin/bash

strich_vorhanden=false
anzahl_user=0
while IFS= read -r line
do
    if [ "$line" == "-" ]; then
        strich_vorhanden=true
    fi
    if [ "$line" != "robot" ] && [ "$line" != "roboteasy" ] && [ "$line" != "-" ]; then
        ((anzahl_user=anzahl_user+1))
    fi
done < /home/galaxis/user_liste.txt
if [ "$anzahl_user" -eq 0 ] && [ $strich_vorhanden == true ]; then
    killall -9 robot.py
    killall -9 roboteasy.py

    date +"%F %T Robot Reboot ausgefuehrt. Anzahl User: $anzahl_user" >> /home/galaxis/log/robot_neustart.log
else
    date +"%F %T Robot Reboot NICHT ausgefuehrt. Anzahl User: $anzahl_user" > /dev/null
fi
probier ich jetzt mal aus.
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 27.03.2024 09:45:41

Ich glaub's jetzt nicht.
So geht's.
Aber warum das eine Script so lief und das Andere nicht, ist mir ein Rätsel.
Vielen Dank
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

niemand
Beiträge: 499
Registriert: 22.12.2023 16:35:53
Kontaktdaten:

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von niemand » 27.03.2024 09:50:39

Tipp für die Leute, die hier zu helfen versuchen: TE löscht auch mal gerne den Kontext und macht damit die von euch reingesteckte Zeit und Arbeit quasi wertlos: viewtopic.php?p=1357952#p1357921 → ich würde hier nichts investieren.
„I fought in the Vim-Emacs-War.“ Quelle

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 27.03.2024 10:06:58

Thx @tobo
Ich schnallte es total nicht mehr ^^
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von tobo » 27.03.2024 11:38:18

treki hat geschrieben: ↑ zum Beitrag ↑
27.03.2024 09:45:41
Aber warum das eine Script so lief und das Andere nicht, ist mir ein Rätsel.
Das Arbeitsverzeichnis des Benutzers, der den Cronjob ausführt, wird auf das Heimverzeichnis eben dieses Benutzers gesetzt. Somit kann man auch die Schleife lokal mit dieser Datei befüllen, sofern die Datei im Heimverzeichnis des ausführenden Benutzers liegt. Wenn also die Datei wirklich nicht gelesen wurde, dann ist anzunehmen, dass hier z.B. zwei unterschiedliche Crontabs (2 unterschiedliche Benutzer) am Werk waren!? Wie man so was grundsätzlich umgeht/verbessert, hast du schon mitbekommen - man gibt die Datei voll qualifiziert mit Pfad an.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von Meillo » 27.03.2024 11:53:56

tobo hat geschrieben: ↑ zum Beitrag ↑
27.03.2024 11:38:18
Wenn also die Datei wirklich nicht gelesen wurde, dann ist anzunehmen, dass hier z.B. zwei unterschiedliche Crontabs (2 unterschiedliche Benutzer) am Werk waren!?
Wie ich oben schon dargelegt habe, arbeiten beide Scripte korrekt und beide sind auch normal gelaufen. Das gezeigte Verhalten ist das zu erwartende Verhalten wenn die Datei leer bzw. nicht gefunden ist.
Use ed once in a while!

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von tobo » 27.03.2024 12:03:39

Ich habe nur die alternative Fehlermöglichkeit angegeben - für Leute, die glauben, dass $PATH die einzige relative Quelle ist!

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 27.03.2024 14:43:56

Danke Jungs.
Nun ist alles klar. Wusste zwar, dass man absolute Pfade angeben muss beim Cron, aber dieses Detail hatte ich übersehn.

PS:
Wenn wir schon dabei sind;
Ist es bei einem Python Script das Gleiche?
Also wird das home Verzeichnis des Cron ausführenden Users als Grundlage genommen?
Wie kann man im Cron mitgeben, dass das Script die gleichen Grundverzeichnisse hat wie ein Mensch an der Konsole hat?
Ich meine zBsp ein Befehl wie sed. Im Cron aufgeruften Script muss man /usr/bin/sed eingeben.
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

rhHeini
Beiträge: 2312
Registriert: 20.04.2006 20:44:10

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von rhHeini » 27.03.2024 15:28:26

Workaround: im Skript in der zweiten Zeile den Pfad definieren.

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von treki » 06.04.2024 04:40:30

Also nach dem Shebang einfach
/usr/bin
eingeben?
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

rhHeini
Beiträge: 2312
Registriert: 20.04.2006 20:44:10

Re: Merkwürdiges Verhalten bei Cronaufruf eines bash Scripts

Beitrag von rhHeini » 06.04.2024 21:31:18

Nö. Dazu muss man eine vollwertige PATH-Anweisung ins Skript reinschreiben. z.B.:

Code: Alles auswählen

PATH=/bin:/sbin:/usr/bin:/usr/sbin:

Antworten