2010-05-06 40 views
4

perl腳本知道誰叫它和/或怎麼做的任何方式?我如何知道perl腳本是如何啓動的?

是它的另一個腳本或可執行文件。直接從命令行或cron調度程序。

+1

你爲什麼想要這樣做?在你的例子中,如果你希望你的腳本在交互式(在shell)和非交互式(cron)運行時表現出不同的行爲,你希望使用'isatty'。更糟糕的是,如果你試圖實施某種訪問控制,你會做一些非常錯誤的事情,而且不安全。 – derobert 2010-05-07 01:11:02

回答

16

工具來幫助追查Perl腳本是如何開始:

getppid返回父進程ID。然後您可以使用ps/proc/<pid>來獲取有關調用過程的更多信息。

$^X:完整路徑的Perl解釋器,可以提供一個關於Perl如何從外殼

$0開始線索,__FILE__:從命令行調用的腳本的名稱,和當前文件名稱。如果它們一致,那麼當前文件包含從命令行調用的腳本。

@ARGV:傳遞給腳本的命令行參數。通過$^X,$0@ARGV,您確切知道Perl解釋器是如何從shell啓動的

caller:堆棧跟蹤信息。如果caller在腳本開始時返回undef,那麼您位於堆棧的頂部框架,並且您的腳本是從shell調用的。否則,caller會返回您的腳本被調用的包,文件和行(使用dorequire)。

$^T:當前的Perl腳本開始,所以你知道當前Perl解釋器是從外殼開始時間(以秒爲自「時代」)。使用scalar localtime($^T)以更友好的格式查看此值。

+0

+1好帖子會重新閱讀! AAAAAA ++++ – friedo 2010-05-06 21:16:32

+0

@friedo:WHOA THERE。 – jrockway 2010-05-07 00:01:42

+0

Brian D Foy的modulino方法,通常使用調用者函數來允許將腳本用作模塊,這也可能是有趣的。結合mobrule提到的其他變量和函數,您可以編寫一些非常靈活的腳本/模塊。 http://www252.pair.com/comdog/mastering_perl/Chapters/18.modulinos.html – 2010-05-07 02:40:47

3

在linux上你可以看看/proc/<PID>/的信息,它應該給你用來啓動它的確切命令,以及用戶。

1

如何:ps auxww

在那裏您將看到用戶名+參數。

2

您可以使用CORE::getppid()查找父進程的標識。

2

調用getppid會給你父進程的腳本,這就是啓動你的腳本的過程。然後,您可以使用它來詢問流程表以確定該流程是什麼。

+0

Downvoted爲什麼? – 2010-05-07 15:19:32

6

Aviatrix刪除了一個答案,他說:「嘗試使用命令行參數」。這是一個好主意。依賴於無法控制的事物的程序很難測試。在開發腳本時,你真的想從cron運行它來測試「從cron運行」功能嗎?沒門!

因此,不要讓你的腳本猜想它運行的是什麼,只是告訴它。然後它不必猜測,然後它就不會錯誤地猜測(毫無疑問,在凌晨三點)。

可靠的軟件是從輸入到輸出的純粹功能。沒有很好的理由不要添加雜質。 (「我希望它從cron運行時隨機地不同)不是一個很好的理由。」

+0

Upvote for programmer education。 – daxim 2010-05-07 12:59:09

相關問題