将流程发送到后台的不同方法有哪些?

时间:2010-03-07 11:07:36

标签: perl fork

我有一个大的perl脚本(大约650行),可以解析imdb.com,tvrage.com上的数据,并可以使用last.fm API和其他一些网站获取数据。此脚本使用了相当多的Perl模块,因此需要几秒钟才能加载(在旧PC上)。可以将快速发送到后台的不同方式(包括任何“丑陋的黑客”)有哪些?

我将从我所知道的一些开始。

  1. script.pl &
  2. 运行脚本
  3. screen -dmS script.pl
  4. 运行脚本
  5. 在脚本
  6. 中使用fork()
  7. 使用App::DaemonProc::Fork
  8. 3和4的问题是当脚本很大(如500到600行)并使用大量模块时,进程需要一些时间来分叉并发送到后台。对于#1和#2,它们会立即发送到后台,因此我正在寻找更多这样的解决方案。

    注意:我不需要从后台进程获取任何数据。他们正在写文件。我也不需要知道后台进程是否成功完成了它的任务。

3 个答案:

答案 0 :(得分:4)

关于3和4:分叉真的不应该花很长时间,除非你在Windows上(仿真分叉)。我个人会去App ::守护进程(或手动做double fork)。

替代方案(如果您的平台上可用)是像setsid script.pl

那样运行它

答案 1 :(得分:2)

您可以通过推迟加载/编译Perl模块来加速3和4,直到之后你已经分支到后台。

当你use一个模块时,Perl在“编译时”加载并编译它,这在脚本中的Perl代码执行之前发生,因此在你进入后台之前。如果你有很多模块,这可能需要一段时间。

您可以在分叉后将use替换为require,以便在运行时中加载模块。

e.g。如果你有

use MyBigModule qw(run);

您可以使用以下代码替换它,该代码放在fork的子部分中:

require MyBigModule;
MyBigModule->import(qw(run));

答案 2 :(得分:0)

选项1是即时的,因为只要你点击返回键,你就会把pid带回终端,就在bg中。听起来你会知道怎么fg proc来检查它是怎么回事(如果它返回任何东西)。就你的问题而言,我会选择opt作为最快的。