Ответ 1
Есть ли какая-либо команда в Linux, через которую я могу узнать, находится ли процесс в зависании.
Нет команды, но однажды мне пришлось сделать очень тупой взломать что-то подобное. Я написал Perl script, который периодически (каждые 30 секунд в моем случае):
- запустите
ps
, чтобы найти список PID наблюдаемых процессов (вместе с временем выполнения и т.д.) - цикл над PID
- start
gdb
прикрепляется к процессу с использованием его PID, отбрасывая трассировку стека из него с помощьюthread apply all where
, отделяя процесс - процесс был объявлен повешенным, если:
- трассировка стека не изменилась и время не изменилось после трех проверок.
- трассировка стека не изменилась, и время указывало на 100% загрузку процессора после трех проверок.
- hanged-процесс был убит, чтобы дать возможность приложению мониторинга перезапустить вешенный экземпляр.
Но это был очень очень очень грубый взломан, сделанный для достижения предельного срока, который был пропущен, и он был удален через несколько дней после того, как исправление для багги-приложения было наконец установлено.
В противном случае, поскольку все остальные респонденты абсолютно правильно прокомментировали, нет способа найти, зависел ли этот процесс или нет: просто потому, что зависание может происходить по многим причинам, часто связанным с логикой приложения.
Единственный способ для самого приложения - указать, жив он или нет. Простейшим способом может быть, например, периодическое сообщение журнала "Я жив".