Script per Cronjob ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Retr0
Beiträge: 4
Registriert: 07.03.2018 11:59:30

Script per Cronjob ausführen

Beitrag von Retr0 » 07.03.2018 12:08:12

Hallo liebe Community,

ich nutze Debian 9 auf einem Server ich habe ein kleines Script geschrieben das automatisiert jede Minute ausgeführt werden soll

führe ich es als Benutzer aus funktioniert es tadellos nur wenn es als Cronjob ausgeführt wird wird lediglich die .Log Datei erstellt ohne Inhalt :roll:

Code: Alles auswählen

#! /bin/bash

s_IP=1.2.3.4
c_IP=5.6.7.8
nutzer=Benutzer1
passw=password

ping -c 1 -w 1 $s_IP > /dev/null

if [ $? -eq 1 ]

        then
                ./scripts/switch_cluster_ip $c_IP/$nutzer/$passw status > /dev/null
                if [ $? -eq 7 ]
                        then
                                ./scripts/switch_cluster_ip $c_IP/$nutzer/$passw start > /dev/null
                                date +"%a %d.%m.%y %T" >> /root/cluster.log
                                echo Sekundärserver wurde zum Primärserver >> /root/cluster.log

                        else
                                exit 1
                fi
        else
                echo "Server Erreichbar" >> /root/cluster.log
                exit 0
fi

exit 0
Cronjob eintrag
/etc/crontab

Code: Alles auswählen

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
5 11    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repor                                     t /etc/cron.daily )
24 11   * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repor                                     t /etc/cron.weekly )
17 11   1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repor                                     t /etc/cron.monthly )
* *     * * *   root    ./root/scripts/server_switch.sh >> /root/cluster.log
#
/var/log/syslog

Code: Alles auswählen

Mar  7 13:13:01 h2771553 CRON[1075]: (root) CMD (./root/scripts/server_switch.sh >> /root/cluster.log)
Mar  7 13:14:01 h2771553 CRON[1081]: (root) CMD (./root/scripts/server_switch.sh >> /root/cluster.log)
Mar  7 13:15:01 h2771553 CRON[1087]: (root) CMD (./root/scripts/server_switch.sh >> /root/cluster.log)
hoffe ihr könnt mir weiterhelfen :hail:
Zuletzt geändert von Retr0 am 07.03.2018 13:19:59, insgesamt 4-mal geändert.

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

Re: Script per Cronjob ausführen

Beitrag von Meillo » 07.03.2018 12:16:18

Retr0 hat geschrieben: ↑ zum Beitrag ↑
07.03.2018 12:08:12
hoffe ihr könnt mir weiterhelfen :hail:
Wenn du uns noch eine Glaskugel schenkst, dann vielleicht. :roll:

Ohne dein Script anschauen zu koennen oder mehr Input zu haben, koennen wir bloss wild durch die Gegend raten. Bitte liefere uns also Informationen, die uns dabei helfen, dein Problem zu analysieren.
Use ed once in a while!

TomL

Re: Script per Cronjob ausführen

Beitrag von TomL » 07.03.2018 14:52:24

1. Keine relativen Pfade verwenden, sondern absolute. Der Pfad "./" ist nicht wirklich vorhersagbar.
2. Kein Start im Minutentakt via cron, sondern im Hintergrund durchlaufen lassen und mit sleep 60 zwischen den Läufen eine Pause einlegen.

Jm2c

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

Re: Script per Cronjob ausführen

Beitrag von Meillo » 07.03.2018 15:35:47

TomL hat geschrieben: ↑ zum Beitrag ↑
07.03.2018 14:52:24
Der Pfad "./" ist nicht wirklich vorhersagbar.
Genau. Dazu diese Rueckfrage fuer die Selbsterkenntnis: Welches ist das Arbeitsverzeichnis des Prozesses, der von Cron ausgefuehrt wird?


Der andere Teil der Pfadsache ist die Frage, wie $PATH gesetzt ist.


Und dann haette ich noch einen kleinen Beitrag zum Stil:
Statt:

Code: Alles auswählen

if [ $? -eq 1 ]
then
    # ... der gesamte Code ...
fi
besser so, weil das auch noch bei 15 Pruefungen funktioniert:

Code: Alles auswählen

if [ $? -eq 0 ]
then
    exit 1
fi
# ... der gesamte Code ...
(Dabei sollte man sich aber noch ueberlegen was bei einem Exitcode 2, 3, ... passieren soll. In dem Aspekt unterscheiden sich die zwei Beispiele. Was besser ist, muss fachlich entschieden werden.)
Use ed once in a while!

Retr0
Beiträge: 4
Registriert: 07.03.2018 11:59:30

Re: Script per Cronjob ausführen

Beitrag von Retr0 » 07.03.2018 15:52:10

danke für die Infos :)

das stil feedback nehme ich auch mit allerdings habe ich noch eine kurze frage dazu
besser so, weil das auch noch bei 15 Pruefungen funktioniert:
warum sollte es nicht mehr laufen ?

Ich bin absolut neu unterwegs in Linux daher bin ich um jede information dankbar die ich mitbekomme :)

TomL

Re: Script per Cronjob ausführen

Beitrag von TomL » 07.03.2018 16:13:10

Retr0 hat geschrieben: ↑ zum Beitrag ↑
07.03.2018 15:52:10
das stil feedback nehme ich auch mit
Die Formatierung ist irgendwie merkwürdig.... und der logische Zusammenhang erschließt sich erst nach dem dritten Blick. Ich würde If-Conditions besser wie folgt formatieren:

Code: Alles auswählen

if bedingung; then
   tuwas1

   if noch_ne_bedinung; then
      hol kaffee
   else
      kauf kuchen
   fi
elif zweite bedingung; then
   tuwas2
elif dritte bedingung; then
   tunix
fi
else und elif sind hinsichtlich der Logik-Hierarchie gleichrangige Alternativen zur ersten if-Bedingung, also würde ich die auch vertikal gleichrangig ausrichten.Mit anderen Worten, das kurze Code-Paket würde ich so schreiben... beachte "/Vollerpfad" ... den Rest kann man aber auch als Geschmacksache abtun.

Code: Alles auswählen

if [ $? -eq 1 ]; then
    /Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw status > /dev/null

    if [ $? -eq 7 ]; then
        /Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw start > /dev/null
        date +"%a %d.%m.%y %T" >> /root/cluster.log
        echo Sekundärserver wurde zum Primärserver >> /root/cluster.log
    else
        exit 1
    fi
else
    echo "Server Erreichbar" >> /root/cluster.log
    exit 0
fi

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

Re: Script per Cronjob ausführen

Beitrag von Meillo » 07.03.2018 18:16:04

Retr0 hat geschrieben: ↑ zum Beitrag ↑
07.03.2018 15:52:10
das stil feedback nehme ich auch mit allerdings habe ich noch eine kurze frage dazu
besser so, weil das auch noch bei 15 Pruefungen funktioniert:
warum sollte es nicht mehr laufen ?
Der Computer kann das schon noch richtig verarbeiten, aber es tauchen Probleme von und fuer Programmierer auf.

Wenn du 15 Positiv-Pruefungen hast, dann ist am Ende der ganze Hauptteil des Codes 15 Ebenen tief eingerueckt. Nicht nur, dass das zu sehr langen Zeilen fuehrt (da muss man dann schon fast auf nur zwei Spaces Einrueckung runter gehen), der Code wird auch schwerer verstaendlich.

Um Code vollstaendig zu verstehen, muss man allen State und alle Pfade durch den Code im Kopf haben. Bei einem 15-fach verschachtelten If muss ich diese 15 Bedinungen im Kopf halten, bis ich zum Hauptteil des Codes komme. Falls ich bei einer Bedingung rausfalle, muss ich bis hinter den Hauptcodeteil springen, um zu sehen, was dann passiert. Sehr viel leichter verstaendlich finde ich es, Fehlerfaelle per Negativ-Pruefungen ``auszusieben''. (Das ist der C-Stil, im Gegensatz zum Pascal-Stil.) Das fuehrt dazu, dass der ganze Hauptteil des Codes gar nicht eingerueckt werden muss. (Geringe Einruecktiefe des Codes ist fuer mich ein Indiz fuer leicht verstaendlichen Code.) Wenn ich die Bedinungen durchgehe, dann muss ich jeweils nur genau eine im Kopf haben, deren Fehlermeldung und der Exit/Return genau in den Zeilen danach steht. Anschliessend kann ich diesen Fall im Kopf wieder vergessen. Das erfordert IMO weniger ``Arbeitsspeicher'' im Kopf. Ausserdem fueht das Einfuegen einer neuen Bedinung nur zu einem kleinen, in sich abgeschlossenen neuen If im Code. Im anderen Fall wuerde durch die neue Bedingung der gesamte Hauptcodeteil eine Stufe weiter eingerueckt werden und die Pruefung und ihre Fehlerbehandlung liegen als Klammer um Hauptteil weit auseinander. Da macht das Changeset-Lesen wenig Spass ...

Der C-Stil ist auch insofern robuster, dass die Wahrscheinlichkeit unerwuenschter zusaetzlicher Pfade im Code (die normalerweise Bugs in unbedachten Sonderfaellen bedeuten) geringer ist. Das jedenfalls sind meine Erfahrungen mit Code in den beiden Stilen.
Use ed once in a while!

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

Re: Script per Cronjob ausführen

Beitrag von Meillo » 07.03.2018 18:22:07

TomL hat geschrieben: ↑ zum Beitrag ↑
07.03.2018 16:13:10

Code: Alles auswählen

if [ $? -eq 1 ]; then
    /Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw status > /dev/null

    if [ $? -eq 7 ]; then
        /Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw start > /dev/null
        date +"%a %d.%m.%y %T" >> /root/cluster.log
        echo Sekundärserver wurde zum Primärserver >> /root/cluster.log
    else
        exit 1
    fi
else
    echo "Server Erreichbar" >> /root/cluster.log
    exit 0
fi
Als Beispiel, der semantisch identische Code in dem was ich C-Stil nenne:

Code: Alles auswählen

if [ $? -ne 1 ]; then
	echo "Server Erreichbar" >> /root/cluster.log
	exit 0
fi

/Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw status > /dev/null
if [ $? -ne 7 ]; then
	exit 1
fi

/Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw start > /dev/null
date +"%a %d.%m.%y %T" >> /root/cluster.log
echo Sekundärserver wurde zum Primärserver >> /root/cluster.log
Use ed once in a while!

TomL

Re: Script per Cronjob ausführen

Beitrag von TomL » 07.03.2018 18:26:55

Was dann etwa so aussehen könnte:

Code: Alles auswählen

if [ $? -ne 1 ]; then
    echo "Server Erreichbar" >> /root/cluster.log
    exit 0
fi

/Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw status > /dev/null
[[ $? -ne 7 ]] && exit 1

/Vollerpfad/scripts/switch_cluster_ip $c_IP/$nutzer/$passw start > /dev/null
date +"%a %d.%m.%y %T" >> /root/cluster.log
echo Sekundärserver wurde zum Primärserver >> /root/cluster.log

@Meillo
oh shit... jetzt warste mit dem Edit ja doch noch schneller... :mrgreen:

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

Re: Script per Cronjob ausführen

Beitrag von Meillo » 07.03.2018 22:38:37

TomL hat geschrieben: ↑ zum Beitrag ↑
07.03.2018 18:26:55
@Meillo
oh shit... jetzt warste mit dem Edit ja doch noch schneller... :mrgreen:
Man gibt sein Bestes. ;-)
Use ed once in a while!

Retr0
Beiträge: 4
Registriert: 07.03.2018 11:59:30

Re: Script per Cronjob ausführen

Beitrag von Retr0 » 08.03.2018 09:22:13

Danke für die Hilfe hat funktioniert mit den Vollpfaden :THX:

Die Tipps für den Stil werde ich mal ausprobieren :)

Antworten