Ejecutar programa en linux "con limitaciones"

Pues busco ejecutar un progama de consola en linux pero de una forma muy exhaustiva:

- Limitar su consumo de memoria, si supera una cantidad x se aborta el progama.
- Limitar su tiempo de ejecución, si supera un tiempo x se aborta el progama.
- Prohibido el acceso a archivos o recursos del sistema, aborto automático.
- Prohibido crear hilos o procesos nuevos. Aborto automático.

Existen opciones en la linea de comandos para ejecutar un progama así?
Muy buenas.

Efectivamente. Existe un comando que más o menos te puede ayudar en lo que pides: ulimit.
Aplica unos límites a todo proceso ejecutado por el usuario, en cuanto ese usuario ejecuta el comando ulimit con las opciones necesarias, y lo aplica sólo a la terminal desde donde se ha ejecutado ulimit.

Los límites que soporta, con los parámetros, así como los valores que tiene el usuario en ese momento, se puede visualizar ejecutando ulimit -a bajo ese usuario.

Si es momentaneo, lo puedes ejecutar antes del programa que quieras limitar. El límite no afectará a otras terminales, y en cuanto cierres la terminal que estás usando, desaparecerá.
Si lo quieres permanente, y a todas las terminales, sólo tienes que poner el comando ulimit con los parámetros a usar en el fichero ~/.bashrc del usuario al que quieres aplicarle los límites, o al fichero bashrc que está en /etc para aplicar los límites a todos los usuarios.

ulimit tiene un fichero de configuración: /etc/security/limits.conf, donde podremos aplicar límites a determinados usuarios, e incluso grupos, en el inicio y a todo de manera más sencilla y segura.

ulimit no posee (de momento) una página del manual. Tampoco tiene un parámetro de ayuda, por lo que toda la información y ejemplos que necesites tendrás que sacarla de la red.
Algo parecido a una ayuda, sería el parámetro -a que mencioné arriba.

Otro comando que también te podría servir es sysctl, que se utiliza para ver y modificar parámetros del kernel en tiempo real. De este hay mucha documentación y ejemplos por la red, y tiene página de manual y ayuda.

Perdón por el tocho, y espero que te sea útil.
Saludos :)
Para CPU conozco el programa "cpulimit" que limita el uso de CPU. Pero segun veo "ulimit" esta mas completo :B
Muy interesante lo del ulimit, pero:
csmNapster escribió:Si es momentaneo, lo puedes ejecutar antes del programa que quieras limitar. El límite no afectará a otras terminales, y en cuanto cierres la terminal que estás usando, desaparecerá.

Si lo ejecuto desde un script... ¿Solo hará efecto en el script no?
amchacon escribió:Muy interesante lo del ulimit, pero:
csmNapster escribió:Si es momentaneo, lo puedes ejecutar antes del programa que quieras limitar. El límite no afectará a otras terminales, y en cuanto cierres la terminal que estás usando, desaparecerá.

Si lo ejecuto desde un script... ¿Solo hará efecto en el script no?


Lo acabo de probar para asegurarme, y parece que si. Una vez que el script termina, los límites vuelven a como estaban antes de ejecutar el script.

Sin embargo hay un pero, que me acabo de dar cuenta, y es que ulimit cuenta TODOS los recursos que el usuario está usando en ese momento a la hora de aplicarle un límite. Ignoro si será igual con todos los parámetros que posee ulimit. Es posible que si.

Si por ejemplo desde el script haces "ulimit -u 256", estarás limitando el número de procesos que puedes ejecutar a 256 dentro del script. Pero no son 256 sólo para el script, sino 256 en general. Es decir, lo que vayas a ejecutar desde el script, más todos los procesos que tu usuario tenga en ese momento en la tabla de procesos. Por lo que si tenías 200 procesos antes del ulimit, en el script sólo te dejará ejecutar 56 procesos más (en realidad serían 55, porque se ejecutaría un intérprete de bash para ese script que te restaría el límite).

Sin embargo, sólo afecta al script, y ulimit sólo bloqueará procesos ejecutados en el script. Fuera de el, los demás procesos podrán abrir todos los hilos que quieran (hasta el límite impuesto en /etc/security/limits.conf, si lo hay). Pero cada vez que ejecutes algo, serán menos los procesos que podrán ejecutarse en el script.

Acabo de darme cuenta de que funciona así, lo siento, no me acordaba. [+risas]

noentiendero escribió:Para CPU conozco el programa "cpulimit" que limita el uso de CPU. Pero segun veo "ulimit" esta mas completo :B


Para controlar el uso de la cpu en comandos sueltos y scripts es una buena alternativa, además de que no cuenta el uso total del usuario como hace ulimit.

He mirado un poco por la red, para ver si encontraba alguna otra alternativa. Pero de momento, no he encontrado ninguna (igual alguien más del foro conoce otras alternativas). :(

Saludos. :)
4 respuestas