如何从Perl的system()开始获取进程的PID?

时间:2009-12-26 03:56:01

标签: perl system

我正在编写一个Perl脚本,该脚本运行4个同时具有不同输入参数的完全相同的进程(请参阅背景 here - 在阅读完之后,我的其余问题会更有意义。)

我正在对一个生成数据的程序进行system()调用(XFOIL,再次参见上面的链接)。我的这个程序的单核版本看起来像这样:

eval{
    local $SIG{ALRM} = sub{die "TIMEOUT"};
    alarm 250;
    system("xfoil <command_list >xfoil_output");
    alarm 0;
};

if ($@){
    # read the output log and run timeout stuff...
    system('killall xfoil') # Kill the hung XFOIL. now it's a zombie.
}

基本上,XFOIL应该只需要大约100秒的时间来运行 - 所以在250秒后程序挂起(大概等待用户输入它永远不会得到)。

现在的问题是,如果我在我的程序的多核版本中执行killall,我将杀死其他3个XFOIL实例,并且这些进程正在生成数据。所以我只需要杀死挂起的实例,这需要获得一个PID。

我不太了解叉子等等。从目前为止我所知道的,我会在我fork的子进程中运行一个exec('xfoil')。但exec()的PID将不同于子进程的PID(或者是它?它是一个单独的进程,所以我认为它是,但我再也没有经验...),所以这当我想强行杀死这个过程时仍然没有帮助,因为我无论如何都不会有PID。我该怎么做呢?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:8)

如果你想要PID,fork过程而不是systemsystem命令主要设计为“即发即弃”工具。如果您想与流程进行交互,请使用其他内容。例如,请参阅perlipc文档。

我认为您已根据问题的答案查看了Parallel::ForkManager How can I make my Perl script use multiple cores for child processes?