4 Stimmen

Wie man den Prozessbaum eines Skripts in Cygwin bash von einem Bash-Skript aus beendet

Ich habe ein Cygwin-Bash-Skript, das ich überwachen und unter bestimmten Bedingungen beenden muss - insbesondere, nachdem eine bestimmte Datei erstellt wurde. Ich habe jedoch Schwierigkeiten, herauszufinden, wie genau das Skript mit dem gleichen Grad an Vollständigkeit beendet werden kann, wie es Strg+C tut.

Hier ist ein einfaches Skript (genannt test1 ), die kaum mehr tut, als auf ihre Beendigung zu warten.

#!/bin/bash

test -f kill_me && rm kill_me

touch kill_me
tail -f kill_me

Wenn dieses Skript im Vordergrund ausgeführt wird, beendet Strg+C sowohl das tail und das Skript selbst. Wenn das Skript im Hintergrund ausgeführt wird, wird ein kill %1 (vorausgesetzt, es handelt sich um Job 1) werden auch beide tail und das Drehbuch.

Wenn ich jedoch versuche, dasselbe über ein Skript zu tun, stelle ich fest, dass nur die bash Prozess, der das Skript ausführt, beendet wird, während tail von seinem Elternteil losgelöst herumhängt. Hier ist ein Weg, den ich versucht habe ( test2 ):

#!/bin/bash

test -f kill_me && rm kill_me

(
    touch kill_me
    tail -f kill_me
) &

while true; do
    sleep 1
    test -f kill_me && {
        kill %1
        exit
    }
done

Wenn dies ausgeführt wird, wird die im Hintergrund laufende Bash-Subshell ordnungsgemäß beendet, aber tail hängt immer noch herum.

Wenn ich ein explizit separates Skript verwende, wie dieses, funktioniert es immer noch nicht ( test3 ):

#!/bin/bash

test -f kill_me && rm kill_me

# assuming test1 above is included in the same directory
./test1 &

while true; do
    sleep 1
    test -f kill_me && {
        kill %1
        exit
    }
done

tail nach der Ausführung dieses Skripts noch vorhanden ist.

In meinem konkreten Fall ist der Prozess, der die Dateien erstellt, nicht besonders instrumentierbar, so dass ich ihn nicht dazu bringen kann, sich von selbst zu beenden; wenn ich jedoch herausfinde, wann er eine bestimmte Datei erstellt hat, kann ich zu diesem Zeitpunkt wissen, dass es OK ist, ihn zu beenden. Leider kann ich nicht einfach ein killall oder gleichwertig, da möglicherweise mehrere Instanzen laufen und ich nur eine bestimmte Instanz beenden möchte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X