Automatischer Kill und Neustart eines Prozesses

Blackberry

Benutzer
Mitglied seit
05. Jun 2022
Beiträge
16
Punkte für Reaktionen
0
Punkte
1
Hi,
meine 980+ unterstütz die IP-Gegensprechanlage für weitere Funktionen. Hierfür habe ich ein php-Skipt, was eingentlich gut funktioniert. Problem ist nur, dass es hin und wieder abstürzt, wenn das Netzwerk oder eine der notwendigen Komponenten nicht reagiert oder ein Update der Synology durchgeführt wird. Dann muss ich das Skipt wieder manuell starten.
Ich kann das Skipt aber auch nicht (täglich) nochmals starten, denn wenn es 2x läuft gibt es Probleme.
Daher hätte ich folgende Idee:

Täglich zu einem festgelegten Zeipunkt wird ein ggf. noch laufendes Skipt gestoppt (kill ...).
Dann 30 Sekunden später wird das ursprüngliche Skipt wieder gestartet.

Problem: für den kill-Befehlt brauche ich die PID. Die ist jedoch für jeden php-Start neu.
Daher: wie kann ein solches Skipt aussehen die den Prozess "gegensprech.php" sicher löscht und keine Probleme macht, wenn der Prozess zuvor schon abgestürzt ist?

Vielen Dank im Voraus!!

PS: pgrep ist leider nicht verfügbar. :(
 
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
PS: pgrep ist leider nicht verfügbar.
und weshalb nicht mit ps in Kombination mit grep?

z.B. hiermit... ps -ax | grep gegensprech.php

Probiere es doch mit disem Code Schnipsel. Zuerst die Prozess ID in der Variablen speichern und anschließend den Kill Befehl ausführen mit -15 für SIGTERM.
Bash:
processid=`ps -ax | grep gegensprech.php | grep -v grep | awk '{print $1}'`
kill -15 $processid
 
Zuletzt bearbeitet:

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.246
Punkte für Reaktionen
2.845
Punkte
423
Es gibt auch den Befehl killall, der versteht auch Prozessnamen.
 
  • Like
Reaktionen: luddi

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174

Blackberry

Benutzer
Mitglied seit
05. Jun 2022
Beiträge
16
Punkte für Reaktionen
0
Punkte
1
@Benares : irgendwie will killall nicht den Namen schlucken. Habe es auch schon mit * versucht, es funktioniert aber nicht. Meldung:

gegensprech.php: no process found

@luddi : ich bekomme die Fehlermeldung:
: arguments must be process or job IDs
zurück. Ich habe die processid also auf den Bildschirm ausgegeben. Die Nummer stimmt. Somit habe ich die Ausgabe in ein File umgeleitet um zu sehen, ob weitere (nicht sichtbare) Zeichen enthalten sind. Die ID hat 4 Stellen, das File hat aber 6 Zeichen. Es sind $0D und $0A. Woher kommen diese?
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.246
Punkte für Reaktionen
2.845
Punkte
423
Schau halt mal, z.B. mit "ps -ef", wie der Prozess wirklich heißt.
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.246
Punkte für Reaktionen
2.845
Punkte
423
Also heißt der Prozess "php" und wurde mit dem Parameter "gegensprech.php" aufgerufen.
Ein "killall php" würde vermutlich klappen, aber das würde alle php-Prozesse beenden (wenn es sonst noch welche gibt).
Nimm also besser luddis Variante, aber teste erstmal die 1. Zeile mit einem "echo $processid", ob die Ermittlung der ID klappt.

Übrigens: Verwende besser einen Unix-fähigen Editor. Dein 0D 0A (CRLF) deutet auf Notepad hin. Linux verwendet nur LF am Zeilenende.
 
Zuletzt bearbeitet:

Blackberry

Benutzer
Mitglied seit
05. Jun 2022
Beiträge
16
Punkte für Reaktionen
0
Punkte
1
@Benares : jep, mit killall php werden alle Prozesse gelöscht. Gerade wenn ich in Zukunft vielleicht mehr darauf laufen lassen möchte, geht es so leider nicht.
Vielleicht kann man ja auch was am Aufruf ändern. Die Ausgabe des php möchte ich umleiten. Daher habe ich eine sh erstellt, mit folgendem Inhalt:
php gegensprech.php >> log-gegensprech__$(date +%F).txt &
Gibt es eine andere Möglichkeit??
 
Zuletzt bearbeitet:

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.246
Punkte für Reaktionen
2.845
Punkte
423
Nö, das kannst du ruhig so lassen. Wie gesagt, luddis Variante sollte funktionieren. Ich würde aber noch eine Prüfung einbauen, ob er auch was findet, z.B. so:
Code:
processid=`ps -ax | grep gegensprech.php | grep -v grep | awk '{print $1}'`
if [[ "" !=  "$processid" ]]; then
  echo "killing $processid"
  kill -15 $processid
fi
 

Blackberry

Benutzer
Mitglied seit
05. Jun 2022
Beiträge
16
Punkte für Reaktionen
0
Punkte
1
Das Problem ist nicht, daß keine PID gefunden wird. Es wird eine gefunden. Ich habe sie mit Hilfe von
echo $processid
angezeigt. Die ID stimmt auch. Wenn ich die Nummer bei kill angebe, funktioniert es ja auch.
Problem scheint nur zu sein, daß die Variable "processid" mehr enthält, als gewünscht. Daher auch die Fehlermeldung von kill
: arguments must be process or job IDs

Wie finde ich den Fehler?
 

Blackberry

Benutzer
Mitglied seit
05. Jun 2022
Beiträge
16
Punkte für Reaktionen
0
Punkte
1
... probiert. Es meldet mir "unexpected end of file".

Übrigens verwende ich den Notepad++.
Dort kann ich allerdings nur ascii-Zeichen anzeichen lassen. O.g. File sehe ich mit einem HexEditor an.
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.246
Punkte für Reaktionen
2.845
Punkte
423
Mmh, was gibt denn z.B. echo "(${processid})" aus? "(<Zahl>)"?

Notepad++ ist schonmal gut. Schau mal bei Bearbeiten, Format Zeilenende, dass da auch "Unix (LF)" eingestellt ist.
 
  • Like
Reaktionen: Ulfhednir

Blackberry

Benutzer
Mitglied seit
05. Jun 2022
Beiträge
16
Punkte für Reaktionen
0
Punkte
1
:cool:

Das Zeilenende wars - kaum zu glauben!! Nun geht's!!

Habe gleich die Prüfung mit hinzu genommen - geht auch!

Top. Danke!!
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat