我有一个在 RedHat Linux 实例上运行的 Java 进程。
问题是它在我杀死它后不断重新出现。我不知道在哪里看。我已经去了 crontab,但没有运气。
我看过 PPID,但它指向 init (1)。
知道如何找到来源吗?
Ste*_*n D 15
有多种可能性(其他答案中提到了一些):
/etc/inittab
带有respawn
指令的服务条目,Restart
选项设置为除no
,以外的值的单元文件respawn
指令的服务配置文件,monit
, 或一个有趣的新(仅限 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 的前端)。
我相信你可以使用pstree
. 您可以将命令指定为,
pstree -p PID
Run Code Online (Sandbox Code Playgroud)
以上将为您提供 Java 应用程序的所有父级列表。
你可以看看它的 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 进程。