2012-02-13 33 views
1

我對服務器管理員的看法比開發人員更感興趣。確定正在運行的perl可執行文件的源代碼

作爲一個現實世界的例子,說我有ps的輔助線顯示:

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

它本質上不是很明顯,這是一個Perl腳本,但我能確定它是由做「 lsof的-p 1696" ,這使得(除其他事項外):

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 

所以這告訴我,這是Perl解釋器爲這個用戶(在OpenVZ的)運行的腳本。

如果我看這個腳本的cwd,它會產生一個不包含「郵件」可執行文件的目錄。

問題什麼是確定當前正在執行的perl代碼的「來源」的一些技術(從服務器管理員的角度)。我已經認識到,確實沒有辦法絕對確定正在運行的perl腳本的「來源」,因爲$ 0很容易被操縱。此外,可以將代碼管入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#  

只是爲了驗證我移動腳本,並再次嘗試。

[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' 符號鏈接:

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

希望幫助...

編輯:與變化 '$ 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> 

文件 '的/ proc/$ PID /狀態' 包含或Perl腳本測試這原始腳本名稱:

localhost 5002 # cat status 
Name: test.pl 
<CLIP> 
localhost 5002 # 
+0

我明白,但是當用戶將$ sh從「sh test.sh」更改爲「bogusfile.sh」時,您會做什麼? – GoldenNewby 2012-02-13 19:05:27

+0

您仍然可以查看'bogus.sh'的pid,並提供相同的信息(使用perl腳本進行測試和驗證)。如果$ pid的'cwd'中有多個腳本,則可以使用'bogus'或grep grep腳本來查看哪些腳本更改'$ 0'(對於Perl)。如果我錯過了某些東西,我很抱歉。 – Woody2143 2012-02-13 19:17:50

+0

我做了一些更多的尋找;在'/ proc/$ pid /'文件'sched','stat'和'status'中包含腳本的原始名稱。我對一個改變'$ 0'的腳本進行了測試。 – Woody2143 2012-02-13 19:22:23

相關問題