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

Jos*_*ose 12 process kill

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

问题是它在我杀死它后不断重新出现。我不知道在哪里看。我已经去了 crontab,但没有运气。

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

知道如何找到来源吗?

Ste*_*n D 15

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

  1. 经常执行的系统或用户 cronjob,
  2. 在 SysV init 中,/etc/inittab带有respawn指令的服务条目,
  3. 在 systemd 中,将Restart选项设置为除no,以外的值的单元文件
  4. 在 Upstart 中,一个带有respawn指令的服务配置文件,
  5. 流程监控工具,例如monit, 或
  6. 该特定服务的临时看门狗进程。

一个有趣的新(仅限 linux)工具可以更深入地了解进程的启动位置是sysdig

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

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

sudo sysdig evt.type=execve and evt.arg.exe=ls
Run Code Online (Sandbox Code Playgroud)

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=...
Run Code Online (Sandbox Code Playgroud)

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

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

Ram*_*esh 7

我相信你可以使用pstree. 您可以将命令指定为,

pstree -p PID
Run Code Online (Sandbox Code Playgroud)

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

  • 叹。另一位发帖者将他的问题作为移动目标而没有标记他的编辑:( (2认同)

Joh*_*ith 5

你可以看看它的 PPID(父进程 ID):

$ ps -eo pid,ppid,args | grep java
Run Code Online (Sandbox Code Playgroud)

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

$ ps -p [PPID]
Run Code Online (Sandbox Code Playgroud)

编辑:如果父进程是 1 (init),那么你的 Java 进程的第一个父进程在“生孩子”之后就死了(多么悲伤)。因此,您无法使用当前进程层次结构来查找它。我建议您做的第一件事是检查ps -ef. 您可能仅通过阅读输出就可以找到罪魁祸首。

然后,看看 crontabs(你已经这样做了,但它不会受到伤害):

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

这将需要 root 权限。

仍然看不到已安排的 Java 进程?该死的。让我们试试别的。如果您的 Java 进程自启动以来就存在,请查看在启动时安排的程序。我会建议像...

$ grep -iR java /etc/rc*
Run Code Online (Sandbox Code Playgroud)

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

  • @Ramesh 如果 PPID 为 1,它们可能*也可能不是* [僵尸](http://en.wikipedia.org/wiki/Zombie_process)。如果它们实际上不是由 `init` 产生的,它们至少是 [孤儿](http://en.wikipedia.org/wiki/Orphan_process)。`ps` 的 `state` 说明符将显示它们是否是僵尸(例如,`ps -eo pid,ppid,state,comm`);状态将是“Z”。 (2认同)