2013-03-10 49 views
0

我有一个运行不同Perl脚本的系统,我想拦截这些脚本的某些参数并将它们传递给我的自定义shell脚本。Perl:启动一个shell脚本并继续而不用等待

这是我有:

#!/usr/bin/microperl 
[...] 

if ($number) { 
    if (&number_is_b($number)) { 
     system("touch $STATE_LOCKED1"); 
     print 1; 
    } 
    else { 
     system("/script/myscript.sh $number"); 
     print 2; 
    } 
} 
else { 
    [...] 
} 

我已经添加的是

system("/script/myscript.sh $number"); 

调用以下shell脚本传递参数$number

#!/bin/sh 
result=$(wget -qO- http://x.x.x.x/result?qs=$1) 
[...] 

现在一切工作正常,但我希望原始的Perl脚本不需要等待t就可以继续他是shell脚本的结果,因为wget可能需要一些时间。我需要Perl脚本自主进行而不关心shell是否成功完成。

是否有可能使它启动并且有些如何忘记它并继续?

你有什么建议我该怎么做?

+0

+1为“自主”! – Borodin 2013-03-10 09:42:52

+0

从[堆栈溢出Perl常见问题](http://stackoverflow.com/questions/tagged/perl?sort=faq):[我怎样才能在Perl中启动并忘记进程?](http://stackoverflow.com/questions/2133910/how-can-i-fire-and-forget-a-process-in-perl) – daxim 2013-03-11 06:55:08

回答

5

可能使其工作的一种方法是将&附加到您的命令以使其在后台运行。但这并不总是适用于每个版本的unix。但值得一试。

system("/script/myscript.sh $number &"); 

如果这不起作用,还有两个我知道的选项。一种方法是使用分叉。 http://perldoc.perl.org/functions/fork.html。这种方法可能需要一点努力。

还有模块Proc::Background,它允许你在后台运行一个进程在Windows和Unix。

+0

嗨,谢谢你的快速回复。 实际上,如果在系统调用中使用“&”似乎不起作用。 :(它的作品,如果在命令行中使用... 我会尝试了解如何使用叉.. – d82k 2013-03-10 10:25:12

+0

@ d82k我一直在寻找更多的信息,因为我也有一些用途。像perl模块Proc :: Background可能实际上是理想的方式。 – 2013-03-10 10:54:18

+1

你也可以'fork'然后使用'exec'。 – fenway 2013-03-10 12:47:36

相关问题