ubuntuusers.de

Skript / Überprüfen, ob Programm im Hintergrund noch läuft

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

aherr2

Anmeldungsdatum:
5. September 2016

Beiträge: 2

Hallo, ich habe ein kleines Skript, welches über crontab überprüfen soll, ob ein Programm im Hintergrund läuft. Wenn ja, soll die Skriptdatei beendet werden, wenn nein, dann soll das Programm über die Skriptdatei neu gestartet werden.

Wenn ich die Skriptdatei starte, bekomme ich folgende Fehlermeldung: Zeile 9: Syntax Fehler: Unerwartetes Dateiende

Hier das Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash

if ps -ef | grep -v grep | grep gaszaehler.py ; then

     exit 0

else

    sudo python /home/pi/Gaszaehler/gaszaehler.py &

    logger "gaszaehler.py neu gestartet"

    exit 0

fi

Leider finde ich den Fehler nicht, wer kann mir weiterhelfen? Das Skript läuft auf einem Raspberry Pi 2, Software Raspbian Jessie

Gruß, Andreas

Bearbeitet von rklm:

Codeblock. Bitte einmal Forum/Syntax lesen.

Moderiert von rklm:

Distro entfernt

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

  1. ist die Logik extrem komisch - "wenn es läuft, soll es beendet werden" vs. "wenn es nicht läuft, soll es gestartet werden". Sehe ich als Widerspruch.

  2. Warum cron und nicht systemd?

  3. Hier ist ein Ubuntu Supportforum. Die verwendest Raspbian.

Gruß, noisefloor

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Andreas,

zuerst mal herzlich willkommen hier auf dem Forum !

Allerdings können wir Fehler kaum finden, solange Du uns den Code als wilde Zeilensammlung hinwirfst.
Du solltest dafür unbedingt einen {{{Codeblock}}} (→ das Knöpfchen mit dem Blatt und Zahnrad) spendieren, denn sonst sieht man weder die genaue Zuordnung der Zeilen, noch eventuelle Sonderzeichen.

Von der Sache her sieht mir das Skript auch etwas eigenartig aus: Warum gehst Du unbedingt über die Prozess-Nr. und baust nicht einfach eine Endlosschleife, die das Skript immer wieder sofort startet ? (und die exit 0 sind auch überflüssig !) :

1
2
3
4
5
#!/bin/bash

while true; do
    sudo python /home/pi/Gaszaehler/gaszaehler.py 
done

LG,

track

aherr2

(Themenstarter)

Anmeldungsdatum:
5. September 2016

Beiträge: 2

track schrieb:

Hi Andreas,

zuerst mal herzlich willkommen hier auf dem Forum !

Allerdings können wir Fehler kaum finden, solange Du uns den Code als wilde Zeilensammlung hinwirfst.
Du solltest dafür unbedingt einen {{{Codeblock}}} (→ das Knöpfchen mit dem Blatt und Zahnrad) spendieren, denn sonst sieht man weder die genaue Zuordnung der Zeilen, noch eventuelle Sonderzeichen.

Von der Sache her sieht mir das Skript auch etwas eigenartig aus: Warum gehst Du unbedingt über die Prozess-Nr. und baust nicht einfach eine Endlosschleife, die das Skript immer wieder sofort startet ? (und die exit 0 sind auch überflüssig !) :

1
2
3
4
5
#!/bin/bash

while true; do
    sudo python /home/pi/Gaszaehler/gaszaehler.py 
done

LG,

track

1
2
3
4
5
6
7
8
#!/bin/bash
if ps -ef | grep -v grep | grep gaszaehler.py ; then
exit 0
else
sudo python /home/pi/Gaszaehler/gaszaehler.py &
logger "gaszaehler.py neu gestartet"
exit 0
fi

Das war meine Überlegung bei der Skriptdatei:

In der Zeile 2 wird geschaut, ob das Programm gaszaehler.py noch läuft. Wenn ja, dann wird die Skriptdatei mit Zeile 3 beendet. Ist das Programm gaszaehler.py im Hintergrund nicht mehr vorhanden, dann wird es mit Zeile 5 neu gestartet und das Skript wird mit Zeile 7 beendet.

Gruß, Andreas

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13194

Willkommen hier im Forum!

aherr2 schrieb:

1
2
3
4
5
6
7
8
#!/bin/bash
if ps -ef | grep -v grep | grep gaszaehler.py ; then
exit 0
else
sudo python /home/pi/Gaszaehler/gaszaehler.py &
logger "gaszaehler.py neu gestartet"
exit 0
fi

Ein paar Anmerkungen:

  • Einrücken macht das Skript lesbarer.

  • In Zeile 2 kann man das Finden des Prozesses (zumindest unter Ubuntu) mit pgrep einfacher erledigen.

  • Wenn das Python-Skript sowieso per sudo gestartet werden soll, dann kannst Du das Shell-Skript doch über die Crontab von "root" ausführen lassen. Das spart den sudo, der ja normalerweise auch ein Password abfragt. (Mit anderen Worten: in einer Crontab eines nicht "root"-Benutzers dürfte das gar nicht funktionieren.)

  • Die exits sind überflüssig.

  • Du könntest auch eine PID-Datei nutzen, um die PID des Prozesses zu merken und den Prozess so leichter zu finden.

senden9

Avatar von senden9

Anmeldungsdatum:
8. Februar 2010

Beiträge: 965

Wohnort: Österreich

Nochmal Willkommen bei uns.

Oder du verwendest ein richtiges Process Control System wie Supervisor oder systemd [1]. Letzteres würde ich nur empfehlen wenn systemd unter Raspian standardmäßig verwendet wird. Das sind erprobte Systeme die häufig eingesetzt werden. Sie reagieren auch schneller als ein Skript welches von Cron von Zeit zu Zeit aufgerufen wird.

  • 1: Google z.B. nach „systemd write own service“

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Die PID eines laufenden Programms würde ich nicht mit ps und grep ermitteln, sondern mit pgrep:

1
pgrep -f "gaszaehler.py"
Antworten |