为什么我在Linux操作系统上的java进程在我输入“时没有在java命令中显示-classpath”;ps-ef“grep java”吗;?

为什么我在Linux操作系统上的java进程在我输入“时没有在java命令中显示-classpath”;ps-ef“grep java”吗;?,java,linux,shell,hadoop,process,Java,Linux,Shell,Hadoop,Process,当我输入下面的shell命令“ps-ef | grepjava”时,我遇到了关于java命令的这个问题。 我得到了以下命令,显示了两个java进程 第一个进程类似于“java-dxxorg.apache.hadoop.hdfs.server.namenode.namenode”,它没有指定-classpath选项。这个命令让我很困惑,我不知道它如何找到“org.apache.hadoop.hdfs.server.namenode.namenode”类以及它所依赖的其他类或jar 第二个过程类似于

当我输入下面的shell命令“ps-ef | grepjava”时,我遇到了关于java命令的这个问题。 我得到了以下命令,显示了两个java进程

第一个进程类似于“java-dxxorg.apache.hadoop.hdfs.server.namenode.namenode”,它没有指定-classpath选项。这个命令让我很困惑,我不知道它如何找到“org.apache.hadoop.hdfs.server.namenode.namenode”类以及它所依赖的其他类或jar

第二个过程类似于“java-Dxxx-classpath xxx.jar org.apache.hadoop.warn.server.resourcemanager.resourcemanager”,这让我明白了noraml java命令应该是什么样的

有人能帮我解释为什么第一个命令没有类路径吗

//first process

root      4116     1  0 Jan30 ?        00:07:55 /root/jdk1.8.0_181/bin/java -Dproc_namenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/root/hadoop-2.8.5/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/root/hadoop-2.8.5 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/root/hadoop-2.8.5/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/root/hadoop-2.8.5/logs -Dhadoop.log.file=hadoop-root-namenode-hdfs01.log -Dhadoop.home.dir=/root/hadoop-2.8.5 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/root/hadoop-2.8.5/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.NameNode

//second process

root      4595     1  0 Jan30 pts/0    00:28:38 /root/jdk1.8.0_181/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/root/hadoop-2.8.5/logs -Dyarn.log.dir=/root/hadoop-2.8.5/logs -Dhadoop.log.file=yarn-root-resourcemanager-hdfs01.log -Dyarn.log.file=yarn-root-resourcemanager-hdfs01.log -Dyarn.home.dir= -Dyarn.id.str=root -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/root/hadoop-2.8.5/lib/native -Dyarn.policy.file=hadoop-policy.xml -Dhadoop.log.dir=/root/hadoop-2.8.5/logs -Dyarn.log.dir=/root/hadoop-2.8.5/logs -Dhadoop.log.file=yarn-root-resourcemanager-hdfs01.log -Dyarn.log.file=yarn-root-resourcemanager-hdfs01.log -Dyarn.home.dir=/root/hadoop-2.8.5 -Dhadoop.home.dir=/root/hadoop-2.8.5 -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/root/hadoop-2.8.5/lib/native -classpath /root/hadoop-2.8.5/etc/hadoop:/root/hadoop-2.8.5/etc/hadoop:/root/hadoop-2.8.5/etc/hadoop:/root/hadoop-2.8.5/share/hadoop/common/lib/*:/root/hadoop-2.8.5/share/hadoop/common/*:/root/hadoop-2.8.5/share/hadoop/hdfs:/root/hadoop-2.8.5/share/hadoop/hdfs/lib/*:/root/hadoop-2.8.5/share/hadoop/hdfs/*:/root/hadoop-2.8.5/share/hadoop/yarn/lib/*:/root/hadoop-2.8.5/share/hadoop/yarn/*:/root/hadoop-2.8.5/share/hadoop/mapreduce/lib/*:/root/hadoop-2.8.5/share/hadoop/mapreduce/*:/root/hadoop-2.8.5/contrib/capacity-scheduler/*.jar:/root/hadoop-2.8.5/contrib/capacity-scheduler/*.jar:/root/hadoop-2.8.5/contrib/capacity-scheduler/*.jar:/root/hadoop-2.8.5/share/hadoop/yarn/*:/root/hadoop-2.8.5/share/hadoop/yarn/lib/*:/root/hadoop-2.8.5/etc/hadoop/rm-config/log4j.properties org.apache.hadoop.yarn.server.resourcemanager.ResourceManager

脚本运行
export CLASSPATH=$(hadoop CLASSPATH)
或在
$hadoop\u HOME
下查找JAR

-classpath
不是Java参数所必需的


您还可以使用
jps
查看正在运行的Java进程,这是Hadoop文档所建议的

,因为实际执行的
Java
命令没有参数。您需要弄清楚这些命令实际上是如何启动的。我猜有些Hadoop配置文件或Hadoop命令需要指定缺少的
-classpath
。(这可能足以给你一个关于从哪里开始的线索。)检查CLASSPATH环境变量。我想我已经得到了答案,java进程是通过手动指定类路径启动的。但是,如果您不指定它,它将在您的环境变量$CLASSPATH中查找路径,我猜启动java进程的shell进程在启动此java进程之前已经修改了变量$CLASSPATH,但问题是:您不能混合使用
$CLASSPATH
-CLASSPATH
参数。后者取代前者。关于这一点,值得仔细阅读文档。