Come faccio a impostare un ulimit dall'interno di uno script Perl che si applica ai suoi figli?

StackOverflow https://stackoverflow.com/questions/2226329

  •  19-09-2019
  •  | 
  •  

Domanda

Ho uno script Perl che fa varie fasi di installazione per configurare una casella di sviluppo per la nostra azienda. Corre vari script di shell, alcuni dei quali a causa di incidente inferiore ulimits richieste (in particolare, stack di dimensioni -s nel mio caso).

Quindi, mi piacerebbe impostare una ulimit che si applicherebbe a tutti gli script (children) ha iniziato da dentro il mio principale Perl, ma non sono sicuro come ottenere che - ogni tentativo di chiamare ulimit all'interno dello script solo impostarlo su quel guscio figlio specifico, che esce immediatamente.

Sono consapevole che posso chiamare ulimit prima ho eseguito lo script Perl o utilizzare /etc/security/limits.conf, ma non voglio che l'utente sappia niente di tutto questo - dovrebbero solo sapere come eseguire lo script, che dovrebbe prendersi cura di tutti di che anche per loro.

Posso anche correre ulimit ogni volta che esegue un comando, come questo ulimit -s BLA; ./cmd ma io non voglio duplicare questo ogni volta e mi sento come se ci fosse una soluzione migliore, più pulito là fuori.

Un altro "soluzione" pazzo è quello di rendere uno script wrapper chiamato BLA.sh che impostare ulimit e chiamare BLA.pl, ma ancora una volta, si tratta di un hack nella mia mente e ora mi piacerebbe avere 2 script (potrei anche fare BLA.pl chiamare se stesso con "ulimit -s BLA; ./BLA.pl --foo". e agire in modo diverso a seconda che si vede --foo o no, ma che è ancora hackier rispetto a prima)

Infine, a quanto pare ho potuto installare BSD :: Resource ma mi piacerebbe evitare l'uso di dipendenze esterne.

Allora, qual è L ' modo per impostare l'ulimit dall'interno di uno script Perl e renderlo si applicano a tutti i bambini?

Grazie.

È stato utile?

Soluzione 4

Ho finito per anteporre ulimit -s BLA ai comandi che ne avevano bisogno. Io in particolare non volevo andare con BSD :: Resource perché non è un pacchetto di default Perl e mancava in circa la metà delle macchine dev esistenti. Nessuna interazione utente è stato un requisito specifico.

Altri suggerimenti

Hai già risposto alla tua domanda:. Utilizzare BSD :: Resource

Non c'è nulla nel nucleo Perl che si interfaccia con setrlimit. Se non è possibile (o non vuole) utilizzare il metodo standard, quindi è necessario utilizzare un hack. Uno qualsiasi dei metodi che hai già descritto avrebbe funzionato. (Si noti che è possibile creare una subroutine per anteporre ulimit -s BLA; per ogni comando, e quindi utilizzare tale sub invece di system.)

Si può sempre avvolgere la perl in uno script piccolo guscio:

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

use strict;

# etc, etc....

E 'brutto, e, ovviamente, script di avvio tempo sarà leggermente più lungo.

Ecco un esempio di come impostare il limite della CPU senza utilizzare BSD :: Resource (ma assumendo il sistema Perl intestazioni ci sono). Per adattare ad altre risorse, apportare le modifiche evidenti.

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

Questo presuppone la conoscenza che rlim_t è infatti unsigned long; Non so se c'è un modo per estrarre queste informazioni dalle intestazioni Perl.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top