代码之家  ›  专栏  ›  技术社区  ›  Artem Russakovskii

如何从应用于其子级的Perl脚本内部设置ulimit?

  •  7
  • Artem Russakovskii  · 技术社区  · 14 年前

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

    因此,我想设置一个 文件描述符 这适用于所有脚本( children )从我的主Perl shell中开始,但我不确定如何实现这一点——任何从脚本中调用ulimit的尝试都只会将其设置在特定的子shell上,而该shell会立即退出。

    我知道我可以打电话 文件描述符 在运行Perl脚本或使用 /etc/security/limits.conf 但我不想让用户知道这些——他们应该只知道如何运行脚本,而脚本应该为他们处理所有这些问题。

    我也能跑 文件描述符 每次我执行这样的命令 ulimit -s BLA; ./cmd 但我不想每次都重复这个,我觉得有一个更好,更清洁的解决方案。

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

    最后,显然我可以安装bsd::resource,但我希望避免使用外部依赖项。

    那么什么是 这个 如何从Perl脚本中设置ulimit并使其适用于所有子级?

    谢谢您。

    4 回复  |  直到 13 年前
        1
  •  12
  •   cjm    14 年前

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

    Perl内核中没有与 setrlimit .如果你不能(或不会)使用标准方法,那么你必须使用黑客。您已经描述过的任何方法都可以工作。(请注意,您可以创建一个子例程来预处理 ulimit -s BLA; 到每个命令,然后使用该Sub而不是 system )

        2
  •  4
  •   Gavin Brock    14 年前

    您总是可以用一个小的shell脚本包装Perl:

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

    很难看,很明显,脚本启动时间会稍微长一些。

        3
  •  4
  •   Julian Bradfield    13 年前

    下面是一个示例,说明如何在不使用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实际上是无符号的long;我不知道是否有方法从perl头中提取这个信息。

        4
  •  1
  •   Artem Russakovskii    14 年前

    我最后准备好了 ulimit -s BLA 到需要它的命令。我特别不想使用bsd::resource,因为它不是默认的Perl包,并且在现有的大约一半开发人员计算机上丢失了它。没有用户交互是一个特定的需求。