子プロセスを開始および終了できるプログラムを perl で作成したいと考えています。
詳細: コマンドが与えられると、親は新しい子プロセスを生成し、必要に応じてコマンド ライン経由で引数を渡します。子プロセスが開始されると、親プロセスは先に進み、別のコマンドを待ちます。コマンドは、プロセスを開始するか、特定のプロセスを停止するためのものです。
親プロセスが子プロセスを待機することはありません。すべての子は正常に終了し、必要に応じてクリーンアップできます。ただし、親は必要に応じて個々の子プロセスを追跡して強制終了する必要があります。
現在、この親スクリプトを作成していますが、正しい perl 関数を使用しているかどうか、およびこれを行うためのベスト プラクティスは何かを知りたいです。
次の Perl 関数の 1 つと、waitpid($pid, WNOHANG) と kill('TERM', $pid) の組み合わせを使用します。これは正しいアプローチですか?このための既製のソリューションはありますか? ここでのベストプラクティスは何ですか?
システム関数 exec 関数 バッククォート (``) 演算子 open 関数
これが私の作業コードです。
sub spawnNewProcess
{
my $message = shift;
# Create a new process
my $pid = fork;
if (!$pid)
{
# We're in the child process here. We'll spawn an instance and exit once done
&startInstance( $message );
die "Instance process for $message->{'instance'} has completed.";
}
elsif($pid)
{
# We're in the parent here. Let's save the child pid.
$INSTANCES->{ $message->{'instance'} } = $pid;
}
}
sub stopInstance
{
my $message = shift;
# Check to see if we started the specified instnace
my $pid = $INSTANCES->{$message->{'instance'}};
if( $pid )
{
# If we did, then check to see if it's still running
while( !waitpid($pid, WNOHANG) )
{
# If it is, then kill it gently
kill('TERM', $pid);
# Wait a couple seconds
sleep(3);
# Kill it forceably if gently didn't work
kill('KILL', $pid) if( !waitpid($pid, WNOHANG) );
}
}
}