【问题标题】:open and close perl processes with time out cross-platform跨平台打开和关闭 perl 进程超时
【发布时间】:2012-03-11 05:54:48
【问题描述】:

如何在 perl 中超时后启动和结束进程? 我需要脚本在 Windows 和 Unix 中工作,我最好的选择是什么?

编辑:如何在 windows 和 unix 上获取已启动进程的进程 ID,以及如何在超时时终止它

【问题讨论】:

  • 也许你应该更具体一些。您到底想做什么?在理解问题或实现所需目标方面遇到了哪些问题?
  • 在我看来,用户只是想阻止他们的代码运行太久。
  • 我决定在脚本中找出它运行的操作系统,并为每个操作系统实施不同的处理。在 Windows 上,我的 Win32::Process 运行得非常好。在 Unix 上,我使用的是 open。

标签: windows perl unix


【解决方案1】:

您可以使用操作系统发出 ALRM(警报)信号,然后您可以在设定的秒数后退出您的进程。

例如,如果您在脚本的顶部放置:

alarm 300;

这将导致您的进程收到 ALRM 信号。这将立即终止您的进程,或者您可以捕获它并在它终止之前清理您的进程。

进一步阅读:http://perldoc.perl.org/functions/alarm.html

您可以像这样捕获信号:

$SIG{ALRM} = sub {

# Clean up process here and exit

};

响应您的编辑“编辑:如何获取 Windows 和 unix 上已启动进程的进程 ID,以及如何在超时时终止它”

进程ID在perl中存储为$$,所以:

print 'My process ID is:', $$, "\n";

【讨论】:

  • 请注意,Windows 上的“警报”是有限制的:如果在系统调用中(即等待套接字或类似的东西),您不能中断您的脚本(参见 perlport)。
  • 我的背景更多是在 linux 中,但是在那种情况下那个进程不也是僵尸进程吗(即:不能被常规方法杀死)?
  • 我们在这里谈论 Windows。所以没有僵尸进程;)你的 perl 根本不会让你的信号在“系统”上。
猜你喜欢
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多