/ proc/pid существует, но pid не найден в ps

Вопрос или проблема

Я наблюдаю очень странное поведение.

/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.

Возможные причины

  1. Порядок завершения процесса: Ваш PostgreSQL процесс, вероятно, находился в состоянии завершения (shutdown), когда произошла перезагрузка виртуальной машины. В таких ситуациях состояние процесса может оставаться видимым в /proc, но фактически он может не отображаться в списках активных процессов, так как он уже не выполняет никакие операции. Система может не успевать обновить информацию в момент, когда вы пытаетесь посмотреть состояние процессов.

  2. Потоки (Threads): В Linux потоки обрабатываются как процессы, но они могут не отображаться в стандартных выводах команды ps, если не указаны соответствующие параметры. По умолчанию ps может не показывать потоки, и для их отображения необходимо использовать флаг -L. Это значит, что ваша команда для просмотра всех потоков будет выглядеть так:

    ps -efL

    Это позволит вам увидеть все потоки в системе, включая ваш "скрытый" процесс.

  3. Кэширование и синхронизация состояния: Виртуальная машина или операционная система могут также использовать кэшированные данные для отображения списка процессов, что может вести к ситуации, когда информация становится несовершенна. В таком случае, процесс может быть в состоянии перехода (transition state) и не полностью видим для инструментов мониторинга.

Рекомендации

  • Проверка состояния: Попробуйте использовать команду top или htop, чтобы просмотреть инструменты мониторинга в реальном времени, где может быть отображен ваш процесс.
  • Дополнительные опции ps: Всегда полезно собирать информацию о процессах с помощью различных комбинаций команд. Например, использование ps aux или ps -ef может до некоторой степени прояснить картину.
  • Логи: Проверьте логи системы и самого PostgreSQL на наличие сообщений о завершении процесса и возможных ошибках, которые могли возникнуть перед перезагрузкой.

Заключение

Понимание работы процессов и потоков в Linux, а также управление их состоянием очень важно для администраторов и разработчиков. Стандартные инструменты командной строки могут быть недостаточны для полного понимания происходящего в системе, и важно использовать полные наборы флагов и параметры. Если вы столкнулись с подобными проблемами, всегда рекомендуется проверять документацию команд или использовать различные инструменты мониторинга для более детального анализа состояния системы.

Оцените материал
Добавить комментарий

Капча загружается...