¿Cómo se configura un ulimit desde dentro de un script en Perl que se aplica a sus hijos?

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

  •  19-09-2019
  •  | 
  •  

Pregunta

Tengo un script en Perl que hace varios pasos de instalación para configurar una caja de desarrollo para nuestra compañía. Se ejecuta varios scripts de shell, algunos de los cuales accidente debido a la baja que ulimits necesarias (en concreto, la pila -s tamaño en mi caso).

Por lo tanto, me gustaría establecer una ulimit que se aplicaría a todos los scripts (children) comenzó desde dentro de mi principal Perl, pero no estoy seguro de cómo lograr que - cualquier intento de llamar ulimit desde dentro del script sólo configurarlo en que shell niño específico, que sale inmediatamente.

Soy consciente de que puedo llamar ulimit antes de correr el script de Perl o utilizar /etc/security/limits.conf pero no desea que el usuario sepa nada de esto - que sólo debe saber cómo ejecutar la secuencia de comandos, que debe hacerse cargo de todo de que para ellos.

También puedo correr ulimit cada vez que ejecute un comando, como este ulimit -s BLA; ./cmd pero no quiero duplicar esto cada vez y siento que hay una solución mejor, más limpio que hay.

Otra loca "solución" es hacer un guión envoltorio llamada BLA.sh que fijaría ulimit y llame BLA.pl, pero de nuevo, un corte en mi mente y ahora me gustaría tener 2 guiones (aunque podría hacer BLA.pl llama a sí mismo con "ulimit -s BLA; ./BLA.pl --foo". y actuar de manera diferente en función de si se ve --foo o no, pero eso es aún hackier que antes)

Por último, al parecer, pude instalar BSD :: Recursos pero me gustaría evitar el uso de dependencias externas.

¿Qué es EL manera para establecer el ulimit desde un script Perl y hacer que se aplica a todos los niños?

Gracias.

¿Fue útil?

Solución 4

Terminé anteponiendo ulimit -s BLA a los comandos que lo necesitaban. Me específicamente no quería ir con BSD :: Recursos porque no es un paquete Perl defecto y le faltaba en aproximadamente la mitad de las máquinas existentes dev. No interacción del usuario era un requisito específico.

Otros consejos

Ya ha respondido a su pregunta:. Usar BSD :: Recursos

No hay nada en el núcleo de Perl que se conecta con setrlimit. Si no puede (o no) por el método estándar, entonces usted tiene que usar un hack. Cualquiera de los métodos que ya he descrito funcionaría. (Tenga en cuenta que se podría crear una subrutina para anteponer ulimit -s BLA; a cada comando y, a continuación, utilizar ese sub en lugar de system.)

Siempre se puede envolver su Perl en un pequeño script de shell:

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

use strict;

# etc, etc....

Es feo, y, obviamente, script de arranque vez será un poco más largo.

Este es un ejemplo de cómo establecer el límite de la CPU sin necesidad de utilizar BSD :: Recursos (pero suponiendo que el sistema Perl cabeceras están allí). Para adaptarse a otros recursos, hacer los cambios obvios.

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

Esto supone el conocimiento de que es, de hecho rlim_t largo sin signo; No sé si hay una manera de extraer esta información de las cabeceras de Perl.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top