2011-06-21 21 views
4

除了AIX以外,它與Get full path of executable of running process on HPUX…最相似。獲取AIX上正在運行的進程的可執行文件的完整路徑

最基本的問題是:在AIX上,如何確定當前可執行文件的完整路徑?在做任何事情之前必須這樣做(例如,chdir)是好的。

最準確的答案到目前爲止,我發現是從
svmon -P $$ -O format=nolimit,filename=on,filtertype=client
檢查輸出(其中$$有其殼的意義:當前PID)。這不僅僅是大量的C,而且svmon也不是很快,並且可以輕易地壓倒其他應用程序的運行時間。

下一個最好的答案似乎只是看argv[0],如果它有一個斜線,它可以是一個完整的路徑名(以前導符/開頭)或相對於當前目錄名(不是以前導/開頭)。如果它沒有斜線,則與PATH中的某些內容有關。
如果在這個解決方案之後,我最終得到了一個符號鏈接,那麼也需要處理符號鏈接的所有解決方案(硬鏈接可能超出了任何解決方案的範圍)。這個解決方案看起來像是相對跨平臺的,但在C代碼中也很重(應該比svmon更快)。我期望有種族條件等等來應對。

感謝,

更新:我正在尋找一個解決方案,提交給開發者的Perl。他們會擔心不安全的PATH,特別是在setuid/setgid的情況。見perlsec。我認爲我們在這裏可能會好起來,但如果您將setuid與僞造argv[0]結合使用,您可以強制perl認爲它位於其他位置,並加載錯誤的模塊。上面的「下一個最佳」答案只有在不在perl的污染模式下才有效。

+0

退房[這個類似的問題(http://stackoverflow.com/questions/933850/how-to-find-the -location的最可執行-在-C/933996#933996)。 –

+0

檢查http://stackoverflow.com/questions/933850/how-to-find-the-location-of-the-executable-in-c/933996#933996 – karlphillip

+0

我想在圖書館這樣做,這樣我可以把它放在一個錯誤日誌中,我不能合理地要求我的調用者傳入'argv [0]'。 – PJTraill

回答

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%'的注意事項都適用於您和您評論中提到的類似問題。

我希望這會有所幫助。

+0

我嘗試了你建議的命令,但是這給了我一個很好的錯誤,ps選項不正確 – Kiwy

+0

在我的情況下'env'和'cwd'標誌不存在,正確的合成器是'ps -o = pid,cmd'並且該命令也不一定顯示完整路徑。 – Kiwy

+0

嗯..是的,我的Linux也沒有'cwd',不確定我在哪裏找到。我假設你發現這個問題是因爲AIX?我不記得,AIX支持/ proc/$ PID?如果是這樣(並且你需要cwd),你可能會發現它是一個子值。如果你有一個積極的用例,發佈一個問題。祝你好運! – shellter

-1

用PS得到的可執行文件路徑地址

PS -aef | grep app | AWK '{打印$ 8}'

上面的命令讓你的應用程序的可執行文件路徑地址

+0

在AIX中嘗試ps -aef | grep app | awk'{print $ 8}''的結果肯定是*不是可執行文件的完整路徑名。 –

相關問題