获取 AIX 上正在运行的进程的可执行文件的完整路径

Posted

技术标签:

【中文标题】获取 AIX 上正在运行的进程的可执行文件的完整路径【英文标题】:Get full path of executable of running process on AIX 【发布时间】:2011-09-19 16:06:06 【问题描述】:

这与Get full path of executable of running process on HPUX… 最相似,AIX 除外。

基本问题是:在 AIX 上,我如何确定当前可执行文件的完整路径?在做任何其他事情之前必须这样做(例如,chdir)很好。

到目前为止,我找到的最准确的答案是检查来自svmon -P $$ -O format=nolimit,filename=on,filtertype=client的输出 (其中 $$ 有其 shell 含义:当前 pid)。这不仅是大量的 C,而且 svmon 也不是很快,很容易压倒应用程序其余部分的运行时间。

下一个最佳答案似乎是简单地查看argv[0],如果它有一个斜杠,它要么是完整路径名(以前导 / 开头)要么是相对于当前目录名称(不以前导 / 开头)。如果它没有斜线,则它与PATH 中的某些内容相关。 如果在这个解决方案之后,我最终得到了一个符号链接,那么还有符号链接的所有解决方案都需要处理(硬链接可能超出了任何解决方案的范围)。这个方案看起来是比较跨平台的,但是C代码也很重(应该比svmon快)。而且我希望有竞争条件等需要处理。

谢谢,

更新:我正在寻找提交给 perl 开发人员的解决方案。他们会担心不安全的PATH,尤其是在setuid/setgid 场景中。见perlsec。我认为我们在这里可以没问题,但是如果您将setuid 与伪造argv[0] 结合使用,您可能会迫使perl 认为它在其他地方,并加载错误的模块。上面的“次佳”答案只有在不处于 perl 的污染模式时才真正有效。

【问题讨论】:

查看this similar question。 检查***.com/questions/933850/… 我想在库中执行此操作,以便将其放入错误日志中,并且我不能合理地要求我的调用者传入argv[0] 【参考方案1】:

为什么不能使用ps 选项作为基线?当然,您仍然需要处理 cmd 值以查看是否有前导“/”。类似的东西

ps -o pid,env,cwd,cmd | grep youAppName | awk -f programToRationalizePathName 

我无法再访问 AIX,但我确实在它上面工作了 2 1/2 年,而且我知道我已经使用过这种功能。我不认为它很慢,但我可能有与你不同的要求。

我得到的印象是你想要一个实用函数,一个返回完整路径的一次调用,但是如果你需要一个持续的过程并且担心每 1 分钟重新启动 ps(例如) ,查看 AIX 特定的 nmon 实用程序。不确定它是否可以生成类似于ps -o cmd 的输出,但它可以设置为根据需要运行,只要你想运行就可以(低至 1 秒间隔),它只是一个进程,其输出可以是根据需要重定向。 (Nmon 不是 std 安装的一部分,但大多数组织都会安装它,因为它是 IBM 祝福的(如果不直接支持的话)。

当然,所有“不是 100%”的警告都适用于您和 cmets 中提到的类似问题。

我希望这会有所帮助。

【讨论】:

我尝试了你建议的命令,但是这给了我一个非常好的错误,因为 ps 选项不正确 在我的情况下 envcwd 标志不存在,正确的合成器是 ps -o=pid,cmd 并且该命令不一定显示完整路径。 hm.. 是的,我的 Linux 也没有 cwd,不确定我在哪里找到的。我假设您是因为 AIX 而发现这个问题的?我不记得了,AIX 是否支持 /proc/$PID ?如果是这样,(并且您需要 cwd)您可能会发现它是一个子值。如果您有一个活跃的用例,请发布一个问题。祝你好运! 当然你可以把当前的pid传给ps,去掉grep @PJTraill :是的,我仍然不确定 O.P.s 用例是什么。标题说明了一件事,长篇说明说明了另一件事。随时发布答案 ;-) 祝大家好运。【参考方案2】:

使用ps获取可执行路径地址

ps -aef | grep 应用程序 | awk 'print $8'

上面的命令给出了你的应用程序的可执行路径地址

【讨论】:

在 AIX ps -aef | grep app | awk 'print $8' 中尝试过,结果肯定是不是可执行文件的完整路径名。

以上是关于获取 AIX 上正在运行的进程的可执行文件的完整路径的主要内容,如果未能解决你的问题,请参考以下文章

Linux API 列出正在运行的进程? - 有论据

AIX 运行时错误:符号 __dbargs(编号 191)未从依赖项导出

从另一个基于 C 的可执行文件获取 MAC os 中的进程 cmdline

列出 AIX 机器上大目录中的文件

如何在 AIX 中监视没有 cron 作业的文件更改

Linux进程的uid和euid