如何从适用于其子代的Perl脚本中设置ulimit?

时间:2010-02-09 02:20:44

标签: linux perl ulimit

我有一个Perl脚本,它执行各种安装步骤来为我们公司设置开发盒。它运行各种shell脚本,其中一些由于低于所需的ulimit(特别是我的情况下的堆栈大小-s而崩溃)。

因此,我想设置一个ulimit适用于从我的主要Perl中开始的所有脚本(children),但我不知道如何实现 - 任何尝试在脚本中调用ulimit时,只将其设置在特定的子shell上,该子shell立即退出。

我知道在运行Perl脚本或使用ulimit之前我可以调用/etc/security/limits.conf但我不希望用户知道任何这些 - 他们应该只知道如何运行脚本,应该为他们处理所有这些。

我每次运行命令时都可以运行ulimit,例如ulimit -s BLA; ./cmd,但我不想每次都复制它,我觉得那里有一个更好,更清洁的解决方案。

另一个疯狂的“解决方法”是制作一个名为BLA.sh的包装脚本,它将设置ulimit并调用BLA.pl,但同样,这是我的脑海中的黑客,现在我有2个脚本(我甚至可以制作) BLA.pl用“ulimit -s BLA; ./BLA.pl --foo”调用自己,并根据它是否看到--foo或不同而采取不同的行为,但这比以前更加粗糙。)

最后,显然我可以安装BSD :: Resource,但我想避免使用外部依赖。

那么 在Perl脚本中设置ulimit并将其应用于所有子项的方法是什么?

谢谢。

4 个答案:

答案 0 :(得分:12)

您已经回答了以下问题:使用BSD::Resource

Perl核心中没有任何与setrlimit接口的东西。如果你不能(或不会)使用标准方法,那么你必须使用hack。您已经描述过的任何方法都可以使用。 (请注意,您可以创建一个子例程,将ulimit -s BLA;添加到每个命令,然后使用该子代替system。)

答案 1 :(得分:4)

您始终可以将perl包装在一个小shell脚本中:

#!/bin/sh -- # --*-Perl-*--
ulimit -n 2048
exec /usr/bin/perl -x -S $0 ${1+"$@"}
#!/usr/bin/perl
#line 6

use strict;

# etc, etc....

这很丑陋,显然,脚本启动时间会稍长一些。

答案 2 :(得分:4)

这是一个如何在不使用BSD :: Resource的情况下设置cpu限制的示例(但假设有perl系统头文件)。为了适应其他资源,做出明显的改变。

require 'syscall.ph';
require 'sys/resource.ph';

# set the soft cpu limit to 1 (second), and the hard limit to 10.
$rstruct = pack "L!L!",1,10; # L! means native long unsigned int.
syscall(&SYS_setrlimit,&RLIMIT_CPU,$rstruct);

这假设知道rlim_t实际上是无符号长的;我不知道是否有办法从Perl标题中提取此信息。

答案 3 :(得分:1)

我最终将ulimit -s BLA添加到需要它的命令中。我特别不想使用BSD :: Resource,因为它不是默认的Perl包,并且在大约一半的现有开发机器上都丢失了。没有用户交互是特定要求。