首页 > 编程知识 正文

jps命令行查看pid(jps命令报错)

时间:2023-05-05 21:22:54 阅读:102365 作者:2595

Jps位于jdk的酷夜目录,其功能是显示当前系统的java进程及其id号。Jps相当于Solaris进程工具ps。与“pgrep java”或“ps -ef grep java”不同,jps不使用应用程序名称来查找JVM实例。因此,它寻找所有的java应用程序,包括那些不使用Java执行器的应用程序(例如,定制的启动器)。此外,jps只查找当前用户的Java进程,而不是当前系统中的所有进程。

00-1010我们知道很多java命令都在jdk的JAVA_HOME/淡泊之夜/目录下,jps也不例外。他在冷漠之夜目录下,所以他是Java自带的命令。

00-1010JPS (java虚拟机进程状态工具)是JDK 1.5提供的一个命令,用来显示当前所有java进程的pid。简单实用,非常适合在linux/unix平台上简单查看当前Java进程的一些简单情况。

位置

jdk中的jps命令可以显示当前运行的java进程及相关参数,其实现机制如下:java程序启动后,会在java.io.tmpdir指定的目录下生成一个类似hsperfdata_User的文件夹,即临时文件夹。在这个文件夹中(/tmp/hsperfdata_{userName}/在Linux中),有几个文件的名称是java进程的pid,所以要列出当前运行的java进程,只需列出这个目录中的文件。至于系统的参数,我们可以分析这些文件来获取。

solo @ hos :/tmp/hs perf data _ solo $ pwd

/tmp/hsperfdata_solo

solo @ hos :/tmp/hs perf data _ solo $ ll

共计48

DRWXR-XR-x2 Solo Solo 4096 4月16日10336054。/

DrwxRXRWT7根根12288 4月16日10:56./

-rw-1 Solo Solo 32768 4月16日10:57 2679

solo @ hos :/tmp/hs perf data _ solo $

以上内容是我机器中/tmp/hsperfdata_solo目录下的内容,其中2679是我机器上当前运行的java进程的pid。让我们执行jps验证:

solo @ hos :/tmp/hs perf data _ solo $ jps

2679 org . eclipse . equinox . launcher _ 1 . 3 . 0 . v 20130327-1440 . jar

4445 Jps

执行完jps命令后,我们发现有两个java进程,一个是eclipse运行的进程,pid为2679,另一个是jps使用的进程,pid为4445(他也是java命令,也想打开一个进程)

00-1010要学习命令,首先查看帮助,然后使用jps -help查看帮助:

solo @ hos :/tmp/hs perf data _ solo $ jps-help

usage : jps [-帮助]

jps [-q] [-mlvV] [hostid]

定义:

hostid:主机名[:端口]

接下来,为了详细介绍这些参数,我们编写了几个类,并在main方法中编写了一个while(true)循环来检查java进程。代码如下:

打包。JavaCommand

/**

* @作者xx

*/

公共类JpsDemo {

公共静态void main(String[]args){ 0

while(true){ 0

system . out . println(1);

}

}

}

-q只显示pid,不显示类名、jar文件名和传递给主方法的参数。

solo @ hos :/tmp/hs perf data _ solo $ jps-q

2679

11421

-m输出传递给main方法的参数,该参数在嵌入式jvm上可能为null。这里,当启动主方法时,我将两个参数传递给String[] args。Solo,ccx,执行jsp -m:

solo @ hos :/tmp/hs perf data _ solo $ jps-m

12062 JpsDemo solo,ccx

-l输出应用主类的完整包名或应用jar文件的完整路径名。

solo @ hos :/tmp/hs perf data _ solo $ jps-l

12356 sun.tools.jps.Jps

2679/home/solo/tools/eclipse//plugins/org . eclipse . equinox . launcher _ 1 . 3 . 0 . v 20130327-1440 . jar

12329 comJavaCommand.JpsDemo

-v输出参数传递给jvm这里,当启动main方法时,我传递一个参数给JVM: -Dfile.encoding=UTF-8,并执行jps -v:

solo @ hos :/tmp/hs perf data _ solo $ j

ps -v 2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar -Djava.library.path=/usr/lib/jni:/usr/lib/x86_64-linux-gnu/jni -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx512m 13157 Jps -Denv.class.path=/home/solo/tools/java/jdk1.7.0_71/lib:/home/solo/tools/java/jdk1.7.0_71/jre/lib: -Dapplication.home=/home/solo/tools/java/jdk1.7.0_71 -Xms8m 13083 JpsDemo -Dfile.encoding=UTF-8

PS:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。

jps是我最常用的java命令。使用jps可以查看当前有哪些Java进程处于运行状态。如果我运行了一个web应用(使用tomcat、jboss、jetty等启动)的时候,我就可以使用jps查看启动情况。有的时候我想知道这个应用的日志会输出到哪里,或者启动的时候使用了哪些javaagent,那么我可以使用jps -v 查看进程的jvm参数情况。

JPS失效处理

现象: 用ps -ef|grep java能看到启动的java进程,但是用jps查看却不存在该进程的id。待会儿解释过之后就能知道在该情况下,jconsole、jvisualvm可能无法监控该进程,其他java自带工具也可能无法使用

分析: jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题

原因:

(1)、磁盘读写、目录权限问题 若该用户没有权限写/tmp目录或是磁盘已满,则无法创建/tmp/hsperfdata_userName/pid文件。或该文件已经生成,但用户没有读权限

(2)、临时文件丢失,被删除或是定期清理 对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。这也是我第一次碰到该现象的原因。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等

这个导致的现象可能会是这样,用jconsole监控进程,发现在某一时段后进程仍然存在,但是却没有监控信息了。

(3)、java进程信息文件存储地址被设置,不在/tmp目录下 上面我们在介绍时说默认会在/tmp/hsperfdata_userName目录保存进程信息,但由于以上1、2所述原因,可能导致该文件无法生成或是丢失,所以java启动时提供了参数(-Djava.io.tmpdir),可以对这个文件的位置进行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,这是我第二次碰到该现象的原因

附:

1.如何给main传递参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在Program arguments中写下要传的参数值

1.如何给JVM传递参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在VM arguments中写下要传的参数值(一般以-D开头)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。