我有一个大的perl脚本(大约650行),可以解析imdb.com,tvrage.com上的数据,并可以使用last.fm API和其他一些网站获取数据。此脚本使用了相当多的Perl模块,因此需要几秒钟才能加载(在旧PC上)。可以将快速发送到后台的不同方式(包括任何“丑陋的黑客”)有哪些?
我将从我所知道的一些开始。
script.pl &
screen -dmS script.pl
fork()
3和4的问题是当脚本很大(如500到600行)并使用大量模块时,进程需要一些时间来分叉并发送到后台。对于#1和#2,它们会立即发送到后台,因此我正在寻找更多这样的解决方案。
注意:我不需要从后台进程获取任何数据。他们正在写文件。我也不需要知道后台进程是否成功完成了它的任务。
答案 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作为最快的。