【问题标题】:Get full path of executable of running process on AIX获取 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 的污染模式时才真正有效。

【问题讨论】:

标签: c aix


【解决方案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}' 中尝试过,结果肯定是不是可执行文件的完整路径名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2018-05-20
  • 2012-10-20
  • 2019-05-03
  • 2010-09-10
  • 1970-01-01
相关资源
最近更新 更多