加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:20:10 所属栏目:大数据 来源:网络整理
导读:我正在编写一个Perl脚本,它运行4个同时具有不同输入参数的完全相同的进程(参见背景 here – 我的其余部分在阅读之后会更有意义). 我正在对一个生成数据的程序进行system()调用(XFOIL,再次参见上面的链接).我的这个程序的单核版本如下所示: eval{ local $SIG
我正在编写一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读