Wie kann ich "watch" als Hintergrundjob ausführen?


Antworten:


26

Der Zweck von watchist, die Ergebnisse eines Befehls im Vollbildmodus anzuzeigen und fortlaufend zu aktualisieren. Wenn Sie die Ausgabe in eine Datei umleiten und im Hintergrund anzeigen, gibt es eigentlich keinen Grund, watch überhaupt zu verwenden.

Wenn Sie einen Befehl nur immer wieder mit einer Verzögerung ausführen möchten ( watchstandardmäßig zwei Sekunden), können Sie Folgendes verwenden:

while true; do
    cmd >> output.txt
    sleep 2
done

Gibt es eine Möglichkeit, dies nicht blockierend zu tun? Zum Beispiel, wenn ich diesen und andere Befehle in ein einziges Bash-Skript einbinden möchte und es weiterhin den Code ausführt, der danach kommt (während ich dies immer noch im Hintergrund tue)?
Austin

14

Hier ist ein Weg:

watch -n 1 'date' &>/dev/null &

Da Sie den Vorgang im Hintergrund ausführen, können wir davon ausgehen, dass Sie die Terminalanzeige nicht benötigen und problemlos in eine Datei umleiten können. Wenn Sie dies tun, können Sie problemlos Hintergrundinformationen erstellen watch.

sleepWie von Michael Mrozek vorgeschlagen, wird es langsam nacheilen, was unerwünscht sein kann. Abgesehen von einem verschachtelten Shell-Skript, das die Systemzeit überwacht und einen Befehl basierend auf der verstrichenen Zeit ausführt, watch -pkann dies eine gute Option für genaue Zeitabläufe sein.

Für genaue Zeiten:

watch -n 1 -p 'date' &>/dev/null &

Entschuldigung, wie funktioniert das? warum ist es möglich, nur &zwei mal zu verwenden?
Phil294

Lesen Sie den Pipeline-Abschnitt von, um man bashzu sehen, wie das erste &funktioniert. ;)
Mioriin

11

Ich bin mir nicht sicher, was deine Motivation angeht, aber vielleicht würde das ausreichen?

while true; do sleep 2; cmd >>output.txt; done &

Ansonsten erklären Sie bitte, warum Sie wirklich brauchen watch.


2

teeist dein Freund. So können Sie beispielsweise die Anzahl der Dateien im aktuellen Verzeichnis anzeigen und alle 2 Sekunden an count.txt anhängen:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'

2

Kommt auf deine Motivation an:

  • Sie möchten regelmäßig etwas ausführen. Dann könntest du direkt cron benutzen. (Wenn eine Zeitgranularität von 1 Minute für Ihre Zwecke ausreicht).

    • Hinweis: Wenn das Intervall sehr kurz oder das Gerät stark eingeschränkt ist und Sie Syslog nicht so konfigurieren, dass weniger Nachrichten von Crond protokolliert werden, wird Ihr Syslog ziemlich schnell voll.
  • Sie möchten einfach etwas wiederholt ausführen:

    while sleep 2 ; do
      cmd
    done >& log.txt

    (Sie können dies zum Beispiel von der crontab ausführen, obwohl die Verwendung eines Skripts dringend empfohlen wird).

  • Sie möchten einen Befehl regelmäßig ausführen und Zugriff auf die Ausgabe seiner letzten Ausführung haben.

    • Sie können die Ausgabe in ein RAMFS schreiben (vorher das Skript ändern):

      while sleep 2 ; do
        cmd >& last_execution.log
      done 

      oder noch besser:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Sie können screenund kombinieren watch, so dass Sie immer den neuesten Status abrufen können, solange er in einen Bildschirm passt:

      screen watch -n 3660 ./make-backup.sh


0

Wenn Sie verwenden müssen watch- Kombinieren Sie einfach Antworten von Mike Dangelo und l0b0

watch -n 1 'cmd | tee -a output.txt' &>/dev/null &

z.B

watch -n 1 'date | tee -a output.txt' &>/dev/null &

dann schau, wie die Sekunden vergehen

tail -f output.txt

0

Watch wurde für die Ausgabe auf dem Bildschirm entwickelt, aber die Ausgabe kann umgeleitet werden (sowohl stdout als auch stderr), und wird dann im Hintergrund ausgeführt.

watch 'date >>fa' >/dev/null 2>/dev/null &
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.