Perl スクリプト内から子に適用する ulimit を設定するにはどうすればよいですか?
質問
会社用の開発ボックスをセットアップするためのさまざまなインストール手順を実行する Perl スクリプトがあります。さまざまなシェル スクリプトを実行しますが、要求された値よりも低いためにクラッシュするものもあります。 ulimit
s (具体的には、スタック サイズ -s
私の場合)。
したがって、設定したいのは、 ulimit
これはすべてのスクリプトに適用されます (children
) はメインの Perl 内から開始されましたが、それを達成する方法がわかりません。スクリプト内から ulimit を呼び出そうとすると、その特定の子シェルに設定されるだけで、すぐに終了します。
電話できることは承知しています ulimit
Perl スクリプトを実行する前、または使用する前に /etc/security/limits.conf
しかし、私はユーザーにこれらのことを何も知らせたくありません。ユーザーにはスクリプトの実行方法だけを知ってもらい、スクリプトがすべてを処理する必要があります。
走ることもできるよ ulimit
コマンドを実行するたびに、このように ulimit -s BLA; ./cmd
しかし、毎回これを繰り返したくはありませんし、もっと良い、よりクリーンな解決策があると感じています。
もう 1 つのクレイジーな「回避策」は、ulimit を設定して BLA.pl を呼び出す BLA.sh というラッパー スクリプトを作成することです。ただし、これも私の頭の中でのハックであり、スクリプトが 2 つになることになります (BLA.pl を作成することもできます)。 「ulimit -s BLA;」で自分自身を呼び出します。./BLA.pl --foo" を実行し、--foo が見えるかどうかに基づいて動作が異なりますが、これは以前よりもさらにハッキングです)。
最後に、BSD::Resource をインストールできるようですが、外部依存関係の使用は避けたいと考えています。
それで、何ですか ザ Perlスクリプト内からulimitを設定し、それをすべての子に適用する方法はありますか?
ありがとう。
解決 4
結局前に付けてしまった ulimit -s BLA
必要なコマンドに追加します。特に BSD::Resource を使いたくなかったのは、BSD::Resource がデフォルトの Perl パッケージではなく、既存の開発マシンの約半分に欠けていたためです。ユーザーとの対話がないことが特定の要件でした。
他のヒント
あなたはすでに質問に答えています:使用 BSD::リソース.
Perl コアにはインターフェースとなるものは何もありません。 setrlimit
. 。標準の方法を使用できない (または使用しない) 場合は、ハックを使用する必要があります。すでに説明した方法はどれも機能します。(サブルーチンを作成して先頭に追加することもできることに注意してください。 ulimit -s BLA;
すべてのコマンドに追加し、代わりにそのサブを使用します。 system
.)
Perl は、いつでも小さなシェル スクリプトでラップできます。
#!/bin/sh -- # --*-Perl-*--
ulimit -n 2048
exec /usr/bin/perl -x -S $0 ${1+"$@"}
#!/usr/bin/perl
#line 6
use strict;
# etc, etc....
これは見苦しく、明らかにスクリプトの起動時間が若干長くなります。
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 ヘッダーからこの情報を抽出する方法があるかどうかはわかりません。