获取 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 选项不正确 在我的情况下env
和 cwd
标志不存在,正确的合成器是 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'
上面的命令给出了你的应用程序的可执行路径地址
【讨论】:
在 AIXps -aef | grep app | awk 'print $8'
中尝试过,结果肯定是不是可执行文件的完整路径名。以上是关于获取 AIX 上正在运行的进程的可执行文件的完整路径的主要内容,如果未能解决你的问题,请参考以下文章
AIX 运行时错误:符号 __dbargs(编号 191)未从依赖项导出