我有一个Perl脚本,它执行各种安装步骤来为我们公司设置开发盒.它运行各种shell脚本,其中一些由于低于所需的ulimits(特别-s是我的情况下的堆栈大小)而崩溃.
因此,我想设置一个ulimit适用于children从我的主Perl中启动的所有脚本(),但我不知道如何实现这一点 - 任何尝试从脚本中调用ulimit只会将其设置为特定的子壳,立即退出.
我知道我可以ulimit在运行Perl脚本之前调用或使用/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,使之适用于所有的孩子呢?
谢谢.
cjm*_*cjm 12
您已经回答了以下问题:使用BSD :: Resource.
Perl核心中没有任何东西可以与之接口setrlimit.如果你不能(或不会)使用标准方法,那么你必须使用hack.您已经描述过的任何方法都可以使用.(注意,您可以创建一个子例程以预先添加ulimit -s BLA;到每个命令,然后使用该子代替system.)
小智 5
下面是如何在不使用 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);
Run Code Online (Sandbox Code Playgroud)
这假设知道 rlim_t 实际上是 unsigned long;我不知道是否有办法从 Perl 标头中提取此信息。
我最终在ulimit -s BLA需要它的命令前面加上了它。我特别不想使用 BSD::Resource,因为它不是默认的 Perl 包,并且在大约一半的现有开发机器上缺失。没有用户交互是特定的要求。
| 归档时间: |
|
| 查看次数: |
9476 次 |
| 最近记录: |