我正在从 java 启动安装程序以在 linux 上安装软件,我想知道它的“进程 ID 和图像名称”。
在 Windows 中,我可以使用tasklist
命令获取它,但在 Linux 中我无法做到这一点。我尝试使用ps -ef
和ps -A
命令,但它没有显示图像名称或进程的 PID。
有什么命令可以获取这些值吗?
答案1
大多数现代 Linux 发行版都有方便的命令pgrep
(进程 grep) 就是为此目的而创建的。使用方法如下:
pgrep -lf programname
与 naive 不同ps ax | grep programname
,pgrep
知道如何不显示其自身的进程 ID。
还有一个补充实用程序pkill
,它可以通过名称杀死进程(或发送其他信号)。
答案2
如果它是图形安装程序,您可以在终端中运行此单行命令:
ps -fp $(xprop _NET_WM_PID | cut -d' ' -f3)
你的鼠标光标将变成十字线。现在单击相关窗口。你现在应该会看到终端中打印的进程信息。
答案3
尝试ps -aef | grep your_process_name
,your_process_name
用您的安装程序名称替换。
希望这可以帮助 !!
答案4
看来您正在寻找以 Linux 为中心的解决方案,而不是可移植的解决方案。在 Linux 上,从 Java 获取所需信息的简单、高效且可靠的方法是使用文件系统proc
,尤其是/proc/self
目录。man 5 proc
手册页描述了每个文件。
是pid
的第一个字段/proc/self/stat
。图像名称是 的第二个字段。
编写一个类来包装这些调用非常容易。只需几行代码即可完成基本 IO:快速而强大。使用第三方程序很难做到正确,而且效率较低。
此解决方案不可移植,因为大多数 Unix 系统没有proc
文件系统。在我看来,从最好到最差,您有四个选择:
- 在开始流程之前获取所需的信息:这可能很容易,也可能很难,这取决于你的应用程序
- 查找清洁和系统特定的实现,例如
proc
Linux 的文件系统 - 使用未指定的 API。
RuntimeMXBean.getName()
通常返回pid
,您也可以使用反射来访问java.lang.UnixProcess.pid
。实现可能因 JVM 而异,并且可能随时更改。如果您控制环境,则可以接受解决方案。 - 编写本机代码来访问 POSIX API
- 使用外部工具如
ps
如果您决定依赖外部工具,那么您应该非常小心可移植性(两个操作系统之间的选项和输出可能有很大差异)和区域设置。