【问题标题】:How do I set a ulimit from inside a Perl script that applies to its children?如何从适用于其子级的 Perl 脚本中设置 ulimit?
【发布时间】:2011-01-14 15:24:46
【问题描述】:

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

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

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

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

另一个疯狂的“解决方法”是制作一个名为 BLA.sh 的包装脚本,该脚本将设置 ulimit 并调用 BLA.pl,但同样,我认为这是一个 hack,现在我有 2 个脚本(我什至可以制作BLA.pl 用 "ulimit -s BLA; ./BLA.pl --foo" 调用自己,并根据它是否看到 --foo 采取不同的行动,但这比以前更骇人听闻)。

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

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

谢谢。

【问题讨论】:

  • 只使用 BSD::Resource。或者,编译你自己的 XS 模块来做同样的事情。不过不知道你为什么要这么做。

标签: linux perl ulimit


【解决方案1】:

这是一个不使用 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 标头中提取此信息。

【讨论】:

  • Perl 在 5.14.2 及更早版本中提供了“sys/resource.ph”,但在 5.20.2 及更高版本中不再存在...
【解决方案2】:

你总是可以将你的 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....

很丑,而且很明显,脚本启动时间会稍微长一些。

【讨论】:

  • 请注意,这会产生错误(至少在 Ubuntu/debian 上):/bin/sh: 0: Illegal option -- - 请参阅man perlrun 以了解正确的语法。特别是 perl 开始注释行应该单独一行
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你已经回答了你的问题:使用BSD::Resource

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

    【讨论】:

    • 我不想使用外部部门,正如我所提到的。该脚本本身是一个潜在的全新机器的安装程序。如果有办法在没有任何模块的情况下做到这一点,我更愿意采用这种方法。必须有更好的东西......
    • 好吧,你可以做模块中的事情。并不是禁止你查看源代码。
    • @brian d foy,该模块需要 XS,因此安装自定义模块的工作量与安装 CPAN 版本一样多。
    • 自定义模块总是需要更多的工作。这就是它的讽刺之处。模块只是文件中的代码,但不知何故人们会认为他们不允许查看它们。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2013-07-22
    • 2010-09-26
    • 2020-12-22
    相关资源
    最近更新 更多