Jak uruchomić „watch” jako zadanie w tle?


Odpowiedzi:


26

Celem watchjest pokazanie wyników polecenia na pełnym ekranie i ciągła aktualizacja; jeśli przekierowujesz dane wyjściowe do pliku i tworzysz tło, naprawdę nie ma powodu, aby używać zegarka w pierwszej kolejności.

Jeśli chcesz po prostu uruchamiać polecenie w kółko z opóźnieniem ( watchdomyślnie czeka dwie sekundy), możesz użyć czegoś takiego:

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

Czy istnieje sposób, aby to zrobić w sposób nieblokujący? Na przykład, jeśli chcę umieścić to i inne polecenia w jednym skrypcie bash i czy nadal będzie uruchamiał kod, który pojawia się po tym (nadal robiąc to w tle)?
Austin

14

Oto sposób:

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

Ponieważ proces jest tworzony w tle, możemy założyć, że nie potrzebujesz wyświetlacza terminala i możesz przekierowywać do pliku. Jeśli to zrobisz, będziesz mógł w tle watchbez problemu.

sleep, jak sugeruje Michał Mrożek, będzie powoli opóźniał się, co może być niepożądane. Oprócz zawiłego skryptu powłoki, który monitoruje czas systemowy i wykonuje polecenie na podstawie upływu czasu, watch -pmoże być dobrą opcją dla precyzyjnych czasów.

Aby uzyskać dokładne czasy:

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

przepraszam, jak to działa? dlaczego można użyć tylko &dwa razy?
phil294

Przeczytaj sekcję dotyczącą potoku, man bashaby zobaczyć, jak &działa pierwsza . ;)
Mioriin

11

Nie jestem pewien twoich motywacji, ale może to wystarczy?

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

W przeciwnym razie wyjaśnij, dlaczego tak naprawdę potrzebujesz watch.


2

teejest twoim przyjacielem. Na przykład oto, w jaki sposób możesz wyświetlić liczbę plików w bieżącym katalogu i dołączyć ją do count.txt co 2 sekundy:

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

2

Zależy od twoich motywacji:

  • Chcesz coś uruchomić okresowo. Wtedy możesz użyć bezpośrednio crona. (Jeśli dokładność czasu 1 minuta jest wystarczająca dla twoich celów).

    • Uwaga: jeśli interwał jest bardzo krótki lub urządzenie jest bardzo ograniczone, i jeśli nie skonfigurujesz syslog do rejestrowania mniej wiadomości z crond, dość szybko zapełni twój syslog.
  • Chcesz po prostu uruchomić coś wielokrotnie:

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

    (Możesz uruchomić to na przykład z crontab, chociaż wysoce zalecane jest użycie skryptu).

  • Chcesz okresowo uruchamiać polecenie i mieć dostęp do danych wyjściowych jego ostatniego wykonania.

    • Możesz zapisać dane wyjściowe w ramfs (wcześniej modyfikując skrypt):

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

      lub nawet lepiej:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Możesz łączyć screeni watch, dzięki czemu zawsze możesz sprawdzić najnowszy status, o ile mieści się w jednym ekranie:

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


0

Jeśli musisz użyć watch- połącz odpowiedzi Mike'a Dangelo i L0B0

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

na przykład

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

następnie obserwuj upływające sekundy

tail -f output.txt

0

Watch jest zaprojektowany do wyświetlania na ekranie, ale jego wyjście może zostać przekierowane (zarówno stdout, jak i stderr), a następnie będzie działało w tle.

watch 'date >>fa' >/dev/null 2>/dev/null &
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.