Wie setze ich ein ulimit innerhalb eines Perl-Skripts, das für seine untergeordneten Elemente gilt?

7

Ich habe ein Perl-Skript, das verschiedene Installationsschritte ausführt, um eine Entwicklungsbox für unser Unternehmen einzurichten. Es führt verschiedene Shell-Skripte aus, von denen einige aufgrund niedriger als erforderlich ulimit s abstürzen (speziell Stack-Größe -s in meinem Fall).

Daher möchte ich ein ulimit setzen, das für alle Skripte ( children ) gilt, die von meinem Haupt-Perl aus gestartet wurden, aber ich bin nicht sicher, wie ich das erreichen soll - irgendwelche Versuche, ulimit aufzurufen Innerhalb des Skripts wird es nur auf diese bestimmte untergeordnete Shell gesetzt, die sofort beendet wird.

Ich bin mir bewusst, dass ich ulimit aufrufen kann, bevor ich das Perl-Skript ausführe oder /etc/security/limits.conf verwende, aber ich möchte nicht, dass der Benutzer davon weiß - sie sollten nur wissen, wie das Skript ausgeführt wird, was sollte kümmere dich um all das für sie.

Ich kann ulimit auch jedes Mal ausführen, wenn ich einen Befehl ausführe, wie zum Beispiel ulimit -s BLA; ./cmd , aber ich möchte das nicht jedes Mal duplizieren und ich habe das Gefühl, dass es eine bessere, sauberere Lösung gibt.

Ein weiterer verrückter "Workaround" ist das Erstellen eines Wrapper-Skripts namens BLA.sh, das ulimit setzen und BLA.pl aufrufen würde, aber es ist ein Hack in meinem Kopf und ich hätte jetzt zwei Skripte (die ich sogar machen könnte) BLA.pl nennt sich selbst mit "ulimit -s BLA; ./BLA.pl --foo" und verhält sich unterschiedlich, je nachdem, ob es - foo oder nicht sieht, aber das ist noch hackiger als zuvor.

Schließlich könnte ich BSD :: Resource installieren, aber ich möchte externe Abhängigkeiten vermeiden.

Was also ist DER Weg, das ulimit innerhalb eines Perl-Skripts zu setzen und es für alle Kinder anzuwenden?

Danke.

    
Artem Russakovskii 09.02.2010, 02:20
quelle

4 Antworten

1

Ich habe dann ulimit -s BLA den Befehlen vorangestellt, die es brauchten. Ich wollte speziell nicht mit BSD :: Resource gehen, da es kein Standard-Perl-Paket ist und auf etwa der Hälfte der existierenden Dev-Maschinen fehlte. Keine Benutzerinteraktion war eine spezielle Anforderung.

    
Artem Russakovskii 09.02.2010, 22:38
quelle
12

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

Es gibt nichts im Perl-Kern, das mit setrlimit interagiert. Wenn Sie die Standardmethode nicht verwenden können (oder wollen), müssen Sie einen Hack verwenden. Jede der Methoden, die Sie bereits beschrieben haben, funktioniert. (Beachten Sie, dass Sie eine Subroutine erstellen könnten, die ulimit -s BLA; jedem Befehl voranstellt und dann diese Subdatei anstelle von system verwendet.)

    
cjm 09.02.2010 03:14
quelle
4

Sie können Ihr Perl immer in ein kleines Shell-Skript einschließen:

%Vor%

Es ist hässlich, und die Skript-Startzeit wird natürlich etwas länger dauern.

    
Gavin Brock 30.03.2010 02:14
quelle
4

Hier ist ein Beispiel, wie man das CPU-Limit ohne Verwendung von BSD :: Resource einstellt (vorausgesetzt, die Perl-System-Header sind dort vorhanden). Nehmen Sie die offensichtlichen Änderungen vor, um sich an andere Ressourcen anzupassen.

%Vor%

Dies setzt voraus, dass rlim_t tatsächlich vorzeichenlos lang ist; Ich weiß nicht, ob es eine Möglichkeit gibt, diese Informationen aus den Perl-Headern zu extrahieren.

    
Julian Bradfield 25.11.2011 17:06
quelle

Tags und Links