2012-02-13 21 views
1

私は開発者よりもサーバー管理者の観点からこれ以上のことに興味があります。実行中のperl実行可能ファイルのソースを確認する

現実世界の例として、私が示したPS AUX INラインを持っていると言う:

usercom 1696 0.1 0.2 34104 4556 ?  Ss 07:33 0:20 ./mail 

これはperlスクリプトであることを本質的に明らかではありませんが、私はそれが実行しているかを決定することができます」 (他のものに加えて)レンダリング-p 1696" 、lsofを:

COMMAND PID  USER FD TYPE  DEVICE SIZE  NODE NAME 

perl 1693 usercom txt REG  0,49 17326 99846241 /home/virtfs/usercom/usr/local/bin/perl 

だから、これはこれは(OpenVZの中に)このユーザーのためのperlインタプリタで実行中のスクリプトであることを私に伝えます。

このスクリプトのcwdを見ると、 "mail"実行可能ファイルが含まれていないディレクトリが作成されます。

質問(サーバ管理者の視点から)現在実行中のperlコードの「起源」を特定するためのいくつかの手法があります。私は$ 0が非常に簡単に操作されるので、実行中のperlスクリプトの "ソース"を絶対に決定する方法は実際にはないということを受け入れるようになりました。さらに、コードをperlにパイプしたり、評価したりすることも可能です。それでも、誰もがperlスクリプトのルートを追う良い方法を知っていますか?

答えて

0

'lsof'の出力で 'cwd'(現在の作業ディレクトリ)行を探します。

localhost proC# ps ax | grep test 
4751 pts/18 S+  0:00 sh test.sh 

localhost proC# lsof +p 4751 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF  NODE NAME 
sh  4751 user cwd DIR 8,3 12288 4964356 /home/user 
<CLIP> 
localhost proC#  

私はスクリプトを移動してもう一度試しました。

localhost 4848 # ls -l 
total 0 
<CLIP> 
lrwxrwxrwx 1 user user 0 Feb 13 18:51 cwd -> /home/user/bin 
<CLIP> 
localhost 4848 # 

希望:

[email protected] ~ $ mv test.sh bin/ 
[email protected] ~ $ cd bin 
[email protected] ~/bin $ sh test.sh 

localhost proC# ps ax | grep test 
4848 pts/18 S+  0:00 sh test.sh 

localhost proC# lsof +p 4848 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF  NODE NAME 
sh  4848 user cwd DIR 8,3  4096 4965757 /home/user/bin 
<CLIP> 
localhost proC# 

はあなたが見ることができる 'lsofを' '/ procの/ $ pidを/' ディレクトリに依存しているとする場所 'CWD' シンボリックリンクを表示したくない場合は

そのことができます...

編集: '$ 0' に

[email protected] ~/bin $ ./test.pl 

localhost 4848 # ps ax | grep test 
5004 pts/17 S+  0:00 grep --colour=auto test 

localhost 4848 # ps ax | grep bogus 
5002 pts/18 S+  0:00 bogus.pl 
5006 pts/17 R+  0:00 grep --colour=auto bogus 

localhost 5002 # lsof +p 5002 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF  NODE NAME 
test.pl 5002 user cwd DIR 8,3  4096 4965757 /home/user/bin 
<CLIP> 
localhost 5002 # 


localhost ~ # cd /proc/5002/ 
localhost 5002 # ls -l 
total 0 
<CLIP> 
lrwxrwxrwx 1 user user 0 Feb 13 19:12 cwd -> /home/user/bin 
<CLIP> 

を変更するPerlスクリプトファイル '/ procの/ $ pidを/ステータスが' 含まれているかでこれをテスト済みiginalスクリプト名:

+0

ユーザーが$ 0を "sh test.sh"から "bogusfile.sh"に変更したときはどうしますか? – GoldenNewby

+0

あなたは 'bogus.sh'のpidを見ることができ、同じ情報が利用できます(テストされ、perlスクリプトで検証されます)。その$ pidの 'cwd'に複数のスクリプトがある場合、 'bogus'またはgrepのスクリプトをgrepして、どのスクリプトが '$ 0'(Perlの場合)を変更するかを確認できます。私が何かを逃している場合、私の謝罪。 – Woody2143

+0

もう少し見ました。 '/ proc/$ pid /'に 'sched'、 'stat'、 'status'というファイルにスクリプトの元の名前が含まれています。私は '$ 0'を変更したスクリプトに対してこれをテストしました。 – Woody2143

関連する問題