2011-12-03 26 views
0

可能性の重複:
How can I run Perl system commands in the background?戻り値を待たない「システム」のようなPerl関数はありますか?

私はif文の結果に依存して別のプロセスを、トリガの単純なPerlプログラムを持っています。しかし、トリガーされたプロセスが完了するまで、コマンドを送信し続けることはできません。これは、 'system'関数がプロセスの戻り値を待ってから続行するためです。

while (bla bla bla) { 
    if (command is bla) { 
    system("osascript 'something.app'"); 
    } else { 
    print $client "invalid command\r\n"; 
    } 
} continue { 
    …etc 

要するに、私のスクリプトはsomething.appから何か聞こえるまで続けられません。これを何とかしていますか?

+0

それは[FAQ](http://learn.perl.org/faq/perlfaq8.html#How-do-です私はバックグラウンドでプロセスを開始する)。以前のSO:http://stackoverflow.com/questions/2133910/how-can-i-fire-and-forget-a-process-in-perl http://stackoverflow.com/questions/2711520/how-can -i-run-perl-system-in-the-background http://stackoverflow.com/questions/4053093/how-can-i-make-fork-in-perl-in-different-scripts – daxim

答えて

4

forkexecは、実行をブロックせずに動作します:UNIX/Linuxの

if (command is bla) { 
    exec "osascript 'something.app'" if fork; 
} else { 
    print $client "invalid command\r\n"; 
} 
+0

あなたは、子プロセスがこのメソッドで終了するときに子プロセスを取得するために何か必要があります。 SIGCHLDハンドラは完全に動作します。 –

+0

メインスクリプトはすぐに実行を終了します。さもなければ実行されたoascriptが終了すると、その状態が 'ゾンビ'に変わり、あなたのスクリプトにSIGCHLDシグナルが送られます。この状況のた​​めに非常に単純なハンドラを作成することができます。しかし、メインスクリプトが最初に終了すると、子コマンドは里親に移り、initプロセスになります。このプロセスは終了したプロセスに対して自動的に 'wait'コマンドを処理します。このコードは、http://perldoc.perl.org/perlipc.htmlで見つけることができます。 – Znik

1

をあなたは

system("osascript 'something.app' & "); 

」を、それをオフに計装アンプのできる '&' を追加実行するためにシェルに指示しますプロセスはバックグラウンドで実行されます。私は "孫"プロセスが再親子化されているかどうかを覚えていないので、子プロセスが終了したときに子プロセスを得るためにSIGCHLDハンドラが必要になるかもしれません。

私はWindows上で同じことをする方法があると思いますが、私は現時点でそれを覚えていません。たぶん "start/b"。

http://perldoc.perl.org/functions/system.html http://perldoc.perl.org/perlipc.html#Signals

関連する問題