我在几台机器上遇到了一个问题,某个进程占用了 CPU 的 100% 时间。
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 85740 100.0 0.2 34668 6352 ?? R 12:06AM 472:20.86 /usr/bin/javad (perl5.12.4)
目前,这个过程已经运行了近8个多小时:
# ps -p 85740 -o etime=
08:05:25
# ps -auxeww
显示完整命令为:root 29323 99.0 0.2 32292 6692 ?? R 11:21PM 596:50.14 SUDO_COMMAND=/usr/local/bin/bash LOGNAME=root MAIL=/var/mail/root PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/fgz/bin SUDO_GID=1004 OLDPWD=/usr/local PWD=/usr/local/jboss4/bin _=./start.sh TERM=xterm USER=root HOME=/root SHELL=/usr/local/bin/bash SUDO_USER=fgz SUDO_UID=1004 USERNAME=root JBOSS_HOME=/usr/local/jboss4 SHLVL=1 /usr/bin/javad (perl5.12.4)
在这台特定的机器上,我们安装了 JBoss AS(其他机器上也安装了)。
我将非常感激任何有关如何启动此过程的提示。在/etc/crontab
或中,crontab -l
我没有任何可以启动 perl 的操作。
有趣的是:
# ls -al /usr/bin/javad
ls: /usr/bin/javad: No such file or directory
当进程仍在运行时。
正在运行的其他 Java 进程:
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 1322 0.0 0.0 14688 1344 0- I 24Jun13 0:00.00 /bin/sh ./run.sh -b 10.0.5.9
root 1334 0.0 11.8 2465148 493584 0- I 24Jun13 40:40.66 [java]
run.sh
JBoss Bootstrap 脚本在哪里。
答案1
每当我看到 perl 在运行 JBoss 的机器上消耗 100% 的 CPU 时,我都愿意打赌该机器已被蠕虫感染。
就在今天早上,我还发现在安装了 JBoss AS 的 Linux 机器上运行着一个不存在的 /usr/bin/javad。调查显示,存在一个安全漏洞 - 罗马尼亚的某个人访问了 /invoker/JMXInvokerServlet 并设法在服务器上部署了一个“Web 应用程序”(是的!)。您应该检查这个“invoker”是否可以在您的服务器上访问。如果可以,下一个问题是,它真的有必要吗?就我而言,我只是删除了它(通过删除 $JBOSS_HOME/server/default/deploy/http-invoker.sar 目录),重新启动了 JBoss 并验证了 Web 应用程序仍在运行。
答案2
答案3
以下是一篇关于监控Java进程的文章:http://www.ibm.com/developerworks/library/j-5things8/
最有用的工具是jstack
。如果您的系统上安装了它,那么可以使用它来显示繁忙进程正在做什么。我应该提到jstack
是一个命令行工具。您可以将其与繁忙 Java 进程的进程 ID 一起使用。它应该提供该进程中每个线程的堆栈转储。大多数线程应该等待同步对象(表明它们不忙,没有使用任何 CPU)。
如果不存在,jstack
您可以向进程发送适当的信号 - 但找到堆栈被转储的位置可能是一个挑战。参见https://stackoverflow.com/questions/3734696/how-to-get-stack-trace-of-a-thread了解详情。