Команда watch в Linux: как периодически запускать команды и следить за изменениями

Кратко: команда watch в Linux автоматически повторяет любую команду с заданным интервалом и обновляет её вывод в терминале. Она удобна для наблюдения за процессами, дисковым пространством, сетевыми подключениями и появлением файлов. В статье — синтаксис, часто используемые опции, шаблоны применения, подсказки и альтернативы.
Что такое команда watch?
Команда watch запускает указанную команду или программу повторно через равные интервалы времени и показывает её вывод в терминале. Вы видите изменения в реальном времени: каждые n секунд экран обновляется и перезаписывает предыдущий вывод. По умолчанию интервал — 2 секунды. Остановить наблюдение можно сочетанием клавиш Ctrl+C.
Кому полезна эта команда: системным администраторам, разработчикам, инженерам DevOps и всем, кто отслеживает динамические изменения в системе.
Синтаксис
watch [опции] <команда>Если не указывать опции, watch повторит команду каждые 2 секунды. Пример простого наблюдения за содержимым домашней директории:
watch ls -l ~/Это покажет список файлов и будет обновлять вывод каждые 2 секунды, поэтому вы сразу заметите создание, удаление или изменение размера файлов.
Основные опции и примеры использования
Ниже — ключевые опции, которые чаще всего нужны на практике.
- -n <секунды> — изменить интервал обновления (по умолчанию 2).
- -d — подсвечивать изменения между обновлениями.
- -t — убрать заголовок (интервал, команда, дата/время).
- -b — проигрывать звуковой сигнал при ненулевом коде выхода команды.
- -g — завершить работу watch при первом изменении вывода.
Интервал обновления (-n)
Чтобы запускать команду, например, каждые 5 секунд:
watch -n 5 <команда>Пример: обновлять информацию о файловой системе каждые 10 секунд:
watch -n 10 df -hПодсветка изменений (-d)
Опция -d подсвечивает разницы между предыдущим и текущим выводом, что помогает быстро заметить изменение значения:
watch -d free -hУбрать заголовок (-t)
Заголовок по умолчанию показывает интервал, команду и текущее время. Если нужен чистый вывод без этой строки, используйте -t:
watch -t ls -lИграть звук при ошибке (-b)
Если команда возвращает ненулевой код выхода (ошибку), опция -b проиграет звуковой сигнал. Это удобно для мониторинга сервисов:
watch -b sudo systemctl status sshd.serviceПримечание: для звуковой индикации может потребоваться установленный пакет beep или настроенная поддержка звука в терминале.
Выйти при изменении вывода (-g)
Опция -g останавливает watch, как только вывод изменится. Это полезно при ожидании события — прихода файла или входа пользователя:
watch -g "ls -l | grep filename" && echo "file arrived"
watch -g "who | grep username" && echo "username logged in"Важно: при использовании каналов (pipe) и цепочек команд оборачивайте всю команду в кавычки.
Когда watch удобен: практические сценарии
- Ожидание появления файла в директории (см. пример выше).
- Наблюдение за статусом службы systemd, чтобы заметить остановку или падение.
- Мониторинг использования диска, памяти или нагрузки CPU во время теста.
- Проверка открытых сокетов и привязанных портов при отладке сервиса.
Шаблоны команд (cheat sheet)
# Обновлять информацию о диске каждые 10 секунд
watch -n 10 df -h
# Показать процессы с подсветкой изменений
watch -d 'ps aux --sort=-%mem | head -n 10'
# Отслеживать слушающие TCP-порты каждую секунду
watch -n 1 ss -tulpn
# Оповещение при падении службы
watch -b sudo systemctl status nginx.service
# Ждать, пока файл появится, затем напечатать сообщение
watch -g "ls -1 /path/to/dir | grep '^important.file$'" && echo "important.file появилcя"Альтернативы и когда watch не подойдёт
- cron — подходит для периодических задач, которые должны выполняться независимо от терминала и сохранять результаты в логи; не подходит для интерактивного наблюдения в реальном времени.
- while loop в shell — можно использовать для тонкой настройки логики между итерациями, для сложной обработки; пример:
while sleep 5; do ls -l ~/; doneinotifywait (из пакета inotify-tools) — эффективнее для отслеживания событий файловой системы без постоянных опросов; полезно для долгосрочного слежения за директориями.
top/htop — интерактивные визуальные утилиты для мониторинга процессов; не подходят, если нужна автоматическая перезапись вывода внешней команды.
Модель принятия решения: когда выбрать watch
- Вам нужен быстрый ручной контроль в терминале — используйте watch.
- Нужны уведомления и автоматизация в фоне — лучше cron + скрипт или systemd timers.
- Нужно реагировать на события файловой системы — используйте inotifywait.
flowchart TD
A[Нужно наблюдать за изменениями?] -->|Да, в терминале| B[watch]
A -->|Да, но в фоне| C[cron / systemd timer]
A -->|Отслеживание файловой системы| D[inotifywait]
B --> E{Команда интерактивна?}
E -->|Да| F[Не использовать watch]
E -->|Нет| G[Использовать watch с -n/-d]Роли и чеклист для быстрого запуска наблюдения
Системный админ:
- Выбрать команду для наблюдения (systemctl, df, ss).
- Определить интервал (-n).
- Добавить -b для звуковых оповещений при ошибках.
- Запустить в отдельной вкладке терминала.
Разработчик:
- Проверить, не конфликтует ли команда с интерактивными режимами.
- Использовать -d для подсветки изменений логов или вывода тестов.
- Закомментировать лишние опции при скриншотах/записи видео.
DevOps/автоматизация:
- Для долговременных проверок применять systemd timer или alerting.
- Для кратковременных тестов — watch в CI-терминале при отладке.
Критерии приёмки
- Команда корректно повторяется через заданный интервал (-n).
- При изменении вывода опция -g завершает наблюдение и возвращает управление.
- При ненулевом коде выхода с -b слышен/функционирует сигнал (если присутствует поддержка звука).
- Подсветка -d выделяет изменённые строки между обновлениями.
Тестовые сценарии
- Тест интервала: запустите watch -n 3 date. Вывод должен обновляться каждые ~3 секунды.
- Тест -d: запустите watch -d ‘echo $RANDOM’. Изменения должны подсвечиваться.
- Тест -g: создайте файл в пустой директории, запустите watch -g “ls | grep testfile”; затем создайте testfile — watch должен завершиться.
- Тест -b: запустите watch -b false. Поскольку команда возвращает код 1, при наличии звуковой поддержки должен сработать сигнал.
Инцидентный план и откат
Если watch вызывает ненужный шум или загружает систему:
- Остановить наблюдение: нажать Ctrl+C в том же терминале.
- Если watch запущен в фоне: найти PID и завершить процесс: pkill -f “\bwatch\b” или ps aux | grep watch и kill
. - Если громкие звуковые сигналы мешают: выключить или перенастроить пакет beep, или запускать без -b.
Важно: не используйте watch для команд, которые запускают интерактивный UI (например, full-screen ncurses-приложения) — результат будет некорректным.
Подсказки по производительности и безопасности
- Частое опрашивание (например, интервал 0.1 с) может повышать нагрузку; выбирайте разумный интервал.
- Команды, требующие ввода пароля (sudo), не подходят для длительного запуска без предварительной настройки NOPASSWD в sudoers.
- Для долгосрочного мониторинга предпочтительнее инструменты с событийной моделью (inotify, systemd) или системы мониторинга (Prometheus, Zabbix).
Советы по локализации вывода и форматированию
- При использовании фильтров (grep, awk) учитывайте локаль и кодировку файлов.
- Если команда выводит много служебных ANSI-последовательностей, можно попытаться очистить цвет (например, использовать –no-color), чтобы подсветка -d работала корректно.
Краткое резюме
Команда watch — простой и быстрый инструмент для наблюдения за изменяющимися выводами команд в терминале. Она полезна для ручного мониторинга и отладки в реальном времени. Для автоматизации, долговременного мониторинга и событийной реакции стоит рассмотреть альтернативы: cron, systemd timers и inotifywait.
Полезные примеры на одном экране
# Наблюдать процессы (каждую секунду) и подсвечивать изменения
watch -n 1 -d 'ps aux --sort=-%cpu | head -n 15'
# Ожидать появления файла и вывести сообщение
watch -g "ls /tmp | grep '^ready.txt$'" && echo "ready.txt появилcя"
# Мониторить сокеты с подробностями
watch -n 2 ss -tulpnЗаключение
Используйте watch для быстрых ручных проверок и отладки. Для постоянного мониторинга и срабатываний на события выбирайте инструменты с событийной архитектурой или интегрируйте оповещения в существующую систему мониторинга.