Зачем гонять команду по кругу
Многие сетевые показатели меняются на глазах: растёт число соединений, появляются и исчезают соседи в таблице ARP, меняется состояние интерфейса. Одиночный запуск ss или ip neigh показывает снимок, а вопрос часто звучит иначе: что происходит сейчас и как это меняется после моих действий.
Можно написать цикл в оболочке, но watch делает то же самое проще. Она запускает указанную команду, очищает экран, показывает свежий результат и ждёт заданное время. Сверху печатается строка с интервалом, самой командой и текущим временем, так что видно, что экран живой, а не завис.
Утилита входит в набор procps и обычно уже установлена в дистрибутивах Linux. Для осмысленной диагностики достаточно двух ключей и умения правильно ставить кавычки. Остановка выполняется сочетанием Ctrl+C.
Ключи watch, которые стоит знать
Список ключей короткий. Полный набор для вашей версии смотрите в man watch.
| Ключ | Что делает |
|---|---|
| -n число | задаёт интервал между запусками в секундах, по умолчанию 2 |
| -d | подсвечивает отличия нового вывода от предыдущего |
| -t | убирает строку заголовка |
| -c | разрешает цветной вывод команды |
| -g | завершает работу, когда вывод изменился |
Интервал можно задавать дробным числом, например 0.5, но очень частый запуск тяжёлых команд нагружает систему, поэтому на практике хватает одной-двух секунд. Ключ -d удобен, когда в выводе много строк, а меняется одна: она подсвечивается, и взгляд сразу находит её. Ключ -g есть не во всех версиях procps; если он поддерживается, он полезен в сценариях ожидания: watch -g запустит команду и закончится, как только результат станет другим.
Кавычки и конвейеры: частая ошибка
Если в команде есть вертикальная черта, перенаправление или несколько команд через точку с запятой, всё выражение нужно взять в кавычки. Иначе оболочка сама разберёт конвейер: watch получит только первую часть, а остальное оболочка отдаст следующей команде. Вместо обновляемого экрана вы получите результат, не имеющий отношения к задуманному.
Сравните два вызова.
- watch -n 1 ss -tan | grep -c ESTAB — неверно: в grep уйдёт вывод самого watch с его экранными управляющими символами.
- watch -n 1 'ss -tan | grep -c ESTAB' — верно: watch каждую секунду запускает всю цепочку целиком и показывает число.
Одинарные кавычки хороши тем, что оболочка не подставляет внутри них переменные раньше времени. Если же переменную нужно подставить сразу, например имя хоста, используйте двойные кавычки, но тогда символы вроде $ придётся экранировать там, где они должны попасть в команду как есть.
Ещё один нюанс: watch запускает команду через оболочку, поэтому алиасы из вашего интерактивного профиля внутри неё обычно недоступны. Если алиас нужен, пропишите настоящую команду.
Практические наблюдения на сетевых командах
Ниже примеры, где повторный запуск даёт больше, чем одиночный. Адреса и интерфейсы подставьте свои.
- Число установленных соединений: watch -n 1 'ss -tan | grep -c ESTAB'. Число растёт при загрузке страницы или файла и падает, когда соединения закрываются.
- Таблица соседей: watch -d ip neigh. Записи меняют состояние, например с REACHABLE на STALE, и подсветка покажет момент перехода.
- Только порты, которые слушает компьютер: watch -n 5 'ss -tln'. Новый порт появится в списке, когда запустится программа, которая его открывает.
- Одна точка доступа: watch -n 1 'ping -c 1 192.0.2.1'. Каждую секунду отправляется один пакет, и видно, отвечает ли адрес. Для длительного наблюдения с записью в файл лучше сам ping с нужными ключами и tee.
Если задача сводится к ожиданию конкретного события, например появления адреса, рядом с watch -g подойдёт цикл while с проверкой условия, но это уже тема скриптов.
watch в macOS и когда нужна замена
В стандартной установке macOS утилиты watch обычно нет. Она доступна через менеджеры пакетов, если вы ими пользуетесь, и ведёт себя так же. Для разовых задач можно использовать цикл оболочки: while true; do clear; ss -tan; sleep 2; done. В macOS вместо ss подставьте netstat -an, потому что ss в системе нет. Цикл завершается по Ctrl+C, как и сам watch.
У цикла есть недостатки по сравнению с watch: он не подсвечивает изменения, не печатает заголовок со временем и не следит за размером окна. Если нужно именно сравнивать выводы, сохраняйте их в файлы и применяйте diff.
Когда интервала в секунды мало, потому что события случаются быстрее, повторный запуск теряет смысл. Для захвата коротких событий нужен другой инструмент: потоковая запись пакетов или журнал, за которым следят через tail -f. Выбор зависит от того, что именно вы ловите: состояние, которое можно опросить, или событие, которое нужно перехватить.
Как читать экран watch
Верхняя строка экрана содержит три части: интервал, команду и текущее время. Если время в правом углу перестало меняться, значит, watch не обновляется: проверьте, не завис ли терминал или не заблокировала ли вывод сама команда, у которой есть собственная долгая работа, например ping без ограничения числа пакетов.
Подсветка при ключе -d показывает отличие от предыдущего запуска, а не от начала наблюдения. Поэтому изменение мигает один раз и исчезает на следующем обновлении. Чтобы не пропустить его, лучше выбирать интервал в пару секунд и не отводить глаз, а для ночного наблюдения писать вывод в файл с отметкой времени.
Если вывод команды длиннее экрана, watch обрезает всё, что не помещается. Тогда либо увеличьте окно терминала, либо сократите вывод фильтрами: сначала grep или head, потом watch. Часть таких приёмов разобрана на страницах про head и grep в этом разделе.
Наконец, помните, что watch показывает состояние на момент запуска, а не историю. Для истории событий используют журнал и tail -f.