2

我正在尝试编写一个执行外部程序并停止它的 perl 脚本。

外部程序不会自行停止,因为我应该在它运行的命令 shell 上按“输入”。

有什么办法可以在 perl 脚本中停止外部程序?

4

2 回答 2

0

有什么办法可以在 perl 脚本中停止外部程序?

一句话,是的。但实现取决于您运行应用程序的平台。

在 perl 支持的所有平台上,您都可以system()用来调用外部程序。但是然后您的原始程序将等待并且不执行任何操作,直到外部程序退出,因此system()不适合您的情况。

由于您没有提及您的平台(OS),因此这里应该讨论两个主要平台:

类Unix操作系统:首先你可以fork有一个子进程,在子进程中,exec用来调用外部程序。然后在父进程中,您可以等待子进程,并TERM在您想停止外部程序时向其发送信号(或默认终止进程的其他信号)。

if (($pid = fork) == 0) {
    exec("$external_program $arg");
} else {
    # do something...
    kill "TERM", $pid;
}

Win32 OS:我想提一下,在Win32平台上,子进程forked实际上是一个伪进程,Win32不像Unix那样支持信号方法。您可以按照1Win32 中的解决方案进行操作,但据我尝试,子进程经常会错过信号,例如,当子进程正在睡眠或等待套接字连接时。这可能非常不稳定。

相反,Win32::Process是一个更好的解决方案。它使用 Win32 API 来创建和操作进程。

use Win32::Process;
use Win32;

Win32::Process::Create($ProcessObj, $external_program, $arg, 
                       0, NORMAL_PRIORITY_CLASS, ".") or die;
# do something ...
$ProcessObj->Kill($exitcode);

基本上就是这个原理。如果你想要一个跨平台的解决方案,CPAN 上有一个模块Proc::Background,它支持两个平台。

use Proc::Background;
my $proc = Proc::Background->new($command, $arg);  
# do something ...
$proc->die;
于 2013-09-26T01:49:09.580 回答
0

我认为您可以在 Perl 中使用 fork 来获取子进程的 pid(进程 ID)。请参阅此处的最后一条评论。

一旦有了 pid,您就可以使用此处描述的任何方法从 Perl 脚本中使用Unix kill请参阅此站点)命令。

这个问题还表明您可以将 pid 从您启动的任何程序中写入一个单独的文件。然后,您可以从调用脚本中读取该文件中的 pid。

于 2013-09-26T00:23:41.817 回答