8

当社の開発ボックスをセットアップするためのさまざまなインストール手順を実行する Perl スクリプトがあります。ulimitさまざまなシェルスクリプトを実行しますが、必要なs (具体的には、私の場合はスタックサイズ)よりも小さいためにクラッシュするものもあります-s

したがって、メインの Perl スクリプト内から開始ulimitされたすべてのスクリプト ( children) に適用される a を設定したいのですが、それを達成する方法がわかりません。スクリプト内から ulimit を呼び出そうとすると、その特定のスクリプトにのみ設定されます。すぐに終了する子シェル。

ulimitPerl スクリプトを実行または使用する前に呼び出すことができることは承知しています/etc/security/limits.confが、ユーザーにこのことを知られたくありません。ユーザーはスクリプトの実行方法のみを知っている必要があり、そのすべてを処理する必要があります。

ulimitこのように、コマンドを実行するたびに実行することもできますが、毎回ulimit -s BLA; ./cmdこれを複製したくはありません。より良い、よりクリーンなソリューションがあるように感じます。

別のクレイジーな「回避策」は、ulimit を設定して BLA.pl を呼び出す BLA.sh というラッパー スクリプトを作成することです。 "ulimit -s BLA; ./BLA.pl --foo" で自分自身を呼び出し、 --foo を見るかどうかに基づいて異なる動作をしますが、これは以前よりもさらにハックです)。

最後に、どうやら BSD::Resource をインストールできたようですが、外部依存関係の使用は避けたいと思います。

では、Perl スクリプト内から ulimit を設定し、それをすべての子に適用する方法は何ですか?

ありがとうございました。

4

4 に答える 4

12

あなたはすでにあなたの質問に答えています:BSD::Resourceを使用してください。

Perlコアには、とインターフェイスするものは何もありませんsetrlimit。標準の方法を使用できない(または使用しない)場合は、ハックを使用する必要があります。すでに説明した方法はどれでも機能します。ulimit -s BLA;(すべてのコマンドの前に追加するサブルーチンを作成して、代わりにそのサブルーチンを使用できることに注意してくださいsystem。)

于 2010-02-09T03:14:41.507 に答える
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 が実際には unsigned long であるという知識を前提としています。Perl ヘッダーからこの情報を抽出する方法があるかどうかはわかりません。

于 2011-11-25T17:06:38.520 に答える
4

perl を小さなシェル スクリプトでいつでもラップできます。

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

use strict;

# etc, etc....

それは醜いです、そして明らかに、スクリプトの起動時間はわずかに長くなります。

于 2010-03-30T02:14:36.650 に答える
1

私はulimit -s BLAそれを必要とするコマンドの先頭に追加しました。特に BSD::Resource を使いたくありませんでした。なぜなら、これはデフォルトの Perl パッケージではなく、既存の開発マシンの約半分に欠けていたからです。ユーザーの操作は、特定の要件ではありませんでした。

于 2010-02-09T22:38:02.647 に答える