我有一个在RedHat Linux实例上运行的Java进程。
问题是我杀死它后它会重新出现。我不确定要看哪里。我已经去过crontab,但是没有运气。
我看过PPID,但它指向init(1)。
知道如何找到来源吗?
at
了其中的任何一个?
我有一个在RedHat Linux实例上运行的Java进程。
问题是我杀死它后它会重新出现。我不确定要看哪里。我已经去过crontab,但是没有运气。
我看过PPID,但它指向init(1)。
知道如何找到来源吗?
at
了其中的任何一个?
Answers:
有很多可能性(其他答案中提到了一些可能性):
/etc/inittab
带有respawn
指令的服务条目,Restart
选项设置为no
,respawn
指令的服务配置文件,monit
或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的前端)。
相信您可以使用pstree
。您可以将命令指定为
pstree -p PID
上面将为您提供Java应用程序的所有父级列表。
您可以看一下它的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
它们产生的,那么它们至少是孤儿。该state
说明符ps
将表明,他们是僵尸(例如,ps -eo pid,ppid,state,comm
); 状态将是Z
。
如果您不知道谁是父母,则应该使用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
确定执行该过程的父母。
ps xf
显示过程树的输出吗?就目前而言,我们几乎没有什么可继续进行的。