Shell Skript-Schleife beendet sich bei `ps`...? [Gelöst]

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Shell Skript-Schleife beendet sich bei `ps`...? [Gelöst]

Beitrag von jmar83 » 15.11.2019 15:40:28

Hallo zusammen

So wird mir das echo vor dem break noch ausgegeben:

Code: Alles auswählen


#!/bin/bash
set -e && set +x;

#service watchinsect stop;
#/etc/init.d/x_master stop;

#exit;

#echo "---------------------------- PROCMSG:";

while [ true ]; do
#echo "---------------------------- PROCMSG:";

#echo "c";

 PROCMSG="eeee";
 #PROCMSG=$(ps -aux | grep ./x_master | grep -v grep);

  echo "---------------------------- PROCMSG: ";
break;

  if [ PROCMSG == "" ] ;
  then
    break;
  fi;
  echo "Try to stop x_master process...";
  sleep 1;
done;

So hingegeben nicht:

Code: Alles auswählen


#!/bin/bash
set -e && set +x;

#service watchinsect stop;
#/etc/init.d/x_master stop;

#exit;

#echo "---------------------------- PROCMSG:";

while [ true ]; do
#echo "---------------------------- PROCMSG:";

#echo "c";

 #PROCMSG="eeee";
 PROCMSG=$(ps -aux | grep ./x_master | grep -v grep);

  echo "---------------------------- PROCMSG: ";
break;

  if [ PROCMSG == "" ] ;
  then
    break;
  fi;
  echo "Try to stop x_master process...";
  sleep 1;
done;
Zuletzt geändert von jmar83 am 09.12.2019 16:29:04, insgesamt 2-mal geändert.
Freundliche Grüsse, Jan

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

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von tobo » 15.11.2019 15:59:19

Du hast set -e explizit gesetzt, dann weißt du doch wohl auch, was das bedeutet (help set). Ausgelöst durch die Trefferwahrscheinlichkeit dieses Konstrukts:

Code: Alles auswählen

grep ./x_master | grep -v grep

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

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von JTH » 15.11.2019 16:03:25

Du hast set -e in deinem Skript – das ist aus guten Gründen nicht unbedingt immer empfehlenswert.

Mit set -e bricht dein Skript sofort ab, wenn irgendeins der Kommandos einen Fehler verursacht (einen Rückgabewert ungleich 0 hat).

Bei dir verursacht also in dieser Pipe

Code: Alles auswählen

PROCMSG=$(ps -aux | grep ./x_master | grep -v grep)
eins der drei Kommandos einen Fehler – vermutlich das grep -v grep, wenn das grep davor nichts gefunden hat.

Tipps am Rande:
Du musst nicht jede Zeile mit ; beenden. Das muss du nur, wenn du mehrere Kommandos nacheinander in einer Zeile hast.

Und das hier

Code: Alles auswählen

while [ true ]; do
[…]
funktioniert auch so ;)

Code: Alles auswählen

while [ false ]; do
[…]
# oder
while [ jmar83 ]; do
[…]
Was du eigentlich möchtest ist

Code: Alles auswählen

while true; do
[…]
ohne Klammern
Manchmal bekannt als Just (another) Terminal Hacker.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 15.11.2019 16:03:55

Vielen Dank!

Also wenn dabei kein Prozess gefunden wird, dann gibt keinen 0-Exitcode...? Keinen Prozess zu finden sehe ich nicht als Fehler (=ungleich Exitcode 0), aber sei's so...
Freundliche Grüsse, Jan

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

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von JTH » 15.11.2019 16:08:18

jmar83 hat geschrieben: ↑ zum Beitrag ↑
15.11.2019 16:03:55
Also wenn dabei kein Prozess gefunden wird, dann gibt keinen 0-Exitcode...?

Code: Alles auswählen

ps aux | grep X
findet immer was – weil es sich immer auch selbst findet. Deshalb ist pgrep meist zu bevorzugen.

Ein

Code: Alles auswählen

grep -v Y
danach schlägt aber fehl, wenn nach dem Herausstreichen nichts mehr über bleibt.
Manchmal bekannt als Just (another) Terminal Hacker.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 15.11.2019 16:11:56

Nun habe ich es so gelöst:

Code: Alles auswählen

 PROCMSG=$(ps -aux | grep ./practiframe_master | grep -v grep ) ||:;

...ich bevorzuge es, in Shell-Skripts immer `set -e` zu verwenden, ich denke damit wird die Qualität der Skripts einfach besser.

Mit `pgrep` habe ich ein anderes lustiges Problem: viewtopic.php?f=27&t=175448 (Der Prozessname kann scheinbar über die Programmlogik verändert werden und muss nicht zwngsläufig dem executable-Datei-Namen entsprechen... irgendwie scheinen das `ps` sowie `pgrep` anders zu regeln...?)
Freundliche Grüsse, Jan

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

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von JTH » 15.11.2019 16:30:13

jmar83 hat geschrieben: ↑ zum Beitrag ↑
15.11.2019 16:11:56
...ich bevorzuge es, in Shell-Skripts immer `set -e` zu verwenden, ich denke damit wird die Qualität der Skripts einfach besser.
Ich bin auch nicht dagegen oder wollte dich davon abbringen, man muss es nur an manchen extra Stellen beachten ;)

jmar83 hat geschrieben: ↑ zum Beitrag ↑
15.11.2019 16:11:56
Mit `pgrep` habe ich ein anderes lustiges Problem
Ich weiß, habe das Thema schonmal gesehen ;)

Als Anregung:

Code: Alles auswählen

while pgrep -f x_master > /dev/null; do
  echo "Try to stop x_master process..."
  sleep 1
done
Manchmal bekannt als Just (another) Terminal Hacker.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 15.11.2019 20:20:52

Vielen Dank, werde den von dir vorgeschlagenen Code am Montag, wenn ich wieder auf der Arbeit bin, ausprobieren.
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 18.11.2019 08:09:54

Hallo

Vielen Dank für deinen Code, dieser scheint besser zu funktionieren als meiner...

Code: Alles auswählen

while pgrep -f x_master > /dev/null; do
  echo "Stopping x_master...";
  sleep 1;
done;
Vs.

Code: Alles auswählen

#while [ true ]; do
#  PROCMSG=$(ps -aux | x_master | grep -v grep ) ||:;
#  echo "PROCMSG: "$PROCMSG;
#  if [ -z "$PROCMSG" ]; then
#    break;
#  fi;
#  echo "Try to stop x_master process...";
#  sleep 1;
#done;

...bei mri scheint irgendwas in einer Endlosschleife zu verharren?
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 18.11.2019 09:39:22

Obwohl ich vorher den Dienst, welcher die Datei "x_master" steuert beende, und dieser bei der nächten Zeile im Shell-Skript immer noch läuft (die Dienststeuerung wartet also nicht, sondern erfolgt "nebenläufig" bzw. asynchron), gibt's eine komische Endlosschleife bei meinem Code, was ich ehrlich gesagt nicht ganz verstehe... ich warte solange, bis `px -aux | grep ...` einen leeren String zurückgibt... aber trotz des vorherigen Beenden des Diensts (über `service` oder `systemctl`) klappt das nicht, sondern mein Code hat erst recht zur Folge dass dass sich der Dienst NICHT beendet...

...sobald ich aber dann die Endlosschleife per Ctrl-C im SSH-Fenster beende, dann beendet sich auch der Prozess "x_master". Total schräg, das ganze.

Oder könnte der Grund sein, dass im gleichen Verzeichnis wie sich das Skript befindet sich die Datei `x_master` drin ist, und dann diese Zeile was im Zusammenhang damit auslöst?

Code: Alles auswählen

PROCMSG=$(ps -aux | x_master | grep -v grep ) ||:;
Freundliche Grüsse, Jan

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

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von MSfree » 18.11.2019 10:02:38

jmar83 hat geschrieben: ↑ zum Beitrag ↑
18.11.2019 09:39:22
ich warte solange, bis `px -aux | grep ...` einen leeren String zurückgibt.

Code: Alles auswählen

ps -aux | grep ...
liefert nie einen leeren String zurück. Es wird immer mindestens die PID des laufenden grep-Prozesses ausgegeben.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 18.11.2019 11:11:46

Vollständig ist es ja so:

Code: Alles auswählen

ps -aux | grep ... | grep -v grep
Freundliche Grüsse, Jan

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

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von tobo » 18.11.2019 12:13:36

Und außerdem ist es davon abhängig, nach was man sucht. Will man z.B. den grep-Prozess selbst ausblenden, dann fügt man einfach eine Zeichenklasse ein:

Code: Alles auswählen

ps -aux | grep  [x]_master

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 18.11.2019 12:27:31

Also `ps -aux | grep ... | grep -v grep` funktioniert soweit in der Konsole, im Shell-Skript führt es aber zu einer Endlosschleife...?
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 18.11.2019 12:34:50

...oder ist es die Ausgabe von `echo`, welche den Programmnamen `x_master` beinhaltet was bei der Prozessprüfung immer wieder dazu führt dass ... | grep x_master immer wieder was zurückgibt - dies selbst nach 1 Sekunde Wartezeit...? (Dies natürlich, auch wenn der grep-Prozesse selbst über `-v` ausgeschlossen wird..?)
Freundliche Grüsse, Jan

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

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von JTH » 18.11.2019 13:03:03

Wenn du die Zeile
jmar83 hat geschrieben: ↑ zum Beitrag ↑
18.11.2019 09:39:22

Code: Alles auswählen

PROCMSG=$(ps -aux | x_master | grep -v grep ) ||:;
aktuell tatsächlich in dieser Form in deinem Skript hast, ist die – direkt gesagt – unsinnig:

Erstmal als Warnung: ps aux (ohne Minus) ist leider nicht zwangsläufig dasselbe wie ps -aux (mit Minus):
man ps hat geschrieben: Note that "ps -aux" is distinct from "ps aux". The POSIX and UNIX standards require that "ps -aux" print all processes owned by a user named "x", as well as printing all processes that would be selected by the -a option. If the user named "x" does not exist, this ps may interpret the command as "ps aux" instead and print a warning. This behavior is intended to aid in transitioning old scripts and habits. It is fragile, subject to change, and thus should not be relied upon.
Du meinst wahrscheinlich ps aux.

An dieser Stelle

Code: Alles auswählen

 | x_master |
startest du dein Tool x_master nochmal – da war doch mal ein grep?

Nochmal der Ratschlag: Benutz pgrep, statt der Krücke ps | grep | grep -v. Außer du weißt sicher, dass dein Problem mit pgrep nicht zu lösen ist.

Da x_master vermutlich irgendwas beim Start ausgibt, ist die Variable PROCMSG nie leer. Deine Schleife läuft damit wegen des nie zutreffenden

Code: Alles auswählen

if [ -z "$PROCMSG" ]; then
    break
fi
endlos.
Manchmal bekannt als Just (another) Terminal Hacker.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 18.11.2019 13:18:58

"Note that "ps -aux" is distinct from "ps aux". The POSIX and UNIX standards require that "ps -aux" print all processes owned by a user named "x", as well as printing all processes that would be selected by the -a option. If the user named "x" does not exist, this ps may interpret the command as "ps aux" instead and print a warning. This behavior is intended to aid in transitioning old scripts and habits. It is fragile, subject to change, and thus should not be relied upon."

Oha danke!! Aber ich glaube ich bin keinesfalls der Einzige, der das so einsetzt - irgendwo (?) habe ich das auch abgeschaut...

Und auch vielen Dank für den anderen Tipp, werde das sobald als möglich ausprobieren!
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 18.11.2019 13:26:20

"startest du dein Tool x_master nochmal – da war doch mal ein grep?"

Ja, da war immer ein "grep"... zumindest beim Skript, welches bei mir Probleme machte. Also so:

Code: Alles auswählen

 PROCMSG=$(ps -aux | grep x_master | grep -v grep ) ||:;
(Habe was editiert, und dann versehentlich das grep gelöscht. Aber das Skript lief NIE ohne das grep!!)
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell Skript-Schleife beendet sich bei `ps`...?

Beitrag von jmar83 » 20.11.2019 11:53:06

Eine Frage besteht noch: Was macht das genau? ;-)

Es lässt den Ausgabetext verschwinden (nach /dev/null), prüft aber den exit-code?

Code: Alles auswählen

while pgrep -f x_master > /dev/null;
Jedoch: Solange der Prozess existiert, müsste doch der exit-Code 0 rauskommen, was in der while-Schleife wohl in ein "false" umgewandelt werden würde? Funktioniert zwar, verstehe ich aber nicht ganz.

(Und wenn der Exit-Code 1 herauskommt, also kein Prozess mehr existiert, dann müsste es ja eigentlich eine Endlosschleife geben...?)


-> Und wie kann ich das Gegenteil machen, solange prüfen bis der Prozess existiert? (Für das Startskript, welches ebenfalls eine Dienstsstuerungs-Anweisung enthält, aber kurz darauf über service ... state das Ergebnis zurückgibt. Wenn ich dort nicht abwarte, dann ist das Ergbenis immer "not running"..)

Vielen Dank.
Freundliche Grüsse, Jan

Antworten