2013-03-10 109 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

相關問題