7

次のような Perl のシステム コールがあります。

system('/path/to/utility >> /redirect/to/log file');

しかし、これは完了するのを待ちutilityます。utilityこれをトリガーして、呼び出しが終了したかどうかに関係なく、Perl スクリプトを終了させたいだけです。

これどうやってするの?

行を次のように変更してみました

system('/path/to/utility >> /redirect/to/log file &');

ただし、この構文は、Windows で呼び出しが完了するまで待機します。WindowsだけでなくLinuxでも動作させる必要があります。

4

4 に答える 4

7
if ($^O eq 'MSWin32') {
   system('start "" \\path\\to\\utility >> \\redirect\\to\\log_file');
} else {
   system('/path/to/utility >> /redirect/to/log_file &');
}

また

if ($^O eq 'MSWin32') {
   system(1, '\\path\\to\\utility >> \\redirect\\to\\log_file');
} else {
   system('/path/to/utility >> /redirect/to/log_file &');
}
于 2011-09-12T17:38:05.323 に答える
2

キーワードを見てfork、フォークされたプロセスからシステムコマンドを起動してみてください。例については、マンページを参照してくださいperlipc

于 2011-09-12T17:07:43.593 に答える
2

POSIXのようなシステムで最も簡単な方法は、実際にはすでに試した方法です。

system('/path/to/utility >> /redirect/to/log_file &');

Windowsでツールをバックグラウンドで実行する最も簡単な方法はstart.exe、起動ヘルパーとして使用することです。

system('start /path/to/utility >> /redirect/to/log_file');

ただし、出力をログファイルにリダイレクトするように機能するかどうかはわかりません。また、この瞬間にテスト用のWindowsシステムがありません。

はい、つまり、現在のシステムによってはコードブランチが必要になりますが、他のソリューションでも必要になる場合があります。Perlにfork()エミュレーションがある場合は、実際fork()には両方のシステムで使用できます(stdoutをログファイルに簡単にリダイレクトできないため、これは少し複雑です。最初にPerlで開き、フォークされた子のstdoutにする必要があります。新しいプロセスの呼び出し)。Windows Perlにfork()エミュレーションがない場合は、コードブランチも必要です。その場合fork()、UNIXでのみ使用でき、WindowsWin32::Process::CreateDETACHED_PROCESSオプションで使用する必要があるためです。

ただし、startの使用がすでに機能しているかどうかを最初にお知らせください。そうでない場合は、start.exeスラッシュを処理しない可能性があります。その場合、あなたは次のようなものを使わなければならないかもしれません

C:\\path\\to\\utility

代わりに(二重の円記号が重要です!単一の円記号は文字列リテラルで特別な意味を持ちます。これはエスケープ文字です)。

Windowsで実行しているかどうかを確認するには、変数$OSNAMEまたは$^OSを見てください。Windowsでは「MSWin32」のように表示されます。

于 2011-09-12T17:57:16.713 に答える
2

この共通のタスクは、CPAN モジュールに抽象化されています。Proc::Background

于 2011-09-12T19:48:14.120 に答える