Экран состоит из двух переключаемых списков: обычные процессы и управляемые сервисы. Первый — для наблюдения и чистки, второй — для рутины: кодекс, opencode, локальные модели и всё, что вы сами добавили в список сервисов.
Возможности
- Два режима одним экраном. Чипы сверху переключают список:
processesс числом всех процессов илиservicesс числом сервисов. Число не меняется от поиска и фильтров. Выбор запоминается и восстанавливается при следующем открытии. - Поиск по процессам по командной строке, номеру процесса, номеру родителя и имени пользователя. Совпадение подсвечивается прямо в названии.
- Поиск по сервисам по имени. Совпадение в названии сервиса не подсвечивается — это сделано только у процессов.
- Сортировка процессов шестью способами: по процессору, по памяти, по реально занятой памяти, по номеру, по имени и по времени старта.
- Фильтр процессов тремя режимами: все, только управляемые сервисы и только тяжёлые (процессор или память от 1%).
- Раздел
// hotвверху списка — до трёх процессов с нагрузкой от 1%. Появляется, только когда нет поиска и фильтр стоит на «все». - Цветная полоса процессора на каждой карточке: бирюза — спокойно, янтарь — заметно, красный — горячо. Процесс от 25% помечается треугольником.
- Полоса памяти вторая: сравнивает процесс с самым прожорливым в списке. От 20% памяти полоса становится красной.
- Карточка процесса показывает имя, текущий процент процессора, занятую память в килобайтах, мегабайтах или гигабайтах, состояние процесса, его номер, процент памяти и сколько он уже живёт.
- Детали процесса по тапу: полная командная строка, родитель, пользователь, состояние, момент старта, средняя нагрузка, накопленное время процессора, полный и занятый объём памяти.
- Остановка процесса двумя способами: мягко (SIGTERM — «дай завершиться») и жёстко (SIGKILL — убить сразу). Перед отправкой всегда показывается подтверждение с объяснением разницы.
- Копирование номера процесса, полной команды и порта сервиса в буфер обмена — одной кнопкой.
- Долгий тап по процессу открывает короткое меню: детали, копирование, мягкая остановка, жёсткая остановка.
- Карточка сервиса показывает статус, номер процесса, время работы, порт и открыт ли он, число перезапусков и переключатель автозапуска.
- Управление сервисом прямо на карточке: restart, stop или start — в зависимости от текущего состояния. Плюс кнопка открыть логи.
- Меню сервиса по тапу: перезапуск, остановка или запуск, автозапуск вкл/выкл, логи и копирование порта.
- Логи сервиса в отдельном окне: последние строки, кнопки Reload и Copy.
- Группировка сервисов на
// runningи// stopped, обе группы по алфавиту. - Фильтр сервисов по состоянию (all / running / stopped) — появляется, когда сервисов больше пяти.
- Блок предупреждений
// alertsнад списком: потеряли связь с серверной частью, сервис упал или должен работать, сервис перезапускался слишком часто, зависшие процессы-зомби. По тапу на строку экран переходит к источнику. - Ручное обновление кнопкой в шапке, протяжкой пальцем вниз и кнопкой в нижней панели.
- Автообновление с выбором интервала: 1 секунда, 3 секунды, 10 секунд или выключить совсем. Выбор запоминается.
Технические данные
| Параметр | Значение |
|---|---|
| Интервалы обновления | 1 с, 3 с, 10 с или off (по умолчанию 3 с) |
| Вариантов сортировки | 6 |
| Фильтров процессов | 3: all, managed, heavy |
| Фильтров сервисов | 3: all, running, stopped |
| Порог «тяжёлого» процесса | процессор или память от 1% |
| Порог «горячего» маркера | от 25% процессора |
Сколько процессов в // hot | до 3 |
| Порядок групп сервисов | сначала работающие, потом остановленные |
| Строк сервисного лога в окне | 200 |
| Высота окна логов | до 420 единиц, дальше прокрутка |
| Проверка «жив ли сервис» | каждые 15 секунд |
| Проверка открытости порта | 200 миллисекунд на попытку |
| Источник списка сервисов | один файл с описанием сервисов |
| Что видно в шапке | счётчики, память, время обновления, число тревог |
| На этом устройстве сейчас | 8 ядер, 11.0 ГБ памяти, 33 процесса, 6 сервисов |
| Из них работает сейчас | 1 сервис (codex), остальные остановлены |
| Из них должны работать | 2 сервиса помечены как «должен работать, но стоит» |
Два списка на одном экране
Списка два, и они отвечают на разные вопросы.
Процессы — это всё, что запущено под вашим пользователем: агенты, терминалы, служебные программы, сам бэкенд приложения. Чужие процессы других приложений и пользователей сюда не попадают. Список живой и меняется каждую секунду. Смотреть его нужно, когда что-то тормозит, ест память или подвисло.
Сервисы — это только те программы, которые вы сами внесли в список сервисов как управляемые: с именем, командой запуска, портом и правилом автозапуска. Список короткий и стабильный. Смотреть его нужно, когда «что-то не работает»: кодекс не отвечает, opencode не поднялся, локальная модель молчит.
Сам бэкенд приложения, который собирает данные для этого экрана, в список сервисов не попадает — там только то, что вы настроили сами.
Как читать карточку процесса
Сверху имя программы, справа — её процессор и занятая память. Цвет числа процессора сразу говорит о нагреве: бирюза — меньше 5%, янтарь — от 5%, красный — от 25%.
Под именем идёт строка мелочи: состояние процесса (например R — работает, S — спит; к букве могут добавляться служебные флаги), его номер, сколько процентов памяти он занимает и сколько времени живёт.
Ниже две полосы: cpu — нагрузка на процессор в пределах ста процентов, mem — доля памяти по сравнению с самым тяжёлым процессом в списке.
Значение процессора бывает двух видов. Пока данные собраны в первый раз, показывается средняя нагрузка за всё время жизни процесса с пометкой avg. Со второго запроса к серверной части появляется живое мгновенное значение — оно настоящее и может прыгать. Поэтому первые минуты после запуска сервера карточки показывают средние цифры, а не текущие.
По тапу открывается карточка деталей с полной командной строкой и всеми числовыми полями. Если процесс оказался чьим-то сервисом, в деталях добавится жёлтая строка с именем сервиса и числом перезапусков. Долгий тап открывает короткое меню действий.
Как читать карточку сервиса
Цветная точка и подпись справа — это состояние:
- running — сервис работает.
- starting — запускается, ждите.
- stopping — останавливается.
- error — при запуске была ошибка, её текст показан ниже красным.
- stopped — не работает.
Под именем идёт строка: номер процесса, сколько он работает (up), порт и открыт ли он, а если перезапусков было больше нуля — их число.
Справа чип auto:on или auto:off — автозапуск. Переключается тапом и сразу сохраняется, так что сервис будет стартовать вместе с системой или нет.
Под именем жёлтой строкой может появиться предупреждение вида desired running · actual stopped — это значит, что сервис задуман рабочим, но сейчас не работает. Это не поломка приложения, а напоминание.
Внизу карточки кнопки: у работающего restart и stop, у остановленного start, плюс logs на логи.
Строка мелочи у зависшего процесса становится красной — так зомби и узнаётся ещё до того, как появится предупреждение.
Про предупреждения
Блок // alerts собирает пять видов проблем:
- Серверная часть недоступна. Пока связи нет, обновление не работает, и если списки ещё пусты, вместо них экран покажет ошибку с кнопкой повтора.
- Сервис упал с ошибкой — показывается текст ошибки.
- Сервис должен работать, но не работает — то самое расхождение с планом.
- Сервис перезапускался три и больше раз — частые падения.
- Зависшие процессы-зомби — процессы, которые должны были умереть, но не умерли.
По тапу на строку с сервисом экран переключается на список сервисов и подставляет имя в поиск. По тапу на зомби — переключается на процессы и ищет его по имени. Предупреждение о недоступности сервера просто остаётся на экране: переходить некуда.
Когда набор предупреждений меняется, снизу всплывает короткое сообщение — чтобы не заметить тихо нельзя. Исключение одно: самое первое появление тревог после запуска экрана остаётся молчаливым, его видно только в самом блоке.
Про «порт открыт»
Подпись вида :8789 open означает, что на этом порту кто-то слушает. Это не доказательство, что сервис работает: порт мог занять кто-то другой. Обратная ситуация тоже бывает — сервис живёт, а порт не назначен, и тогда подписи не будет вовсе.
Ориентируйтесь на статус и время работы, а не только на порт.
Почему нет привычной нагрузки на процессор
В большинстве систем есть строка вроде «нагрузка 2.4» — она считается по среднему числу задач в очереди. Телефон эту величину наружу не отдаёт, поэтому вместо неё в шапке показываются честные числа: сколько ядер у устройства и сколько памяти занято из общей, например 7.3/11.0G.
Что агент умеет
Агент может открыть этот экран через мост командой открытия экрана processes. Прочитать содержимое экрана он тоже может, но только если приложение сейчас на экране: ушедшее в фон приложение текст не отдаёт.
Агент также умеет сам ходить в серверную часть за теми же данными, что видит экран: список процессов, сводку по памяти и ядрам, список сервисов с их состоянием. Отдельного специального инструмента для процессов нет — это обычные запросы к локальному серверу.
Управлять сервисами агент тоже может: у него есть мостовые команды списка, запуска, остановки, перезапуска и логов сервисов. Останавливать или убивать процессы агент может, но такая просьба опасна — можно снять сам бэкенд, и связь оборвётся прямо во время работы.
Ограничения
- Автообновление идёт, только пока экран открыт и приложение на экране. Ушли в фон или на другой экран — опрос встал, данные заморозились.
- Интервал в секунду даёт заметную нагрузку: для обычного наблюдения хватает трёх секунд.
- Пока интервал выключен, список обновляется только кнопкой.
- Список сервисов читается при запуске серверной части. Если вы правили файл с сервисами руками, нужен перезапуск серверной части, иначе изменения не подхватятся.
- Переключатель автозапуска, наоборот, сохраняется сразу, перезапуск не нужен.
- Вложенные кавычки в команде сервиса ломают запуск. Правильный путь — вынести длинную команду в отдельный скрипт и указать на него.
- Сервис, который не слушает сетевой порт, в этом списке нормально работать не будет: проверка здоровья идёт по обычному интернету, а без адреса проверять нечего. Таким сервисам нужен свой сетевой адрес.
- Убийство процесса вслепую опасно. Подтверждение есть, но предупреждения «это сам бэкенд, связь сейчас оборвётся» экран не показывает. Обрыв связи случится в тот же момент.
- Число процессов на разных устройствах разное, это нормально.
- Все надписи на экране английские.