Alternative für watch

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Alternative für watch

Beitrag von MartinV » 09.05.2018 11:14:20

Ich nutze den Befehl watch in einer Funktion mywatch, die die Ausgabe von ein paar Terminalbefehlen beobachten soll. Verändert sich die Ausgabe, wird die Funktion mywatch beendet.

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 
}
Ein Aufruf kann z.B. sein:

Code: Alles auswählen

# Überwache, ob ein Programm mit pid PID noch läuft
mywatch "ps -p PID"
Problem: watch ist unzuverlässig. Es funktioniert in 98% der Fälle, aber manchmal versagt es. Obwohl sich die Ausgabe des Befehls ändert, beendet es sich manchmal nicht. Möglicher Bug dazu: https://unix.stackexchange.com/a/101099/185747

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
Nachteil von meinem Ersatzcode:
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?
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Alternative für watch

Beitrag von breakthewall » 09.05.2018 14:50:29

Du könntest den Output jeweiliger Prozesse, auch grundsätzlich temporär in eine Datei oder mehrere Dateien umleiten lassen. Dann kannst mittels grep oder IF-Bedingung in einer while-Schleife, ebenso periodisch nach Veränderungen suchen, bei denen entsprechend reagiert werden soll. Sollte der Output mitunter sensibel sein, dann wäre /dev/shm sinnvoll als Speicherort, um Spuren auf dem Datenträger zu vermeiden. Auf diese Weise brauchst watch erst garnicht.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Alternative für watch

Beitrag von MartinV » 09.05.2018 14:59:56

breakthewall hat geschrieben: ↑ zum Beitrag ↑
09.05.2018 14:50:29
Dann kannst mittels grep oder IF-Bedingung in einer while-Schleife, ebenso periodisch nach Veränderungen suchen, bei denen entsprechend reagiert werden soll.
Das macht ja bereits mein Ersatzcode: In einer while-Schleife periodisch auf Veränderungen prüfen. Periodisch wird es durch den Aufruf von "sleep 1". (Ohne "sleep 1" bringt die Schleife die CPU zum Glühen).

Oder gibt es eine Alternative für einen periodischen Aufruf ohne sleep?
Ich denke mal, ein cronjob wird mit einem unprivilegiertem Skript nicht möglich sein. Oder?
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
Meillo
Moderator
Beiträge: 9230
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Alternative für watch

Beitrag von Meillo » 09.05.2018 15:13:14

MartinV hat geschrieben: ↑ zum Beitrag ↑
09.05.2018 14:59:56
Ich denke mal, ein cronjob wird mit einem unprivilegiertem Skript nicht möglich sein. Oder?
Klar geht das. Wenn dein User Cronjobs anlegen darf, dann kann er damit jedes interaktiv genutzte Kommando oder Script auch als Crontob ausfuehren lassen. (Man muss halt auf Pfadangaben und Co. achten, wie bei jedem Cronjob.)


... und dass das geht, ist vollkommen stimmig und natuerlich zu der Idee und Entstehungsgeschichte von Unix: Ein Betriebssystem, das eine Gruppe von Programmierern fuer die eigenen Zwecke geschrieben hat. Jeder User soll, soweit vertretbar, alle Moeglichkeiten haben, die root auch hat. So kann er sein System anpassen, er kann Software fuer sich selbst installieren, er kann seine eigene Shell waehlen, usw. Es gibt nur wenige Dinge, die root vorenthalten sind, und die haben gute Gruende. -- Das jedenfalls ist wo Unix herkommt.
Use ed once in a while!

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Alternative für watch

Beitrag von MartinV » 14.05.2018 16:37:02

Meillo hat geschrieben: ↑ zum Beitrag ↑
09.05.2018 15:13:14
Klar geht das. Wenn dein User Cronjobs anlegen darf, dann kann er damit jedes interaktiv genutzte Kommando oder Script auch als Crontob ausfuehren lassen.
Tatsächlich! Das ist gut.

Ich habe mir daraufhin cron erstmals näher angeschaut.
Ich fürchte, für meinen Zweck ist es nicht das richtige Werkzeug, auch wenn es den Zweck erfüllen könnte.

Vom Konzept ist cron nicht dafür ausgelegt, einem Programm kurzzeitig dienlich zu sein, eher für sitzungsübergreifende Einstellungen.
Regeln werden mit crontab geschrieben und können bei Bedarf wieder entfernt werden. Das könnte ich wohl auch tun, beim Skriptstart meine Wünsche eintragen und beim Beenden des Skriptes wieder entfernen.
Sollte mein Script aber übel abgewürgt werden, ohne die crontab sauber zurücksetzen zu können, bleiben sinnlose Aufträge darin stehen.

Eigentlich brauche ich ein "temporäres cron". Gibt es so etwas?

Vorerst bleibe ich wohl bei der while-sleep Schleife.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Antworten