Как я могу запустить `watch` в качестве фоновой работы?


Ответы:


26

Цель watchсостоит в том, чтобы показать результаты команды в полноэкранном режиме и постоянно обновлять ее; если вы перенаправляете вывод в файл и создаете фоновый режим, то нет смысла использовать 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, хотя настоятельно рекомендуется использовать скрипт).

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

    • Вы можете записать вывод в ramfs (модифицируя скрипт раньше):

      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- просто объедините ответы Майка Данжело и 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.