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

19

Wenn ich renne:

watch 'cmd >> output.txt' &

Der Job wird vom System angehalten:

3569 gestoppt (tty Ausgabe)

Gibt es eine Problemumgehung?

Juliusz
quelle

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
Michael Mrozek
quelle
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 &
Mike Dangelo
quelle
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.

Stéphane Gimenez
quelle
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'
l0b0
quelle
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
Raúl Salinas-Monteagudo
quelle
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
SDK
quelle
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 &
X Tian
quelle