[gelöst]Kill Befehl im Shell Script via Cron ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

[gelöst]Kill Befehl im Shell Script via Cron ausführen

Beitrag von HelsAett » 17.08.2022 13:03:49

Warum das Script? Fehler, der einen Neustart vom Tomcat verlangt. Der Fehler tritt immer um kurz nach 10:35 Uhr auf, daher kommt das Ganze in die Crontab.
Es läuft ein Dienst im Tomcat, der jede Minute in die catalina.out schreibt, ob er gerade läuft oder nicht. Nur wenn dieser Dienst nicht läuft darf der Tomcat beendet werden. Daher wie while true schleife.

Problem: Wenn ich den Tomcat versuche zu killen, funktioniert es beim manuellen Aufruf des Scripts wunderbar. Beim Versuch per Crontab, scheint das Kill nicht mehr zu funktionieren, der Tomcat läuft einfach weiter.
Crontab läuft unter den gleichen User, unter dem ich das Script erfolgreich manuell ausführen kann.

Zusatz Info um die Frage vorweg zu nehmen: Wenn ich Anstelle von Kill das reguläre shutdown.sh von meinen Script aus heraus aufrufe, bleibt das shutdown.sh in einer schleife hängen, daher dachte ich mir, ich kill den Tomcat direkt. Generel scheint Crontab true Schleife und Kill nicht so gute freunde zu seien, den Kill bewirkt in dieser Kombi auch immer das mein Script an dieser Stelle aussteigt, so dass ich den Neustart des Tomcats in ein extra Script schon ausgelagert habe.

Jemand eine Idee was hier los ist?

Code: Alles auswählen

#!/bin/bash 
logpath="/opt/tomcat/logs/catalina.out"
date=$(date -d "yesterday" '+%Y-%m-%d')

if [[ $(zgrep "Problem" "${logpath}") ]]; then
        echo "Problem"
        while [ true ]
        do
        currentTime=$(date "+%F %R")
        Maintainable=$(grep "${currentTime}" "${logpath}" | grep problem | grep -o yes)
        if [[ "$Maintainable" == yes ]]; then
            echo "Maintainable Tomcat stoppt"
		    PID=$(ps -ef | grep tomcat | grep -v grep | grep -v shutdown |  awk '{print $2}')
		    kill $PID
		    sleep 0.5
		    kill -9 $PID
		    sleep 0.5
		    echo "Problem Tomcat beenden"
                    break;
        else
            echo -e "Nicht Stoppen, Dienst läuft gerade"
            sleep 0.5
        fi
        done
else
        echo "keine Problem"
        exit;
fi
Zuletzt geändert von HelsAett am 17.08.2022 16:35:04, insgesamt 2-mal geändert.

Benutzeravatar
oln
Beiträge: 537
Registriert: 05.01.2021 09:41:24

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von oln » 17.08.2022 13:34:31

Moin,
mal im syslog nachgeschaut ob der cronjob einen Fehler ausgibt?
Gruß Ole
AbuseIPDB

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

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von Meillo » 17.08.2022 14:33:57

Ich wuerde auch mal mit Debuggen anfangen, damit man im Syslog oder einen separaten Logfile, in das dein Script schreibt, sehen kann was wirklich passiert.

Wird es ueberhaupt aufgerufen? Wie hast du es als Cronjob eingetragen? (In /etc/cron.* duerfen die Scripte keine Punkte im Dateinamen haben.)

Ich sehe in deinem Script keinen Shebang. Der sollte auf /bin/bash lauten, weil du Bashisms verwendest und Cron die Scripte sonst ggf. mit /bin/sh startet.
Use ed once in a while!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von HelsAett » 17.08.2022 15:10:16

Im Code das Fehlende #!/bin/bash war copy&paste fehler. Ist vorhanden.
Cronjob laut /var/log/cron wird dieser auch gestartet, finde da auch keinen Fehler im log um diese Zeit.
Verbaut im Cron ist es wie folgt:
35 14 * * * fgrep -q "ENV=tst" /etc/profile && /opt/scripts/stop-pm-tomcat-fix.sh
der Punkt hier im Namen sollte nicht stören, andere shellscripte mit .sh im cron laufen auch. Syntax ist ebenfalls in anderen Cronjobs so vorhanden und funktioniert. Ich vermute da eher den Fehler im Script selbst.

Benutzeravatar
stollenreiter
Beiträge: 402
Registriert: 10.08.2004 16:30:47
Wohnort: Bremen

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von stollenreiter » 17.08.2022 15:18:22

Moin.

Und in der /etc/profile steht auch "ENV=tst" drin?

Gruß Andreas
Gruß Stollenreiter
wat mutt, dat mutt
Mein Jakobsweg heißt Darb al-Arba'in

Benutzeravatar
Tintom
Moderator
Beiträge: 3064
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von Tintom » 17.08.2022 15:24:44

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 13:03:49
Warum das Script? Fehler, der einen Neustart vom Tomcat verlangt. Der Fehler tritt immer um kurz nach 10:35 Uhr auf, daher kommt das Ganze in die Crontab.
Ich hätte hier eher den Dienst an sich debuggt.
...ich den Neustart des Tomcats in ein extra Script ausgelagert...
Aber das Skript gibt es doch schon -> systemctl restart tomcat9.service
HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 13:03:49
Problem: Wenn ich den Tomcat versuche zu killen, funktioniert es beim manuellen Aufruf des Scripts wunderbar. Beim Versuch per Crontab, scheint das Kill nicht mehr zu funktionieren, der Tomcat läuft einfach weiter.
Crontab läuft unter den gleichen User, unter dem ich das Script erfolgreich manuell ausführen kann.
Vermutlich, weil laut der systemd-Unit der Dienst als User tomcat ausgeführt wird. Als normaler User führt der Kill-Aufruf dann ins Nirvana.

Code: Alles auswählen

PID=$(ps -ef | grep tomcat | grep -v grep | grep -v shutdown |  awk '{print $2}')
Mit dem Grep-Konstrukt hast du übrigens die PID deines Bash-Skriptes abgegriffen, deswegen beendet sich das regelmäßig. Die Regel greift alles mit „tomcat“ ab. Entweder du benennst dein Skript um oder du verwendest andere Hilfsmittel wie pidof tomcat oder pgrep um die PID abzugreifen. Besser geeignet wäre hier vielleicht auch pkill.

Weiterhin scheinst du sehr ungeduldig zu sein:

Code: Alles auswählen

kill $PID
sleep 0.5
kill -9 $PID
sleep 0.5
Gib' dem Programm etwas Zeit um sich zu beenden. Erst wenn das schiefläuft, kannst du ihn endgültig abschießen :wink:

Was ich auch nicht verstehe: Du verwendest grep und zgrep auf die gleiche Datei. Nun kann zgrep auch nicht-komprimierte Dateien durchsuchen, andersrum wird's aber nichts. Bedeutet: In diesem Fall wird deine Variable nicht gesetzt.
... das reguläre shutdown.sh von meinen Script aus heraus aufrufe...
Entweder hast du ein ziemlich altes Debian oder die letzten Jahre sind an dir vorbei gezogen :mrgreen:
$ ls -n /sbin/shutdown
lrwxrwxrwx 1 0 0 14 Jul 8 2021 /sbin/shutdown -> /bin/systemctl

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

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von Meillo » 17.08.2022 15:26:45

(Ungeachet Tintoms hoeherwertiger Antwort ...)

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 15:10:16
Cronjob laut /var/log/cron wird dieser auch gestartet, finde da auch keinen Fehler im log um diese Zeit.
Dann kannst du ja Debug-Ausgaben deines Scripts pruefen, um herauszufinden, welchen Pfad die Ausfuehrung im Script verwendet. Kommt es also ueberhaupt am kill-Befehl vorbei?
Use ed once in a while!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von HelsAett » 17.08.2022 15:55:57

Vielen Dank @ll für die zahlreichen Tipps.
Der Fehler war, dass der cron die PATH Variable nicht kannte bzw. diese Leer war, somit konnten Befehle im Script mangels nicht auffindbaren Programm nicht ausgeführt werden.
Warum der cron die PATH Variablen nicht hatte, muss ich nochmal rausfinden, jedenfalls mit PATH oder auch mit kompletten Pfad zu den Tools "grep ps kill & co" gehts.

@Mods Post kann als gelöst markiert und geschlossen werden. Danke Euch

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

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von Meillo » 17.08.2022 16:09:58

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 15:55:57
Vielen Dank @ll für die zahlreichen Tipps.
Der Fehler war, dass der cron die PATH Variable nicht kannte bzw. diese Leer war, somit konnten Befehle im Script mangels nicht auffindbaren Programm nicht ausgeführt werden.
Warum der cron die PATH Variablen nicht hatte, muss ich nochmal rausfinden, jedenfalls mit PATH oder auch mit kompletten Pfad zu den Tools "grep ps kill & co" gehts.
Standardmaessig sollte PATH in Cron auf ``/usr/bin:/bin'' stehen:
Manpage crontab(5) hat geschrieben: Several environment variables are set up automatically by
the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME
and HOME are set from the /etc/passwd line of the
crontab's owner. PATH is set to "/usr/bin:/bin". [...]
Darum sollten die von dir erwaehnten Tools und was ich sonst so in deinem Script gesehen habe, eigentlich gefunden werden. (`kill' ist zudem normalerweise ein Shell-Builtin, auch in /bin/sh.)

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 15:55:57
@Mods Post kann als gelöst markiert und geschlossen werden.
Das kannst du sogar selber machen: Einfach den ersten Post im Thread editieren und dort den Titel anpassen. ;-)
Use ed once in a while!

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

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von tobo » 17.08.2022 16:15:11

Tintom hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 15:24:44
... das reguläre shutdown.sh von meinen Script aus heraus aufrufe...
Entweder hast du ein ziemlich altes Debian oder die letzten Jahre sind an dir vorbei gezogen :mrgreen:
$ ls -n /sbin/shutdown
lrwxrwxrwx 1 0 0 14 Jul 8 2021 /sbin/shutdown -> /bin/systemctl
Oder HelsAett meint z.B. was anderes:

Code: Alles auswählen

$ apt-file search shutdown.sh | grep tomcat
tomcat9-common: /usr/share/tomcat9/bin/shutdown.sh

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von HelsAett » 17.08.2022 16:34:44

Danke nochmals für die vielen tollen Tipps!
PID=$(ps -ef | grep tomcat | grep -v grep | grep -v shutdown | awk '{print $2}')
Mit dem Grep-Konstrukt hast du übrigens die PID deines Bash-Skriptes abgegriffen, deswegen beendet sich das regelmäßig.
deswegen das "grep -v grep"
Besser geeignet wäre hier vielleicht auch pkill.
ja den Tipp nehme ich mir mit. Danke
Gib' dem Programm etwas Zeit um sich zu beenden. Erst wenn das schiefläuft, kannst du ihn endgültig abschießen :wink:
Geht leider nicht, die While Schleife drum herum verrät es vielleicht schon. Ich hab da eine Abhängigkeit, die ich selbst nicht Auflösen kann. Ein Dienst der nicht laufen darf und der im Minuten Takt meldet ob läuft oder nicht.
Was ich auch nicht verstehe: Du verwendest grep und zgrep auf die gleiche Datei. Nun kann zgrep auch nicht-komprimierte Dateien durchsuchen, andersrum wird's aber nichts
Ist im Script nicht zu erkennen aber ja die eine Prüfung geht auf eine gezippte Datei. Bisschen Datenschutz und so, ich hab in den Post natürlich bisschen was angepasst.
Entweder hast du ein ziemlich altes Debian oder die letzten Jahre sind an dir vorbei gezogen :mrgreen:
Das Problem hab ich nicht auf meinem privaten Rechner ;) daher sind Dinge wie Debugging von Fehlern oder Änderungen am Code oder System Konfigurationen, nicht mal eben Möglich. Also muss ein Workaround her aber ich gebe das Feedback an die entsprechenden Stellen gerne weiter :mrgreen:
Das kannst du sogar selber machen: Einfach den ersten Post im Thread editieren und dort den Titel anpassen. ;-)
Ah, ich dachte man kann den Thread sperren aber das mit den Titel Anpassen bekomme ich hin. Danke nochmal an Alle.

mludwig
Beiträge: 807
Registriert: 30.01.2005 19:35:04

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von mludwig » 17.08.2022 17:07:37

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 16:34:44
Danke nochmals für die vielen tollen Tipps!
PID=$(ps -ef | grep tomcat | grep -v grep | grep -v shutdown | awk '{print $2}')
Mit dem Grep-Konstrukt hast du übrigens die PID deines Bash-Skriptes abgegriffen, deswegen beendet sich das regelmäßig.
deswegen das "grep -v grep"
Aber heisst dein Skript nicht /opt/scripts/stop-pm-tomcat-fix.sh? grep tomcat --> Treffer, versenkt, da grep -v grep | grep -v shutdown dass nicht verhindern.

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: [gelöst]Kill Befehl im Shell Script via Cron ausführen

Beitrag von HelsAett » 17.08.2022 17:17:57

Aber heisst dein Skript nicht /opt/scripts/stop-pm-tomcat-fix.sh? grep tomcat --> Treffer, versenkt, da grep -v grep | grep -v shutdown dass nicht verhindern.

Code: Alles auswählen

🐧[debian@debian] ~ $ ps -ef | grep firefox | wc -l
7
🐧[debian@debian] ~ $ ps -ef | grep firefox | grep -v grep | wc -l
6
Anzahl der Treffer, im 2 output sind nur noch 6, statt 7 mit grep -v grep nehme ich einen Treffer aus dem Spiel. Mein "grep firefox" selbst. Funktioniert auch beim tomcat. Probiere es aus. Keine schöne Lösung aber funktioniert.

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

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von tobo » 17.08.2022 17:20:51

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 16:34:44
Danke nochmals für die vielen tollen Tipps!
PID=$(ps -ef | grep tomcat | grep -v grep | grep -v shutdown | awk '{print $2}')
Mit dem Grep-Konstrukt hast du übrigens die PID deines Bash-Skriptes abgegriffen, deswegen beendet sich das regelmäßig.
deswegen das "grep -v grep"
Einfach ([t]omcat filtert den grep-Befehl automatisch raus):

Code: Alles auswählen

PID=$(ps -ef | grep [t]omcat | grep -v shutdown | awk '{print $2}')
"Und nicht"-Verbindung mit nur einem grep könntest du auch so darstellen:

Code: Alles auswählen

PID=$(ps -ef | grep -P '(?=.*[t]omcat)(?!.*shutdown)' | awk '{print $2}')

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

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von Meillo » 17.08.2022 17:22:46

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 16:34:44
Danke nochmals für die vielen tollen Tipps!
PID=$(ps -ef | grep tomcat | grep -v grep | grep -v shutdown | awk '{print $2}')
Mit dem Grep-Konstrukt hast du übrigens die PID deines Bash-Skriptes abgegriffen, deswegen beendet sich das regelmäßig.
deswegen das "grep -v grep"
Wenn du den grep-Befehl ausschliessen willst, dann macht man das typischerweise so:

Code: Alles auswählen

ps -ef | grep '[t]omcat'
(D.h. man verwendet Metazeichen im regulaeren Ausdruck, wodurch der grep-Prozess selbst dann nicht mehr matcht.)

Aber `pkill' ist sicherlich die bessere Option.


Edit: tobo war schneller. ;-)
Use ed once in a while!

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [gelöst]Kill Befehl im Shell Script via Cron ausführen

Beitrag von JTH » 17.08.2022 17:23:45

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 17:17:57
Keine schöne Lösung aber funktioniert.
Oder du nimmst, wie oben schon vorgeschlagen, pgrep. Das ist genau dafür gedacht, PIDs anhand des Prozess-/Programmnamens zu finden, man läuft keine Gefahr, das Suchkommando selbst mit zu finden und andere Vorteile.

Code: Alles auswählen

pgrep firefox
ist doch wesentlich übersichtlicher als

Code: Alles auswählen

ps -ef | grep firefox | grep -v grep
Die "manuelle" grep-Zeile liefert dir in dieser Form außerdem die ganzen "Unter"prozesse von, in diesem Fall, Firefox mit, die man normalerweise vielleicht nicht direkt einzeln mit abschießen möchte.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Tintom
Moderator
Beiträge: 3064
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Kill Befehl im Shell Script via Cron ausführen

Beitrag von Tintom » 17.08.2022 17:29:16

tobo hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 16:15:11
Tintom hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 15:24:44
... das reguläre shutdown.sh von meinen Script aus heraus aufrufe...
Entweder hast du ein ziemlich altes Debian oder die letzten Jahre sind an dir vorbei gezogen :mrgreen:
$ ls -n /sbin/shutdown
lrwxrwxrwx 1 0 0 14 Jul 8 2021 /sbin/shutdown -> /bin/systemctl
Oder HelsAett meint z.B. was anderes:

Code: Alles auswählen

$ apt-file search shutdown.sh | grep tomcat
tomcat9-common: /usr/share/tomcat9/bin/shutdown.sh
Danke, in dem Paket hatte ich nicht geschaut. Jetzt wird ein Schuh draus.

mludwig
Beiträge: 807
Registriert: 30.01.2005 19:35:04

Re: [gelöst]Kill Befehl im Shell Script via Cron ausführen

Beitrag von mludwig » 17.08.2022 17:31:31

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 17:17:57
Aber heisst dein Skript nicht /opt/scripts/stop-pm-tomcat-fix.sh? grep tomcat --> Treffer, versenkt, da grep -v grep | grep -v shutdown dass nicht verhindern.

Code: Alles auswählen

🐧[debian@debian] ~ $ ps -ef | grep firefox | wc -l
7
🐧[debian@debian] ~ $ ps -ef | grep firefox | grep -v grep | wc -l
6
Anzahl der Treffer, im 2 output sind nur noch 6, statt 7 mit grep -v grep nehme ich einen Treffer aus dem Spiel. Mein "grep firefox" selbst. Funktioniert auch beim tomcat. Probiere es aus. Keine schöne Lösung aber funktioniert.
Dein Shell-Skript ist ein eigener Prozess stop-pm-tomcat-fix.sh, der einen neuen Prozess (grep tomcat) startet. Den Kindprozess grep hast du weggefiltert, aber den bash-Skript gekillt ...

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

Re: [gelöst]Kill Befehl im Shell Script via Cron ausführen

Beitrag von Meillo » 17.08.2022 17:33:00

mludwig hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 17:31:31
Dein Shell-Skript ist ein eigener Prozess stop-pm-tomcat-fix.sh, der einen neuen Prozess (grep tomcat) startet. Den Kindprozess grep hast du weggefiltert, aber den bash-Skript gekillt ...
:THX:
Use ed once in a while!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: [gelöst]Kill Befehl im Shell Script via Cron ausführen

Beitrag von HelsAett » 17.08.2022 17:42:05

Dein Shell-Skript ist ein eigener Prozess stop-pm-tomcat-fix.sh, der einen neuen Prozess (grep tomcat) startet. Den Kindprozess grep hast du weggefiltert, aber den bash-Skript gekillt ...
:facepalm: :THX:

Benutzeravatar
MSfree
Beiträge: 11604
Registriert: 25.09.2007 19:59:30

Re: [gelöst]Kill Befehl im Shell Script via Cron ausführen

Beitrag von MSfree » 17.08.2022 17:50:36

HelsAett hat geschrieben: ↑ zum Beitrag ↑
17.08.2022 13:03:49

Code: Alles auswählen

		    PID=$(ps -ef | grep tomcat | grep -v grep | grep -v shutdown |  awk '{print $2}')
		    kill $PID
		    sleep 0.5
		    kill -9 $PID
		    sleep 0.5
Wie wäre es mit

Code: Alles auswählen

killall -9 tomcat
statt deines Codemonsters?

Antworten