web-dev-qa-db-ja.com

AIX 5以降でPIDを使用して実行可能パスを識別する方法

AIX 5または6では、 `ps -ef`は実行可能なフルパスをランダムに表示します。どうして?そしてそれを決定する方法は?

私はインターネット全体で多くのスレッドを見つけ、UnixとLinux、そしてプロセスのパスを見つけることについて このスタックオーバーフローの投稿 を見つけました。
パスが表示されるのではなく、proftpdが表示され続けます。私はついにAIXのman psを読んでこれを見つけました:

CMD

(-f、-l、およびlフラグ)コマンド名が含まれます。 -fフラグの下で、psは現在のコマンド名と引数を決定しようとしますが、どちらもプロセスによって非同期に変更される可能性があります。これらが表示されます。これに失敗すると、オプション-fなしで表示されるコマンド名は角括弧で記述されます。

次の出力がある場合、それが何を意味するかを確実に理解したいと思います。

 ps -ef (truncate output)
root 44900     1   0 11:49:36      -  0:00 proftpd: (accepting connections)
nobody 31986 14976   0   13 feb      -  0:00 /usr/local/Apache/bin/httpd -f /usr/local/Apache/conf/httpd.conf

httpdデーモンの場合、フルパスは表示されますが、proftpdのフルパスは表示されません。最初の質問は、なぜフルパスで表示されるプロセスとそうでないプロセスがあるのですか?

2番目の質問はその場合です:

proftpdのパスがwhereisrootと入力する最初のパスであると想定できますか?

私の場合 :

 whereis proftpd
 proftpd: /etc/proftpd.conf /usr/sbin/proftpd  

ですから、実行中のデーモンは/usr/sbin/protfpd ?だと思います。


編集2

その部分についてお答えしましょう。いいえ、そのような仮定はできません。まったく関係ありません。最終的に、デーモンが/opt/proftpdから実行されていることがわかりました。これは、ルートパスにもありません。

「なぜps -efはそのように機能するのか」はまだ判断する必要があります。また、PIDを知っている実際のパスが何かを見つける他の方法はありますか?


編集1:これは、私のAIXシステムが/proc/<PID>exeリンクをサポートしていないことの証明です。
これをAIXバージョン5.3.9.0および6.1.7.15に対してテストします。

ls -al /proc/44900/*
-rw-------    1 root     nobody            0 14 jan 09:42 /proc/44900/as
-r--------    1 root     nobody          128 14 jan 09:42 /proc/44900/cred
--w-------    1 root     nobody            0 14 jan 09:42 /proc/44900/ctl
lr-x------   53 root     nobody            0 13 jan 16:07 /proc/44900/cwd -> /
-r--------    1 root     nobody            0 14 jan 09:42 /proc/44900/map
-r--r--r--    1 root     nobody          448 14 jan 09:42 /proc/44900/psinfo
-r--------    1 root     nobody         1024 14 jan 09:42 /proc/44900/sigact
-r--------    1 root     nobody         1520 14 jan 09:42 /proc/44900/status
-r--r--r--    1 root     nobody            0 14 jan 09:42 /proc/44900/sysent

/proc/44900/fd:
total 5483376
dr-x------    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
-r--r--r--    1 root     nobody         5005 12 jul 2004  3
-r--r--r--    1 root     nobody         8655 13 nov 15:13 5
-r--r--r--    1 root     nobody         1607 13 nov 15:12 6
--w-------    1 root     nobody   2378419349 13 jan 16:06 7
--w-------    1 root     nobody    423405131 13 jan 16:06 8

/proc/44900/lwp:
total 0
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 99075

/proc/44900/object:
total 90312
dr-x------    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
-rwxr-xr-x    1 root     system      1268973 16 okt 2012  a.out
-rwxr-xr-x    1 bin      bin           15265 12 jul 2004  jfs.10.5.12513
-r--r--r--    1 bin      bin         8587637 23 mei 2008  jfs.10.5.16405
-r-xr-xr-x    1 bin      bin         9281793 23 sep 2008  jfs.10.5.4131
-r-xr-xr-x    1 bin      bin           11019 01 okt 2007  jfs.10.5.4149
-r--r--r--    1 bin      bin          162078 19 jun 2008  jfs.10.5.4169
-r--r--r--    1 bin      bin         1161414 23 sep 2008  jfs.10.5.4171
-r--r--r--    1 bin      bin          379513 19 jun 2008  jfs.10.5.4943
-r-xr-xr-x    1 bin      bin           96495 19 jun 2008  jfs.10.5.5248
-rw-r--r--    1 root     system     17160842 05 okt 2011  jfs2.51.3.266241
-rwxr-xr-x    1 root     system       315783 11 mei 2006  jfs2.51.3.266246
-rw-r--r--    1 root     system      3237612 05 okt 2011  jfs2.51.3.266262
-rw-r--r--    1 root     system       125958 25 mrt 2008  jfs2.51.3.270769
-rwxr-xr-x    1 root     system      3140221 20 mei 2011  jfs2.51.3.282757
-rwxr-xr-x    1 root     system      1268973 16 okt 2012  jfs2.51.3.283899

シンボリックリンクはまったくありません。

6
Kiwy

わかりましたので、これが私の質問に対する私の答えです。

  • 最初:proftpdのパスが最初にwhereisとしてrootisと入力すると思いますか?
    ==>いいえ、少なくとも私の経験では、プロセスの実行可能パスを決定するための信頼できる情報は示されていません。

  • 第二:実行中のプロセスの実行可能パスを特定する方法は?
    私は stackoverflowトピック を見つけました。これは、この可能性を示しています。これは、これまで私に正しい答えを示した唯一のものです。
    svmon -P <PID> -O format=nolimit,filename=on,filtertype=client
    このコマンドの問題は、必要な情報が表示されるまで待つ必要があることですが、しばらくするとおそらく答えが得られるでしょう。別の問題は、このメソッドはスクリプトで使用できないことです。

  • 第三:「なぜps -efはフルパスも相対パスも表示していません "
    答えはおそらく(しかし、私を自由に修正してください)、ユーザーが入力した実際のコマンドが表示されるため、rootproftpdを含むフォルダーにある場合、proftpd
    今のところわかりません。

これまでのところ、私が思いつくことができる最良の答えです。


編集1

実行中の実行可能ファイルのパスを見つけるスクリプト可能な方法(この方法は私からではなく、 このフォーラムの投稿 からのものです)。スクリプトは提供しませんが、それは私の能力を超えているため、現時点では時間がないためです。

  • 最初のステップは、実行可能バイナリのiノードを取得することです

    ls -i /proc/<PID>/object/a.out  |  cut -f 1 -d " "
    

    このコマンドは数値を出力します。

  • 次に、ファイルが存在するデバイスを特定する必要があります。そのコマンドを見てください。

    ls -li /proc/<PID>/object/ | egrep "<inode>$"
    

    このコマンドは、次のようなファイル名を提供します:jfs2.51.3.<inode>jfs2はファイルシステムのタイプ、51メジャーデバイス番号と3マイナーデバイス番号。

  • デバイス情報を特定したら、次のコマンドを使用して、ファイルが配置されているブロックデバイスを特定する必要があります。

    ls -l /dev/ | egrep "^b.*51, *3.+$"  
    

    ^b.*51, *3.+$^bは、ブロックデバイスを照合するために使用されます
    51, *3はメジャーブロックと一致します51の後にコンマとスペースとマイナーブロック番号を追加3以前に見つけます。
    このコマンドは、次のようなものを提供します:
    brw-rw---- 1 root system 51, 3 24 feb 2009 myfilesystem

  • 次に、次のようにブロックのマウントポイントを識別できます。

    df | grep myfilesystem
    /dev/myfilesystem     31457280    144544  100%   107442    81% /opts
    
  • あなたはあなたがあなたの番号を検索する必要がある場所を知っています:

    find /opts -inum <inode>
    

この方法は少し複雑ですが、これは「簡単にスクリプトを作成できる」ことがわかった唯一の方法です。誰かがスクリプトを書いたことがあれば、それを読んで喜んでいます。

4
Kiwy
getPathByPid()
{
    if [[ -e /proc/$1/object/a.out ]]; then
        inode=`ls -i /proc/$1/object/a.out 2>/dev/null | awk '{print $1}'`
        if [[ $? -eq 0 ]]; then
            strnode=${inode}"$"
            strNum=`ls -li /proc/$1/object/ 2>/dev/null | grep $strnode | awk '{print $NF}' | grep "[0-9]\{1,\}\.[0-9]\{1,\}\."`
            if [[ $? -eq 0 ]]; then
                # jfs2.10.6.5869
                n1=`echo $strNum|awk -F"." '{print $2}'`
                n2=`echo $strNum|awk -F"." '{print $3}'`
                # brw-rw----    1 root     system       10,  6 Aug 23 2013  hd9var
                strexp="^b.*"$n1,"[[:space:]]\{1,\}"$n2"[[:space:]]\{1,\}.*$"   # "^b.*10, \{1,\}5 \{1,\}.*$"
                strdf=`ls -l /dev/ | grep $strexp | awk '{print $NF}'`
                if [[ $? -eq 0 ]]; then
                    strMpath=`df | grep $strdf | awk '{print $NF}'`
                    if [[ $? -eq 0 ]]; then
                        find $strMpath -inum $inode 2>/dev/null
                        if [[ $? -eq 0 ]]; then
                            return 0
                        fi
                    fi
                fi
            fi
        fi
    fi
    return 1
}
2
zirong