Code: Alles auswählen
mywatch() {
# $1 Befehl(e), deren Ausgabe überwacht werden soll
# Befehl wird einmal pro Sekunde aufgerufen.
# Verändert sich dessen Ausgabe, beendet sich watch.
watch --interval 1 --chgexit --no-title -- "${1:-}" >/dev/null 2>&1
}
Code: Alles auswählen
# Überwache, ob ein Programm mit pid PID noch läuft
mywatch "ps -p PID"
Mein selbst gestrickter Ersatz funktioniert:
Code: Alles auswählen
Watchoutput="$(sh -c "${1:-}" 2>&1)"
while sleep 1 ; do
[ "$Watchoutput" = "$(sh -c "${1:-}" 2>&1)" ] || break
done
Ich rufe mywatch mehrmals innerhalb eines Skriptes auf. Von dem Skript selbst habe ich auch oft mehrere Instanzen am Laufen.
"ps aux | grep sleep" gibt dann viele Treffer. Ok, "ps aux | grep watch" würde das auch tun.
Unterschied: In grafischen Task Managern sind nicht nur die laufenden "sleep" zu sehen, sondern auch alle, die gerade beendet werden. Das führt bei mir zu seitenweise häßlichen "sleep" Einträgen. Mit watch habe ich das Problem nicht.
Vielleicht ist es ein Luxusproblem, das ich hier habe.
Sehr schade, daß ein uraltes Tool wie watch aus den coreutils anscheinend einen uralten Bug hat.
Gibt es eine Alternative zu watch, die ohne eine sleep-Schleife auskommt?