У меня есть процесс Java, работающий на экземпляре RedHat Linux.
Проблема в том, что он продолжает появляться после того, как я его убил. Я не уверен, где искать. Я уже ходил в crontab, но не повезло.
Я посмотрел на PPID, но он указывает на init (1).
Любая идея, как я могу узнать источник?
ps xf
показа дерева процессов? В нынешнем виде у нас очень мало дела.at
ли один из них?Ответы:
Есть ряд возможностей (некоторые упоминаются в других ответах):
/etc/inittab
запись для службы сrespawn
директивой,Restart
набором опций на значение , отличноеno
,respawn
директивой,monit
, илиSysdig - интересный новый инструмент (только для Linux), который может дать более полное представление о том, где запускается процесс .
Sysdig использует функции трассировки ядра Linux, чтобы обеспечить быстродействие всей системы
strace
.Например, если я хочу увидеть запуск каждого процесса
ls
, я могу выдать:Когда
ls
где-то запускается, я получу сообщение, подобное этому:Я обрезал возвращаемую информацию об окружении, но, как вы можете видеть, в ptid я вижу имя и pid программы, вызывающей execve.
execve
системный вызов, используемый в Linux для выполнения новых команд (все остальные вызовы exec являются только внешними интерфейсами для выполнения).источник
Я считаю, что вы могли бы использовать
pstree
. Вы можете указать команду как,Выше приведен список всех родителей Java-приложений.
источник
Вы можете взглянуть на его PPID (идентификатор родительского процесса):
Как только вы получите PPID (второй столбец) вашего Java-процесса, используйте
ps
снова, чтобы найти связанный процесс:Редактировать : если родитель - 1 (init), то первый родитель вашего Java-процесса умер сразу после «рождения» (как печально). Из-за этого вы не можете использовать текущую иерархию процессов, чтобы найти ее. Первое, что я бы порекомендовал вам сделать, это проверить
ps -ef
. Вы можете найти виновника, просто прочитав вывод.Затем взгляните на crontabs (вы уже сделали это, но это не повредит):
Это потребует привилегий суперпользователя.
Все еще не видите запланированный процесс Java? Черт возьми. Давайте попробуем что-нибудь еще. Если ваш Java-процесс присутствует с момента загрузки, посмотрите на программы, запланированные во время загрузки. Я бы предложил что-то вроде ...
Если вы все еще не можете найти что-то, то ... Я признаю, что у меня заканчиваются идеи. Вам действительно нужно по-другому взглянуть
ps -ef
и найти процессы, связанные с Java-программами. Вы должны столкнуться с демоном или «пусковой установкой», ответственной за постоянное возрождение вашего Java-процесса.источник
init
созданы, они, по крайней мере, сироты . Спецификаторstate
tops
покажет, являются ли они зомби (например,ps -eo pid,ppid,state,comm
); состояние будетZ
.Если вы не знаете, кто является родителем, вам следует использовать какой-нибудь системный трейсер, например, audd
Вы бы включили регистрацию с помощью:
а затем в
/var/log/audit/audit.log
строке найти, как:(разбит на несколько строк для удобства чтения). Вы интересуетесь
exe="/bin/dash"
и / илиpid=18182
которые идентифицируют ваш процесс румян, который вы хотите найти, иppid=17176
который определяет родителя, который его выполнил.источник