如何使用正在运行的程序的PID来获取实际的程序名称?

如何使用正在运行的程序的PID来获取实际的程序名称?

我正在Linux上工作。

给定正在运行的程序的 PID,有没有办法获取用户定义的程序名称?

我想输出程序名称,而不是进程名称。

例如:我有一个java应用程序,名为堆栈溢出.java。现在进程名称将由系统决定,可以不同,但​​程序名称是堆栈溢出.java。因此输出应该是程序名称,仅给出该正在运行的程序的 PID。

有一些命令可以满足部分需求,例如:

cat /proc/"PID"/cmdline-> 这将给出使用给定“PID”创建该进程的命令行参数。但是,如果我们有不同编程语言的各种程序,那么运行该程序的命令的格式将不一样。那么在这种情况下,如何从该命令中提取确切的程序名称呢?

readlink -f /proc/"PID"/exe-> 这将给出与给定“PID”的进程相关的可执行文件名。但有些进程没有可执行文件。在这种情况下,它不会返回任何内容。

事实上我正在大规模地工作。我想查找服务器上运行的所有进程的应用程序名称(或源文件名或程序名称)。所以我不想专门为任何编程语言(如 java、cpp、python 等)硬编码任何内容。请建议我在这方面通用的东西。

答案1

尝试使用有效的<pid>,

/bin/cat /proc/<pid>/comm

这将给出可执行文件的名称。

/bin/ls -lt /proc/<pid>/exe

上面将给出可执行文件的路径。

答案2

你试图定义一个根本不存在的概念。您不会找到超出可执行文件名称的“程序名称”或“应用程序名称”的一般概念。

源文件名s一般来说,不存储在可执行文件中。对于脚本来说,“主要”源文件名是可执行文件,但脚本也使用来自许多其他地方的代码(至少是解释器)。对于已编译的程序,该信息在运行时不可用,除非编译器或构建链特定的东西将其放在那里,而大多数情况下都没有。

查看/proc/$pid/exe给出了可执行文件的路径。所有进程都有一个可执行文件。自进程启动以来,可执行文件可能已被重命名或删除。这是“程序名称”的唯一通用概念。

第一个元素是/proc/$pid/cmdline调用进程时传递的参数 0。该名称由进程的调用者选择。除非调用者特意这样做,否则这通常是可执行文件的基本名称,有或没有目录部分取决于程序是否是通过 PATH 查找调用的。进程可以覆盖这部分,但很少有程序会这样做(大多数情况下,一些守护进程这样做是为了以一种可以轻松查看的方式反映其状态ps)。

Linux 还存储由 报告的进程名称ps -o comm。可以通过 访问它/proc/$pid/status。这是可执行文件的初始基本名称,被截断为 16 个字节。

¹有些条目/procexe链接不可读。这些是内核线程或僵尸,而不是进程。对于所有进程,该链接都是可读的(具有适当的权限),但如果可执行文件已被删除,它可能不会指向现有文件。

答案3

对于这个问题没有通用的解决方案,因为它并不总是可行的。如果我有一个 C 程序,blue.c并且我用

cc blue.c -o green

然后运行可执行文件,如果缺乏诸如搜索我的目录之类的取证措施,green将无法确定源名称是。 blue.c(这个说法至少对于某些 C 编译器是正确的。)

相关内容