Подтвердить что ты не робот

Как проверить, находится ли процесс в зависании (Linux)

Есть ли какая-либо команда в Linux, через которую я могу узнать, находится ли процесс в зависании.

4b9b3361

Ответ 1

Есть ли какая-либо команда в Linux, через которую я могу узнать, находится ли процесс в зависании.

Нет команды, но однажды мне пришлось сделать очень тупой взломать что-то подобное. Я написал Perl script, который периодически (каждые 30 секунд в моем случае):

  • запустите ps, чтобы найти список PID наблюдаемых процессов (вместе с временем выполнения и т.д.)
  • цикл над PID
  • start gdb прикрепляется к процессу с использованием его PID, отбрасывая трассировку стека из него с помощью thread apply all where, отделяя процесс
  • процесс был объявлен повешенным, если:
    • трассировка стека не изменилась и время не изменилось после трех проверок.
    • трассировка стека не изменилась, и время указывало на 100% загрузку процессора после трех проверок.
  • hanged-процесс был убит, чтобы дать возможность приложению мониторинга перезапустить вешенный экземпляр.

Но это был очень очень очень грубый взломан, сделанный для достижения предельного срока, который был пропущен, и он был удален через несколько дней после того, как исправление для багги-приложения было наконец установлено.

В противном случае, поскольку все остальные респонденты абсолютно правильно прокомментировали, нет способа найти, зависел ли этот процесс или нет: просто потому, что зависание может происходить по многим причинам, часто связанным с логикой приложения.

Единственный способ для самого приложения - указать, жив он или нет. Простейшим способом может быть, например, периодическое сообщение журнала "Я жив".

Ответ 2

вы можете проверить файлы

/proc/[pid]/task/[thread ids]/status

Ответ 3

Что вы подразумеваете под "зависанием"? Как правило, процесс, который не отвечает и использует 100% CPU, застревает в бесконечном цикле. Но нет способа определить, произошло ли это или не может ли процесс в конечном итоге достичь состояния выхода цикла и продолжить.

Детекторы рабочего стола просто работают, отправляя сообщение в цикл событий приложения и видя, есть ли какой-либо ответ. Если там не на какое-то время они решат, что приложение "висело"... но вполне возможно, что это просто делало что-то сложное и вернется к жизни через мгновение после его завершения. Во всяком случае, это не то, что вы можете использовать для любого произвольного процесса.

Ответ 4

К сожалению, для процесса не существует зависания. Теперь висит может быть тупик. Это состояние блока. Потоки в процессе блокируются. Другие вещи могут быть живым замком, где выполняется процесс, но повторяя одно и то же снова и снова. Этот процесс находится в рабочем состоянии. Итак, вы видите, что нет определенного висячего состояния. Как и было предложено, вы можете использовать верхнюю команду, чтобы узнать, использует ли процесс 100% процессор или много памяти.