带有引用参数的进程列表,可移植

带有引用参数的进程列表,可移植

如何在不使用proc或任何其他非标准工具的情况下获取在命令行发出的原始命令?

使用 打印进程列表时ps,为启动命令而传入的参数显示时不带引号,这不是原始命令的发出方式。似乎也没有任何ps选项组合可以实现这一目标。

经过一段时间的搜索,甚至查看了很难找到的ps源代码,仍然没有找到简单的答案。目前还有其他帖子提到了同样的问题,但要么没有得到回答,要么提出的解决方案不令人满意。ps源代码可能可以通过编辑来实现必要的结果,但这种方法并不可取,因为它ps实际上是一个非标准包,其编码对于每个操作系统都有很大不同。例如,psMacOS 上的源代码与 ubuntu 上的源代码截然不同ps

答案1

没有可移植的方法来获取另一个进程的命令行的明确表示。您没有找到您正在寻找的答案,因为这是不可能的。您要么需要处理不明确的表示,要么根据代码运行的操作系统使用不同的方法,或者找到为您完成这项工作的人。

POSIX 规范ps没有具体指定该args字段的格式,只是它包含“命令及其所有参数作为字符串”并且它可能会被截断。在实践中,我见过的所有实现都将参数与参数之间用空格连接起来。这是使用 POSIX 所能做到的最好的事情。

如果您想要进程命令行参数的明确表示,您可以在Linux 和其他具有类似 Solaris proc 文件系统的 Unix 变体上找到它(所以不能在 macOS 等 BSD 系统中找到)。参数由空字节分隔,空字节不能出现在参数中,因此表示形式是明确的。我认为没有办法使用 Linux procps实用程序获取此信息,即使有,它也将是特定于 Linux 的,因此它不会更便携(事实上,便携性较差,因为即使查看内部也可以)在具有不同实用程序(例如 BusyBox 中的实用程序)的 Linux 内核上。/proc/PID/cmdlineps/procps

我不知道如何在 macOS 上获得命令行参数的明确表示。

我知道有一个程序完成了不可移植的部分:Python库普苏蒂尔。我可以确认它可以让您获得 Linux 上进程的命令行的明确表示。它也应该适用于 macOS,因为文档没有提到任何限制,但我还没有测试过。

python3 -c 'import os, psutil; print(psutil.Process(os.getpid()).cmdline())'

相关内容