我想在 perl 中创建一个能够启动和终止子进程的程序。
细节:当给定命令时,父进程将产生一个新的子进程并根据需要通过命令行传递参数。一旦子进程启动,父进程将继续前进并等待另一个命令。这些命令要么启动一个进程,要么停止一个特定的进程。
父进程永远不应该等待子进程。所有孩子都可以优雅地退出并根据需要进行清理。但是,父进程需要根据需要跟踪和终止任何单个子进程。
我目前正在构建这个父脚本,但想知道我是否使用了正确的 perl 函数以及这样做的最佳实践是什么。
我将使用以下 Perl 函数之一以及 waitpid($pid, WNOHANG) 和 kill('TERM', $pid) 的组合。这是正确的方法吗?有没有现成的解决方案?这里的最佳做法是什么?
系统函数 exec 函数 反引号 (``) 运算符打开函数
这是我的工作代码。
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) );
}
}
}