如何获取启动进程的命令行
Posted
技术标签:
【中文标题】如何获取启动进程的命令行【英文标题】:How do I get the commandline that started the process 【发布时间】:2011-02-02 06:05:06 【问题描述】:从 Java 中,是否可以获得包含启动应用程序的所有参数的完整命令行?
System.getEnv()
和 System.getProperties()
似乎不包含这些值。
【问题讨论】:
你的意思是也提供给jvm的参数吗?有一个与***.com/questions/1490869/…相关的问题@ 【参考方案1】:其中一些可从 RuntimeMXBean 获得,通过调用 ManagementFactory.getRuntimeMXBean()
获得
然后你可以打电话给getInputArguments()
javadocs 说:
返回传递给 Java 虚拟机的输入参数,其中不包括 main 方法的参数。如果 Java 虚拟机没有输入参数,则此方法返回一个空列表。
一些 Java 虚拟机实现可能会从多个不同来源获取输入参数:例如,从启动 Java 虚拟机的应用程序传递的参数(如“java”命令、环境变量、配置文件等)。
通常,并非“java”命令的所有命令行选项都传递给 Java 虚拟机。因此,返回的输入参数可能不包括所有命令行选项。
【讨论】:
我认为这是使用纯 Java 可以获得的最佳效果。 @Stephen Denne ... 不喜欢这个。我对这个问题的理解是获取命令行(用命令字符串说出ps -f
中显示的内容。正如手册页所说,“不包括主要方法的参数。”对现在,我正在尝试确定哪些其他程序正在传递给我的班级不可见的main
。【参考方案2】:
在 Linux 中,当您获得该命令的输出(在 shell 中运行)时,这应该是可能的
cat /proc/$PPID/cmdline
但这根本不是可移植的,因此不应该在 Java 中使用...
【讨论】:
好的,谢谢。如果它不是便携式的也没关系,但是我也需要它在 Windows 上工作。 @aksamit - 换句话说,您需要它能够在(至少)Linux 和 Windows 之间移植......呵呵! @Johannes - “因此不应该在Java中使用”太强了。在 Java 中编写不可移植的代码并不是完全错误的……如果情况需要的话。 @Johannes Weiß:所以当 Sun 决定将 Runtime.exec 放入正确的位置时,他们到底在哪里呢?我的意思是,它显然根本没有必要,应该从语言中删除以取悦“纯 Java 之神”?还是?【参考方案3】:以下链接可能会帮助您到达那里:
How to get command line arguments for a running process
get command-line of running processes
How to get a list of current open windows/process with Java?
就像一个注释:
在 Windows 中,Process Explorer by Sysinternals 显示用于打开进程的命令行。右键单击该进程并选择属性...您将在打开的窗口中看到命令行。
【讨论】:
【参考方案4】:您可能想了解jps
是如何做到这一点的。它是一个 Java 程序,能够获取所有 Java 进程的完整命令行,包括主类的完整类名和 JVM 选项。
【讨论】:
【参考方案5】:有一个环境变量 %~dp0 返回完整路径
【讨论】:
哎呀..我忘了它在 Windows 中。对于批处理文件运行切换到 UNC 路径非常有用。例如 UNC 路径 \\Server\share\folder1\runit.bat 如果批处理的第一行是 pushd %~dp0 那么您当前的路径将是 \\Server\share\folder1\ 该答案与我发现此问题的原因无关,但对了解很有用。 System.getenv("%~dp0") 在 Windows 上也返回 null。【参考方案6】:看看 YAJSW(Yet Another Java Service Wrapper)——它具有针对各种操作系统(包括 win32 和 linux)的基于 JNA 的实现,它们正是这样做的,因此它可以获取正在运行的进程的命令行并创建一个配置将其包装在服务中。更多信息here。
【讨论】:
【参考方案7】:我过去用来维护跨平台光泽的一个选项是在发出命令之前将命令行设置为环境变量。
【讨论】:
【参考方案8】:如果您使用 solaris 作为操作系统,请查看“pargs”实用程序。打印所有需要的信息。
【讨论】:
【参考方案9】:由于Java 9你可以使用ProcessHandle来获取进程的命令行:
ProcessHandle.current().info().commandLine()
【讨论】:
以上是关于如何获取启动进程的命令行的主要内容,如果未能解决你的问题,请参考以下文章