私はインターネット全体で多くのスレッドを見つけ、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
のパスがwhereis
をroot
と入力する最初のパスであると想定できますか?
私の場合 :
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
シンボリックリンクはまったくありません。
わかりましたので、これが私の質問に対する私の答えです。
最初:proftpdのパスが最初にwhereisとしてrootisと入力すると思いますか?
==>いいえ、少なくとも私の経験では、プロセスの実行可能パスを決定するための信頼できる情報は示されていません。
第二:実行中のプロセスの実行可能パスを特定する方法は?
私は stackoverflowトピック を見つけました。これは、この可能性を示しています。これは、これまで私に正しい答えを示した唯一のものです。svmon -P <PID> -O format=nolimit,filename=on,filtertype=client
このコマンドの問題は、必要な情報が表示されるまで待つ必要があることですが、しばらくするとおそらく答えが得られるでしょう。別の問題は、このメソッドはスクリプトで使用できないことです。
第三:「なぜps -ef
はフルパスも相対パスも表示していません "答えはおそらく(しかし、私を自由に修正してください)、ユーザーが入力した実際のコマンドが表示されるため、root
がproftpd
を含むフォルダーにある場合、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>
この方法は少し複雑ですが、これは「簡単にスクリプトを作成できる」ことがわかった唯一の方法です。誰かがスクリプトを書いたことがあれば、それを読んで喜んでいます。
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
}