Як я можу запустити функцію `watch 'як фонове завдання?


Відповіді:


26

Мета watch- показ результатів команди на весь екран та постійне оновлення; якщо ви переспрямовуєте вихід у файл і перетворюєте його на фоновий малюнок, то насправді немає підстав для використання годинника в першу чергу.

Якщо ви хочете просто запускати команду знову і знову із затримкою ( watchза замовчуванням чекає дві секунди), ви можете використовувати щось подібне:

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

Чи є спосіб це зробити не блокуючим способом? Наприклад, якщо я хочу помістити цю та інші команди в єдиний скрипт bash, і чи продовжувати він виконувати код, що надходить після цього (поки це все роблю у фоновому режимі)?
Остін

14

Ось такий спосіб:

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

Оскільки ви фоновий процес, ми можемо вважати, що вам не потрібен дисплей терміналу, і ви добре переспрямовуєте файл. Якщо ви це зробите, ви зможете виправити фон watchбез проблем.

sleep, як запропонував Майкл Мрозек, буде повільно відставати, що може бути небажаним. Окрім складеного сценарію оболонки, який відстежує системний час та виконує команду на основі минулого часу, watch -pможе бути хорошим варіантом для точних таймінгів.

Точні терміни:

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

Вибачте, як це працює? чому можна просто використовувати &два рази?
phil294

Прочитайте розділ "Трубопровід", man bashщоб побачити, як &працює перший . ;)
Міорійн

11

Я не впевнений у ваших мотиваціях, але, можливо, цього було б достатньо?

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

В іншому випадку, будь ласка, поясніть, навіщо вам це справді потрібно watch.


2

teeтвій друг. Наприклад, ось як можна показати кількість файлів у поточному каталозі та додати його до count.txt кожні 2 секунди:

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

2

Залежить від мотивації:

  • Ви хочете періодично щось запускати. Тоді ви могли використовувати безпосередньо cron. (Якщо детальності часу 1 хвилина достатньо для ваших цілей).

    • Примітка: Якщо інтервал дуже короткий або пристрій дуже обмежений, і якщо ви не налаштуєте syslog, щоб реєструвати менше повідомлень від crond, він досить швидко заповнить ваш syslog.
  • Ви хочете кілька разів запустити щось:

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

    (Ви можете запустити це, наприклад, із crontab, хоча використання сценарію настійно рекомендується).

  • Ви хочете періодично запускати команду і мати доступ до результатів останнього її виконання.

    • Ви можете написати вихід у рамку (змінивши сценарій раніше):

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

      а ще краще:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Ви можете комбінувати screenі watch, щоб ви завжди могли перевірити останній стан, якщо він відповідає одному екрану:

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


0

Якщо вам потрібно скористатися watch- Просто комбінуйте відповіді від Майка dangelo та l0b0

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

напр

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

потім дивіться, як секунди проходять

tail -f output.txt

0

Годинник призначений для виведення на екран, але його вихід можна перенаправляти (як stdout, так і stderr), тоді він буде працювати у фоновому режимі.

watch 'date >>fa' >/dev/null 2>/dev/null &
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.