如何找到产卵过程的来源?


12

我有一个在RedHat Linux实例上运行的Java进程。

问题是我杀死它后它会重新出现。我不确定要看哪里。我已经去过crontab,但是没有运气。

我看过PPID,但它指向init(1)。

知道如何找到来源吗?


1
你能给我们继续吗?该过程是否写入任何文件?您能告诉我们ps xf显示过程树的输出吗?就目前而言,我们几乎没有什么可继续进行的。
terdon

您说您去过crontab ...您是否还检查at了其中的任何一个?
YoMismo 2014年

能告诉我们您实际上正在运行什么Java软件。我见过像Cassandra这样的工具,实际上它们在某些设置中具有内置的看门狗,一旦第一个实例失败(未正常停止),它便会启动数据库的另一个实例。
Matthias Steinbauer 2014年

Answers:


15

有很多可能性(其他答案中提到了一些可能性):

  1. 经常执行的系统或用户cronjob,
  2. 在SysV初始化中,是/etc/inittab带有respawn指令的服务条目,
  3. 在systemd中,单位文件的Restart选项设置为no
  4. 在Upstart中,是带有respawn指令的服务配置文件,
  5. 流程监控工具,例如monit
  6. 该特定服务的临时监视程序。

sysdig是一个有趣的新工具(仅Linux),它可以提供有关流程开始位置的更多信息

Sysdig使用Linux内核的跟踪点功能来提供相当于快速的系统范围的功能strace

例如,如果我想查看每个进程的开始ls,我可以发出:

sudo sysdig evt.type=execve and evt.arg.exe=ls

ls在某处运行时,我将收到如下消息:

245490 16:53:54.090856066 3 ls (10053) < execve res=0 exe=ls args=--color=auto. tid=10053(ls) pid=10053(ls) ptid=9204(bash) cwd=/home/steved fdlimit=1024 pgft_maj=0 pgft_min=37 vm_size=412 vm_rss=4 vm_swap=0 env=...

我截断了返回的环境信息,但是如您所见,在ptid中,我可以看到调用execve的程序的名称和pid。 execve是Linux中用于执行新命令的系统调用(所有其他exec调用只是execve的前端)。


2
sysdig是一个很好的建议!顺便说一句,它现在可用于功能有限的Windows(和Mac,我认为)。
Neowizard

monit在这里有何帮助?我开始阅读该手册,但它看起来像Nagios的替代品或备份。我没有看到它将如何帮助您跟踪重生过程。
杰斐逊·哈德森

7

相信您可以使用pstree。您可以将命令指定为

pstree -p PID

上面将为您提供Java应用程序的所有父级列表。


1
这不会在所有帮助,为OP已经说了,他看了看PPID,这是1
贡特拉姆布洛姆支持莫妮卡

@GuntramBlohm,请在编辑之前查看原始问题。问题的第一个版本中未提及。
拉梅什2014年

2
叹。另一位在没有标记编辑的情况下使问题成为移动目标的海报:(
Guntram Blohm支持Monica 2014年

5

您可以看一下它的PPID(父进程ID):

$ ps -eo pid,ppid,args | grep java

获得Java流程的PPID(第二列)后,ps再次使用它来查找关联的流程:

$ ps -p [PPID]

编辑:如果父级为1(初始值),则Java进程的第一个父级在“分娩”后就死了(多么可悲)。因此,您无法使用当前流程层次结构来查找它。我建议您做的第一件事是检查ps -ef。您可能只是通过读取输出来找到罪魁祸首。

然后,看一下crontabs(您已经做过了,但是不会受伤):

$ for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done

这将需要root特权。

仍然看不到计划的Java进程吗?该死的。让我们尝试其他事情。如果自启动以来就存在Java进程,请查看启动时列出的程序。我会建议类似...

$ grep -iR java /etc/rc*

如果您仍然找不到任何东西,那么...好吧,我承认我已经没有足够的想法了。您真的应该再看看ps -ef,并找到与基于Java的程序相关联的进程。您应该遇到一个守护进程或一个“启动程序”,该守护程序负责不断刷新Java进程。


我尝试查找父进程,但它只是指向init(PPID = 1)。我将用此信息修改问题。
2014年

@JoseChavez,如果您的PPID为1,则创建的Java进程是僵尸进程。在此处检查此答案
拉梅什2014年

@JoseChavez我编辑了答案,并提供了更多跟踪以调查您的情况。
约翰·史密斯

2
@Ramesh如果PPID是1,它们可以或可以不僵尸。如果它们实际上不是由init它们产生的,那么它们至少是孤儿。该state说明符ps将表明,他们是僵尸(例如,ps -eo pid,ppid,state,comm); 状态将是Z
goldilocks 2014年

1
@goldilocks:如果PPID为1,则它们不是僵尸,除非init进程出现故障;否则,它们不是僵尸。它应该运行一个等待循环,以立即收割所有孤立的僵尸。
hmakholm在莫妮卡(Monica)

1

如果您不知道谁是父母,则应该使用auditd之类的系统跟踪器

您可以通过以下方式启用日志记录:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

然后在如下/var/log/audit/audit.log行中查找:

type=SYSCALL msg=audit(1414027338.620:6232): arch=c000003e syscall=59
success=yes exit=0 a0=7fdea0e4db23 a1=7fffec7c5220 a2=7fffec7c87d0
a3=7fdea1b559d0 items=2 ppid=17176 pid=18182 auid=1000 uid=1000 gid=1000 
euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts8 
ses=2 comm="sh" exe="/bin/dash" key=(null)

(为了便于阅读,分为多行)。您感兴趣exe="/bin/dash"和/或pid=18182确定要查找的胭脂过程,以及ppid=17176确定执行该过程的父母。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.