如何从Perl的system()开始获取进程的PID?
我正在编写一个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.我该怎么做呢? 非常感谢您的帮助! 解决方法
如果你想要PID,fork是你自己的过程,而不是使用
system.系统命令主要设计为“即发即弃”工具.如果您想与流程进行交互,请使用其他内容.例如,请参阅
perlipc文档.
我想你已经根据问题How can I make my Perl script use multiple cores for child processes?的答案看了Parallel::ForkManager (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |