除了AIX之外,这与Get full path of executable of running process on HPUX…最相似。
基本问题是:在AIX上,我如何确定当前可执行文件的完整路径?在做其他任何事情之前必须这样做(例如,chdir
)没问题。
到目前为止,我发现的最准确的答案是检查来自的输出
svmon -P $$ -O format=nolimit,filename=on,filtertype=client
(其中$$的shell含义为:current pid)。这不仅是大量的C,而且svmon也不是很快,并且很容易压倒应用程序其余部分的运行时。
下一个最佳答案似乎是简单地查看argv[0]
,如果它有斜杠,则它是一个完整的路径名(以前导/开头)或相对于当前的-dir name(不以前导/开头)。如果它没有斜线,则它与PATH
中的某个相对
如果在这个解决方案之后,我最终得到一个符号链接,那么所有的符号链接的解决方案也都要处理(硬链接可能超出了任何解决方案的范围)。这个解决方案看起来像是相对跨平台的,但在C代码中也很重(应该比svmon更快)。而且我希望有竞争条件可以处理。
谢谢,
更新:我正在寻找一个提交给perl开发者的解决方案。而且他们会担心一个不安全的PATH
,特别是在setuid
/ setgid
场景中。见perlsec。我认为我们可以在这里没问题,但是如果你将setuid
与伪造argv[0]
结合起来,你可以强迫perl认为它在其他地方,并加载错误的模块。上面的“下一个最好的”答案只有在perl的污点模式下才能真正起作用。
答案 0 :(得分:0)
为什么不能使用ps
选项作为基线?当然,您仍然需要处理cmd值以查看是否具有前导'/'。像
ps -o pid,env,cwd,cmd | grep youAppName | awk -f programToRationalizePathName
我再也无法访问AIX了,但我确实已经工作了2年半,我知道我已经使用过这种功能了。我不认为它很慢,但我可能有不同的要求。
我得到的印象是你想要一个实用工具函数,一个一次性调用返回完整路径,但是如果你需要一个正在进行的过程而且担心每1分钟重新启动一次ps(例如) ,查看AIX特定的nmon实用程序。不确定它是否可以生成类似于ps -o cmd
的输出,但它可以设置为根据需要运行,只要你想要的频率(低至1秒间隔),它只是一个进程,其输出可以根据需要重定向。 (Nmon不是std安装的一部分,但大多数组织都安装它,因为它是IBM祝福(如果不直接支持))。
当然,所有“非100%”的警告都适用于您和评论中提到的类似问题。
我希望这会有所帮助。
答案 1 :(得分:-1)
使用ps获取可执行路径地址
ps -aef | grep app | awk'{print $ 8}'
以上命令为您的应用提供可执行路径地址