Вопрос или проблема
Я наблюдаю очень странное поведение.
/proc/1154/cmdline
существует, и kill -0 1154
проходит успешно,
но ps -ef | grep 1154
и ls /proc | grep 1154
ничего не показывают.
1154 был процессом postgres, который находился в процессе завершения (или так говорят логи, но, возможно, они не были сброшены), когда виртуальная машина была перезапущена.
Как это возможно?
Вы наблюдаете побочный эффект работы потоков в Linux.
Поток является процессом (поэтому он отображается в /proc
), но по умолчанию ps
не показывает потоки.
Вам нужно добавить -L
к флагам, чтобы показать потоки.
Так что ps -efL
, чтобы увидеть все потоки и ваш “скрытый” процесс.
Ответ или решение
Ваша ситуация действительно представляет собой интересный пример поведения системы Linux, связанный с управлением процессами и потоками. Давайте более подробно рассмотрим, что происходит в вашем случае с процессом 1154, который связан с PostgreSQL.
Описание проблемы
Проблема заключается в том, что вы можете видеть файл /proc/1154/cmdline
, который указывает на существование процесса с идентификатором 1154. Также команда kill -0 1154
успешна, что значит, что процесс существует. Однако, когда вы выполняете команду ps -ef | grep 1154
, данный процесс не отображается в списке, и аналогично команда ls /proc | grep 1154
также не показывает данный PID.
Возможные причины
-
Порядок завершения процесса: Ваш PostgreSQL процесс, вероятно, находился в состоянии завершения (shutdown), когда произошла перезагрузка виртуальной машины. В таких ситуациях состояние процесса может оставаться видимым в
/proc
, но фактически он может не отображаться в списках активных процессов, так как он уже не выполняет никакие операции. Система может не успевать обновить информацию в момент, когда вы пытаетесь посмотреть состояние процессов. -
Потоки (Threads): В Linux потоки обрабатываются как процессы, но они могут не отображаться в стандартных выводах команды
ps
, если не указаны соответствующие параметры. По умолчаниюps
может не показывать потоки, и для их отображения необходимо использовать флаг-L
. Это значит, что ваша команда для просмотра всех потоков будет выглядеть так:ps -efL
Это позволит вам увидеть все потоки в системе, включая ваш "скрытый" процесс.
-
Кэширование и синхронизация состояния: Виртуальная машина или операционная система могут также использовать кэшированные данные для отображения списка процессов, что может вести к ситуации, когда информация становится несовершенна. В таком случае, процесс может быть в состоянии перехода (transition state) и не полностью видим для инструментов мониторинга.
Рекомендации
- Проверка состояния: Попробуйте использовать команду
top
илиhtop
, чтобы просмотреть инструменты мониторинга в реальном времени, где может быть отображен ваш процесс. - Дополнительные опции ps: Всегда полезно собирать информацию о процессах с помощью различных комбинаций команд. Например, использование
ps aux
илиps -ef
может до некоторой степени прояснить картину. - Логи: Проверьте логи системы и самого PostgreSQL на наличие сообщений о завершении процесса и возможных ошибках, которые могли возникнуть перед перезагрузкой.
Заключение
Понимание работы процессов и потоков в Linux, а также управление их состоянием очень важно для администраторов и разработчиков. Стандартные инструменты командной строки могут быть недостаточны для полного понимания происходящего в системе, и важно использовать полные наборы флагов и параметры. Если вы столкнулись с подобными проблемами, всегда рекомендуется проверять документацию команд или использовать различные инструменты мониторинга для более детального анализа состояния системы.