Frage

Ich habe ein Perl -Skript, das verschiedene Installationsschritte ausführt, um ein Entwicklungsfeld für unser Unternehmen einzurichten. Es wird verschiedene Shell -Skripte ausgeführt, von denen einige aufgrund von niedriger als erforderlich abstürzen ulimits (speziell Stapelgröße -s in meinem Fall).

Deshalb möchte ich a einstellen ulimit Das würde für alle Skripte gelten (children) startete von meinem Hauptperl, aber ich bin mir nicht sicher, wie ich das erreichen soll - jegliche Versuche, Ulimit aus dem Skript aus dem Skript aufzurufen, setzen es nur auf dieser spezifischen Kinderhülle, die sofort verlässt.

Ich bin mir bewusst, dass ich anrufen kann ulimit Bevor ich das Perl -Skript ausführe oder benutze /etc/security/limits.conf Aber ich möchte nicht, dass der Benutzer etwas davon kennt - sie sollten nur wissen, wie das Skript ausgeführt werden soll, was sich um all das für sie kümmern sollte.

Ich kann auch rennen ulimit Jedes Mal, wenn ich einen Befehl ausführe, so ulimit -s BLA; ./cmd Aber ich möchte dies nicht jedes Mal duplizieren und ich habe das Gefühl, dass es da draußen eine bessere, sauberere Lösung gibt.

Ein weiterer verrückter "Problemumgehung" ist es, ein Wrapper -Skript namens Bla.sh zu erstellen, das Ulimit festlegen und Bla.pl anrufen würde, aber es ist wieder ein Hack in meinem Kopf und jetzt habe ich 2 Skripte (ich könnte sogar Bla.pl machen lassen Nennen Sie sich mit "ulimit -s bla; ./bla.pl ---foo" und handeln Sie anders, basierend darauf, ob es sieht -FOO oder nicht, aber das ist noch hackiger als zuvor).

Schließlich könnte ich anscheinend BSD :: Ressource installieren, aber ich möchte es vermeiden, externe Abhängigkeiten zu verwenden.

Also was ist DAS Weg, um die Ulimit in einem Perl -Skript zu stellen und es für alle Kinder zu gelten?

Vielen Dank.

War es hilfreich?

Lösung 4

Am Ende habe ich mich vorbereitet ulimit -s BLA zu den Befehlen, die es brauchten. Ich wollte speziell nicht mit BSD :: Ressource gehen, da es sich nicht um ein Standard -Perl -Paket handelt und bei etwa der Hälfte der vorhandenen Entwicklergeräte fehlte. Keine Benutzerinteraktion war eine spezifische Anforderung.

Andere Tipps

Sie haben Ihre Frage bereits beantwortet: Verwenden BSD :: Ressource.

Im Perl -Kern gibt es nichts setrlimit. Wenn Sie die Standardmethode nicht verwenden können (oder nicht), müssen Sie einen Hack verwenden. Alle Methoden, die Sie bereits beschrieben haben, würde funktionieren. (Beachten Sie, dass Sie eine Unterroutine zum Vorbereiten erstellen können ulimit -s BLA; zu jedem Befehl und dann dieses Sub statt von verwenden system.)

Sie können Ihre Perl immer in ein kleines Shell -Skript einwickeln:

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

use strict;

# etc, etc....

Es ist hässlich und offensichtlich wird das Skriptstart die Zeit etwas länger sein.

Hier ist ein Beispiel dafür, wie die CPU -Grenze festgelegt werden kann, ohne BSD :: Ressource zu verwenden (aber die Annahme, dass die Perl -System -Header vorhanden sind). Um sich an andere Ressourcen anzupassen, nehmen Sie die offensichtlichen Änderungen vor.

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);

Dies setzt das Wissen voraus, dass RLIM_T in der Tat nicht langweilig ist; Ich weiß nicht, ob es eine Möglichkeit gibt, diese Informationen aus den Perl -Headern zu extrahieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top