2010-05-06 72 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

相关问题