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.