我正在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 个字节。
¹有些条目/proc
的exe
链接不可读。这些是内核线程或僵尸,而不是进程。对于所有进程,该链接都是可读的(具有适当的权限),但如果可执行文件已被删除,它可能不会指向现有文件。
答案3
对于这个问题没有通用的解决方案,因为它并不总是可行的。如果我有一个 C 程序,blue.c
并且我用
cc blue.c -o green
然后运行可执行文件,如果缺乏诸如搜索我的目录之类的取证措施,green
将无法确定源名称是。 blue.c
(这个说法至少对于某些 C 编译器是正确的。)