automatisches Beenden des laufenden Kommandos in einer nicht-interaktiven bash

30/07/2008 - 08:50 von Hauke Laging | Report spam
Moin,

huponexit soll ja nur bei interaktiven Shells helfen (was mir unsinnig
erscheint, aber was soll's...).

Also, wie kriegt man denselben Effekt bei einer nicht-interaktiven Shell
(bash) hin?

(sleep 1000; : tu irgendwas nach dem Timeout)&
watchdog_pid=$!

Wenn der Hauptprozess nun per
kill -HUP $watchdog_pid
den Wàchterprozess entsorgt, dann betrifft das nur die shell; sleep làuft
fröhlich weiter. Meine Prozessliste sieht aus wie ein Massengrab...

Nach dem, was ich bisher gelesen habe, wàren Abartigkeiten der Art
(trap 'kill $sleep_pid' -HUP; sleep 1000&; sleep_pid=$!; wait; ...)&
möglich, aber das sieht ja so krank aus, dass ich es nicht mal ausprobieren
möchte, da suche ich mir lieber die sleep-PID von außen und schieße von da
aus.

Warum legt einem die Shell da solche Steine in den Weg? Wenn man ein Script
wegballert, hat das doch normalerweise seinen Grund...


CU

Hauke
http://www.hauke-laging.de/ideen/
Wie können 59.054.087 Leute nur so dumm sein?
 

Lesen sie die antworten

#1 Helmut Waitzmann
01/08/2008 - 01:24 | Warnen spam
Hauke Laging writes:

huponexit soll ja nur bei interaktiven Shells helfen (was mir unsinnig
erscheint, aber was soll's...).



Bei meinem bash

$ bash --version
GNU bash, version 3.2.25(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

hilft das »shopt«-Option »huponexit« laut Manual-Page nur bei
interaktiven Login-Shells, nicht bei allen interaktiven Shells.

Ist das Shell-Option »huponexit« eingeschaltet, schickt das Shell an alle
jobs, die noch in ihm laufen, ein »HUP«-Signal, bevor es sich selbst
beendet (als Pseudocode):

for job in all jobs known to the shell
do
kill -s HUP -- -"$(job_group_number_of "$job")"
done

Das Signal geht also an die Job-Gruppe eines jeden Jobs.

Nicht-interaktive Shells betreiben aber in der Regel kein Job-Control,
d.h., alle Prozesse, die es startet, befinden sich in der selben
Prozess-Gruppe wie es selbst.

Derselbe Pseudocode würde also das Shell selbst und alle Jobs sofort beim
ersten Schleifendurchlauf treffen. Das dürfte der Grund sein, weshalb
das nicht gemacht wird.

Also, wie kriegt man denselben Effekt bei einer nicht-interaktiven Shell
(bash) hin?



Wenn Du garantieren kannst, dass das nicht-interaktive Shell in einem
eigenen Job-Group làuft (beispielsweise, weil Du es interaktiv gestartet
hast), dann könnte es helfen, das »HUP«-Signal einfach an das Job-Group 0
zu schicken. Damit würden alle Jobs im Job-Group des Shells (und das
Shell selbst) erreicht.

$ kill -s HUP -- 0

Alternativ könnte man mit

$ set -m

eigene Job-Gruppen einschalten und dann sehen, ob man den Pseudo-Code von
oben im nicht-interaktiven Shell umsetzen kann.
Wer mir E-Mail schreiben will, stelle | When writing me e-mail, please
bitte vor meine E-Mail-Adresse meinen | precede my e-mail address with
Vor- und Nachnamen, etwa so: | my full name, like
Helmut Waitzmann , (Helmut Waitzmann)

Ähnliche fragen