Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

auf Prozessende pruefen

2 views
Skip to first unread message

Alexander Goetzenstein

unread,
Jan 27, 2023, 9:18:36 AM1/27/23
to
Hallo,
ein Script soll mit der Ausführung pausieren, bis ein Prozess (hier:
unison) beendet ist. Das habe ich im ersten Anlauf so versucht:

while [ $(ps ax | grep ' unison ' | grep -v grep) == '' ]
do
echo 'unison läuft noch, warte auf Beendigung...'
sleep 10
done

Das funktioniert so nicht, da es auf einen Fehler:
> -bash: [: ==: Einstelliger (unärer) Operator erwartet.

was mich wundert, da mit == oder auch mit = auch Zeichenfolgen
miteinander verglichen werden sollen -oder habe ich das missverstanden?

Dasselbe passiert, wenn ich etwa mit

while [ $(ps ax | grep ' unison ' | grep -v grep | cut -d' ' -f 1) -gt 0 ]

hantiere.

Nun bin ich auf

while ! [ -z $(ps -o pid h -C unison) ]

gekommen, bin mir aber nicht sicher, ob das sauber so ist.

Wie macht man das kurz, sauber und richtig?


--
Gruß
Alex

Markus Schaaf

unread,
Jan 27, 2023, 10:24:22 AM1/27/23
to
Am 27.01.23 um 15:18 schrieb Alexander Goetzenstein:

> ein Script soll mit der Ausführung pausieren, bis ein Prozess (hier:
> unison) beendet ist. Das habe ich im ersten Anlauf so versucht:
>
> while [ $(ps ax | grep ' unison ' | grep -v grep) == '' ]
> do
> echo 'unison läuft noch, warte auf Beendigung...'
> sleep 10
> done
>
> Das funktioniert so nicht, da es auf einen Fehler:
>> -bash: [: ==: Einstelliger (unärer) Operator erwartet.

Dieser Fehler entsteht, weil Du wahrscheinlch '!=', nicht '==',
schreiben wolltest ('==' gibt es nicht, das wäre '='). Außerdem
fehlen da Anführungszeichen, denn Deine Pipe kann Leerzeichen
ausgeben:

while [ "$(ps ax | grep ' unison ' | grep -v grep)" != '' ]

Jedoch hat `test` für diesen Test eine extra Option (man test):

while [ -n "$(ps ax | grep ' unison ' | grep -v grep)" ]

Das hat immer noch Probleme. Wenn ich zufällig `echo unison`
ausführe z.B. -- Außerdem, warum nach Dingen fragen, die man
nicht braucht, nur um sie dann schwierig rauszufiltern:

while [ -n "$(ps -e -o comm | grep '^unison$')" ]

Das wäre, was Du wolltest. IMO besser, wenn auch nicht perfekt:

unison=$(ps -e -o comm,pid \
| sed -n 's/^unison *\([0-9]*\)$/\1/p')
[ -n "$unison" ] && wait $unison

MfG

Markus Schaaf

unread,
Jan 27, 2023, 10:28:02 AM1/27/23
to
Am 27.01.23 um 16:24 schrieb Markus Schaaf:

> while [ -n "$(ps -e -o comm | grep '^unison$')" ]
>
> Das wäre, was Du wolltest.

Was man noch auf

while ps -e -o comm | grep -q '^unison$'

verkürzen würde.

Markus Schaaf

unread,
Jan 27, 2023, 10:36:21 AM1/27/23
to
Am 27.01.23 um 16:24 schrieb Markus Schaaf:

> unison=$(ps -e -o comm,pid \
> | sed -n 's/^unison *\([0-9]*\)$/\1/p')
> [ -n "$unison" ] && wait $unison

Ich merke erst jetzt, dass das nicht die Linux-Gruppe ist. Also
besser `ps ax` statt `ps -e` benutzen. :-)

Thomas Dorner

unread,
Jan 27, 2023, 12:08:02 PM1/27/23
to
Wenn es Linux wäre könnte man auch einfach pgrep benutzen, anstatt
selbst mit ps und grep zu hantieren.

Viele Grüße, Thomas
--
Adresse gilt nur kurzzeitig!

Jochen Kellner

unread,
Jan 27, 2023, 12:28:15 PM1/27/23
to

Hallo,

die Lösung an sich ist ja schon gefunden...

Alexander Goetzenstein <alexander_g...@web.de> writes:

> while [ $(ps ax | grep ' unison ' | grep -v grep) == '' ]

"grep -v grep" ist für mich ein Anti-Pattern. Ein Trick wie man das
vermeiden kann wäre etwa "grep ' [u]nison '" - das trifft den
Programmname, aber nicht die regex.

Jochen

--
This space is intentionally left blank.

Christian Weisgerber

unread,
Jan 27, 2023, 1:30:06 PM1/27/23
to
On 2023-01-27, Alexander Goetzenstein <alexander_g...@web.de> wrote:

> while [ $(ps ax | grep ' unison ' | grep -v grep) == '' ]
>
> Das funktioniert so nicht, da es auf einen Fehler:
>> -bash: [: ==: Einstelliger (unärer) Operator erwartet.

Wenn die Ersetzung $(...) nichts liefert, dann ergibt sich

[ == '' ]

was bash zu obiger seltsamer Fehlermeldung veranlasst.
Damit eine leere Ersetzung zu einer leeren Zeichenkette führt, sind
doppelte Anführungszeichen notwendig:

[ "$(...)" == '' ]

--
Christian "naddy" Weisgerber na...@mips.inka.de

Laurenz Trossel

unread,
Jan 27, 2023, 7:37:25 PM1/27/23
to
On 2023-01-27, Alexander Goetzenstein <alexander_g...@web.de> wrote:

> Wie macht man das kurz, sauber und richtig?

Ich würde 'pidof /usr/bin/unison' benutzen.

Michael Uplawski

unread,
Jan 28, 2023, 1:12:46 AM1/28/23
to
Sat, 28 Jan 2023 00:37:22 -0000 / Laurenz Trossel:
Für kompilierte Programme wie unison, sonst braucht es auch ein Argument
-x. Wenn “Executables” bloß den Interpreter ausführen.

Cheerio.
--
Le progrès, ce n'est pas l'acquisition de biens. C'est l'élévation de
l'individu, son émancipation, sa compréhension du monde. Et pour ça il
faut du temps pour lire, s'instruire, se consacrer aux autres.
(Christiane Taubira)

Bastian Blank

unread,
Jul 10, 2023, 8:50:21 AM7/10/23
to
Alexander Goetzenstein wrote:
> Wie macht man das kurz, sauber und richtig?

- Man startet den Prozess ohne "&", dann macht die Shell das richtige
und wartet bis er weg ist.
- Man fragt das Session-Management danach:
"systemctl --user is-active unison"

Ist aber abhängig davon was du wirklich tun willst. Diese grep-Orgie
sagt dir nur: es läuft ein unison, nicht: es läuft das eine unison das
du suchst.

Bastian

Helmut Waitzmann

unread,
Jul 10, 2023, 4:57:41 PM7/10/23
to
Bastian Blank <use...@waldi.eu.org>:
Und je nachdem, woher


systemctl --user is-active unison

den Namen „unison“ aus den Prozessdaten fischt, könnte es sogar
sein, dass beispielsweise die Bash‐Kommandozeile


( exec -a unison -- sleep -- 180 ) &

dazu führt, dass


systemctl --user is-active unison

einen „unison“‐Treffer findet, obwohl nur ein „sleep“ läuft.

Christian Garbs

unread,
Jul 10, 2023, 6:26:05 PM7/10/23
to
Mahlzeit!


Helmut Waitzmann <nn.th...@xoxy.net> wrote:
> Bastian Blank <use...@waldi.eu.org>:

>> - Man fragt das Session-Management danach:
>> "systemctl --user is-active unison"

> Und je nachdem, woher
>
>
> systemctl --user is-active unison
>
> den Namen „unison“ aus den Prozessdaten fischt, könnte es sogar
> sein, dass beispielsweise die Bash‐Kommandozeile
>
>
> ( exec -a unison -- sleep -- 180 ) &
>
> dazu führt, dass
>
>
> systemctl --user is-active unison
>
> einen „unison“‐Treffer findet, obwohl nur ein „sleep“ läuft.

Das wird garantiert nicht passieren, da "systemctl is-active" nach
systemd-Units sucht. Die Units sind etwas klar definiertes und werden
von systemd selbst verwaltet, ergo ist es die beste Quelle für diese
Informationen und es weiß auch, wann die Units beendet sind¹.

Da wird nicht einfach die Prozessliste durchsucht so wie bei pgrep(1)
oder pidof(8).

Gruß
Christian

¹ Falls jemand eine one-shot-Unit ohne libsystemd0 baut, die einen
Daemon forkt, der nach Beendigung der Unit weiterläuft, so dass
systemd nicht merkt, dass da noch ein Prozess aktiv ist, wäre die Unit
selbst ja trotzdem beendet. Und mehr Informationen als "Unit läuft
gerade" verspricht "systemctl is-active" einem auch nicht ;-)
--
....Christian.Garbs....................................https://www.cgarbs.de
A day without sunshine is like night.

Marc Haber

unread,
Jul 11, 2023, 2:50:18 AM7/11/23
to
Helmut Waitzmann <nn.th...@xoxy.net> wrote:
> den Namen „unison“ aus den Prozessdaten fischt, könnte es sogar
> sein, dass beispielsweise die Bash?Kommandozeile
>
>
> ( exec -a unison -- sleep -- 180 ) &
>
> dazu führt, dass
>
>
> systemctl --user is-active unison
>
> einen „unison“?Treffer findet, obwohl nur ein „sleep“ läuft.

Nein.

Herzlichen Glückwunsch, Du hast einen Vorteil von systemd
identifiziert.

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " |
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834

Helmut Waitzmann

unread,
Jul 11, 2023, 5:13:05 PM7/11/23
to
Marc Haber <mh+usene...@zugschl.us>:
> Helmut Waitzmann <nn.th...@xoxy.net> wrote:
>> den Namen „unison“ aus den Prozessdaten fischt, könnte es sogar
>> sein, dass beispielsweise die Bash?Kommandozeile
>>
>>
>> ( exec -a unison -- sleep -- 180 ) &
>>
>> dazu führt, dass
>>
>>
>> systemctl --user is-active unison
>>
>> einen „unison“?Treffer findet, obwohl nur ein „sleep“ läuft.
>>
>
> Nein.
>
> Herzlichen Glückwunsch, Du hast einen Vorteil von systemd
> identifiziert.
>

Danke für die Klarstellung (auch an Christian).  Das ist in der
Tat ein großer Vorteil von systemd.  Dann haben das unsägliche

ps … | grep …

oder

pgrep …

und irgendwelche PId‐Dateien in den Shell‐Skripten unter
„/etc/init.d/“ endlich ein Ende.  Gut so.


Umgekehrt bedeutet das dann aber auch, dass Bastians Vorschlag,
SystemD für die Fragestellung einzusetzen, von vorne herein nicht
funktioniert, weil in der Aufgabenstellung „unison“ kein systemd
unit ist.

0 new messages