[gelöst]Automatisch abgestürtes Programm wieder starten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

[gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von synapsenstau » 28.06.2014 14:30:56

Moin,

ich bin leider gezwungen für einen Anwendungszweck auf ein Windows Programm auszuweichen, welches via Wine läuft. Das Programm läuft auch super (alle Funktionen nutzbar), aber leider läuft es nicht immer stabil und stürzt gelegentlich ab. Da ich diese Anwendung aber auch manchmal weiterlaufen soll wenn ich nicht am PC sitze, ist es unpraktisch wenn sie kurz nach verlassen des PC krachen geht. Dann hätte ich ja den PC auch ausmachen können um Strom zu sparen.
Ich dachte das man nen kleinem Script die Überwachung realisieren könnte. Dachte mir sowas wie, das alle 5 min (sleep) mit "ps ax | grep anwendung" geschaut wird ob es die Anwendung noch gibt und wenn nicht sie wieder gestartet wird.
Die Abfrage gibt ja etzwas in der Art aus:

Code: Alles auswählen

12154 ?        Sl    16:00 C:\Program Files\anwendung\anwendung.exe                                                                                        
16827 pts/0    R+     0:00 grep anwendung
Wie kann ich nun die Ausgabe auswerten, bzw schauen ob der String "anwendung.exe" bzw "C:\Program Files\anwendung\anwendung.exe" noch vorhanden ist?

Ich danke euch für dienliche hinweise.
Zuletzt geändert von synapsenstau am 29.06.2014 18:13:34, insgesamt 1-mal geändert.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

DeletedUserReAsG

Re: Automatisch abgestürtes Programm wieder starten

Beitrag von DeletedUserReAsG » 28.06.2014 14:51:32

Wie kann ich nun […] schauen ob der String "anwendung.exe" bzw "C:\Program Files\anwendung\anwendung.exe" noch vorhanden ist?
Ich würd’s, naiv, wie ich doch bin, mit grep "anwendung.exe" | grep -v grep probieren …

Es gab aber auch ’nen Schalter, der die Ausgabe von greps Prozess verhinderte.

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: Automatisch abgestürtes Programm wieder starten

Beitrag von synapsenstau » 28.06.2014 14:56:07

Soweit war ich ja schon selber. Ich weis nur nicht, wie ich die Ausgabe von "ps ax | grep anwendung" auswerte. Wie kriege ich z.B. ner "if then" Schleife das beigebracht?
Ich habe bis noch nicht so viel Shell-script Erfahrung.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

DeletedUserReAsG

Re: Automatisch abgestürtes Programm wieder starten

Beitrag von DeletedUserReAsG » 28.06.2014 14:58:39

http://www.tldp.org/LDP/Bash-Beginners- ... ap_07.html

if-Konstrukte sind keine Schleifen, btw.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Automatisch abgestürtes Programm wieder starten

Beitrag von smutbert » 28.06.2014 15:12:34

meine 2 Zeilen Code zu dem Thema

Code: Alles auswählen

#!/bin/bash
while true
do
	if ps ax | grep 'meinProgramm' | grep -v grep
	then
		echo Programm läuft
	else
		echo Programm läuft nicht
		#hier könnte man das Programm neu starten
	fi
	echo nächster Check in 5 Sekunden
	sleep 5
done

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: Automatisch abgestürtes Programm wieder starten

Beitrag von synapsenstau » 29.06.2014 10:24:01

Danke dir smutbert :D . Werde es nacher mal probieren. Dachte nur nicht, das es so einfach ist. Ich bin davon ausgegangen, das ich die Ausgabe von "ps ax | grep 'meinProgramm' | grep -v grep" noch evtl mit awk "zerteilen" muss um die reine Pfadangabe zu kriegen.
niemand hat geschrieben:http://www.tldp.org/LDP/Bash-Beginners- ... ap_07.html
if-Konstrukte sind keine Schleifen, btw.
Danke für den Link. Schöne übersicht der möglichkeiten für spätere Projekte. Und ja, "if" ist keine Schleife. Ich und mein Brausekopf waren wieder mal zu hektisch beim tippen :roll:
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von synapsenstau » 29.06.2014 18:26:34

So, Script funktioniert wunderbar nach Smutbert. Jetzt hätte ich noch eine frage zur Schönheitspflege der Ausgabe. Jetzt gibt das Script auf der Konsole folgendes aus:

Code: Alles auswählen

Programm läuft
nächster Check in 300 Sekunden
16559 pts/3    Sl+    0:12 C:\Program Files\anwendung\anwendung.exe
Programm läuft
nächster Check in 300 Sekunden
16559 pts/3    Sl+    0:13 C:\Program Files\anwendung\anwendung.exe
Programm läuft
nächster Check in 300 Sekunden
16559 pts/3    Sl+    0:13 C:\Program Files\anwendung\anwendung.exe    
Kann man die Ausgabe der Zeile

Code: Alles auswählen

16559 pts/3    Sl+    0:13 C:\Program Files\anwendung\anwendung.exe 
noch unterdücken?
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von smutbert » 29.06.2014 18:38:08

Sicher geht das, wenn du einfach > /dev/null anhängst landet die Standardausgabe im Nirvana:

Code: Alles auswählen

if ps ax | grep 'meinProgramm' | grep -v grep > /dev/null

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von synapsenstau » 29.06.2014 18:57:44

Danke auch dafür. Das es "dev/null" gibt, war mir schon bekannt. Dachte nur, das dann alles verworfen wird aber es wird ja nur die Ausgabe verworfen. Als Bash Anfänger lernt man nie aus. Ich habe noch mal die Zeit hinzugefügt und kriege nun

Code: Alles auswählen

18:48  Programm Programm läuft
       nächster Check in 5 Minuten
18:53  Programm Programm läuft
       nächster Check in 5 Minuten
und binn voll zufrieden.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von Cae » 29.06.2014 19:26:19

Man koennte auch anstelle des verbreiteten und ungluecklichen ps|grep-Konstrukts einfach pgrep verwenden, das zu diesem Zweck erfunden wurde...

Code: Alles auswählen

if ! pgrep -q anwendung.exe; then
	# restart
fi
-q unterdrueckt Ausgaben, es wird nur der Rueckgabewert verwendet (was if tut). pgrep ist intelligent genug, sich selbst aus der Prozesssuche auszunehmen, wodurch das noch depperte und fehleranfaellige grep | grep -v grep entfaellt.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von newdeb » 29.06.2014 21:28:21

Cae hat geschrieben:das noch depperte und fehleranfaellige grep | grep -v grep
Lässt sich leicht vermeiden, wenngleich nicht so elegant wie mittels pgrep:

Code: Alles auswählen

$ ps ax|grep bash
 4246 pts/0    Ss     0:01 bash
 4295 pts/1    Ss+    0:00 /bin/bash
 8507 pts/0    S+     0:00 grep bash
$ ps ax|grep [b]ash
 4246 pts/0    Ss     0:01 bash
 4295 pts/1    Ss+    0:00 /bin/bash

Benutzeravatar
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von habakug » 29.06.2014 21:29:24

Hallo!

Ich kann hier kein "-q" entdecken:
pgrep -q
pgrep: Ungültige Option -- q
[...]
Auch nicht in der Manpage...

Gruss, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von ThorstenS » 29.06.2014 23:04:58

Debianrunit ist prädestiniert dafür : https://www.debian-administration.org/a ... g_services
Es startet abgestürtzte Programme immer wieder neu.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von Cae » 29.06.2014 23:15:39

habakug hat geschrieben:Ich kann hier kein "-q" entdecken:
pgrep -q
pgrep: Ungültige Option -- q
[...]
Auch nicht in der Manpage...
Korrekt, das hab' ich oben aus'm Kopf getippt (grep(1) hat ein -q). Bei pgrep macht -c das beschriebene return-code-Verhalten, hat aber noch Output, den man wegschieben muss. Richtig waere also etwas wie

Code: Alles auswählen

if ! pgrep -c anwendung.exe >/dev/null; then
	# restart
fi
(und das ist jetzt auch getestet ;-))

Danke fuer den Hinweis.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von synapsenstau » 30.06.2014 00:50:20

Dank auch dir Cae. Habe den Code auf pgrep umgestellt.

Wie das aber wohl mit Scripten ist, habe sie die Angewohnheit ein "eigenleben" zu entwickeln. Um es universeller benutzen zu können will ich jetzt erst man noch einen Initialisierungsteil machen, um es einfache auch für andere Programme nehmen zu können (wenn ich auch nocht nicht weiß für welche, aber man weiß ja nie) mit Checkinterval, Suchstring und zu startendem Programm.
Wenn das fertig ist, wollte ich mit mit dem zuspammen der Konsole befassen und die Daten in ein Log-file verfrachten.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von synapsenstau » 30.06.2014 11:12:56

So, habe nun die Ausgabe in ein logfile verfachtet. Leider hagelt es jetzt Fehlermeldungen. Sind bestimmt nur Syntaxfehler, welche ich aber nicht gelöst kriege.

Code: Alles auswählen

Zeile 30: -a: Kommando nicht gefunden.
Zeile 44: -n: Kommando nicht gefunden.
Zeile 52: 30.06.2014  10:35:07  CleanDC.exe restart: Kommando nicht gefunden.
und hier noch mal die Zeilen einzeln:

Code: Alles auswählen

30: if ! -a $logfile				# if no logfile then create this
44: if -n prg_pid
52: err_log_txt=$("$err_date  $err_time  $suchstring restart")
Das ganze Script ist hier: NoPaste-Eintrag37867

Desweiteren bin ich für Kritik offen, ob der von einem Anfänger gewählte weg so in Ordnung ist.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst]Automatisch abgestürtes Programm wieder starten

Beitrag von rendegast » 30.06.2014 12:50:50

if ! -a $logfile
then
->

Code: Alles auswählen

  if [[ ! -a $logfile ]]       
  then
Bzgl. Quoting

Code: Alles auswählen

$ fil=; if [ -a $fil ]; then echo hallo; fi
hallo

$ fil=; if [ -a "$fil" ]; then echo hallo; fi
Bei Nicht-Quoting wäre das Ergebnis also eigentlich falsch.

Nach 'man test', 'man bash' ist '-a datei' eigentlich ein bashism,
Bei /usr/bin/test wäre es für 'EXPR -a EXPR' (im Sinne von "wahr and wahr")
(Und obwohl es hier scheinbar funktioniert.).
Wegen der Klarheit würde ich '-f datei' bevorzugen.



--------------------------------------------------------------------
if -n prg_pid
then
->

Code: Alles auswählen

  if [[ -n $prg_pid ]]
  then  
Obige [[]] sind bashism.
Bei einfachen [] müßte gequotet werden

Code: Alles auswählen

  if [ -n "$prg_pid" ]
  then  
wenn prg_pid zBsp. mehrere Zahlen enthält.
Wobei ich mir bei den -n/-z-Test immer etwas unsicher bin.
Daher bevorzuge ich den klassischen POSIX-walkaround

Code: Alles auswählen

[ "x" = "x$bla" ] ....


--------------------------------------------------------------------
prgstart=env WINEPREFIX="/home/maik/.wine" wine "/home/maik/.wine/drive_c/Program Files/CleanDC++/CleanDC.exe" > /dev/null
...
$prgstart
eher ->

Code: Alles auswählen

prgstart='env WINEPREFIX="/home/maik/.wine" wine "/home/maik/.wine/drive_c/Program Files/CleanDC++/CleanDC.exe" > /dev/null  2>&1'
...
    $prgstart
oder

Code: Alles auswählen

prgstart="env WINEPREFIX=\"/home/maik/.wine\" wine \"/home/maik/.wine/drive_c/Program Files/CleanDC++/CleanDC.exe\" > /dev/null  2>&1"
...
    $prgstart
da jetzt noch Variablen möglich wären.

Am besten halte ich für den Zweck aber eine function

Code: Alles auswählen

prgstart() {
    env WINEPREFIX="$HOME/.wine" wine "$HOME/.wine/drive_c/Program Files/CleanDC++/CleanDC.exe" > /dev/null 2>&1
}
...
    prgstart
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten