usrquota - Limitar el tiempo que un programa se ejecuta en Linux
quotacheck que es (7)
¿Tal vez el límite de tiempo de CPU ( ulimit -t
/ setrlimit(RLIMIT_CPU)
) ayudará?
En Linux, me gustaría ejecutar un programa, pero solo por un tiempo limitado, como 1 segundo. Si el programa excede este tiempo de ejecución, me gustaría eliminar el proceso y mostrar un mensaje de error.
Ah bueno. timeout(1)
.
DESCRIPCIÓN
Comience a COMANDO y elimínelo si aún se está ejecutando después de DURATION.
Ok, entonces solo escriba un breve programa en C que execlp
fork
, llame a execlp
o algo similar en el niño, mida el tiempo en el padre y kill
al niño. Debería ser fácil ...
Si tiene las fuentes, puede fork()
temprano en main()
y luego hacer que el proceso principal mida el tiempo y posiblemente mate el proceso secundario. Simplemente use las llamadas al sistema estándar fork()
, waitpid()
, kill()
, ... tal vez algún manejo estándar de señal Unix. No es demasiado complicado, pero requiere un poco de esfuerzo.
También puede escribir algo en el intérprete de comandos aunque dudo que sea tan preciso con respecto al tiempo de 1 segundo.
Si solo quiere medir la hora, escriba time <cmd ...>
en el shell.
podrías lanzarlo en un script de shell usando &
your_program &
pid=$!
sleep 1
if [ `pgrep $pid` ]
then
kill $pid
echo "killed $pid because it took too long."
fi
Espero que entiendas la idea, no estoy seguro de que esto sea correcto, mis habilidades de shell necesitan algo de actualización :)
no me permitirá eliminar mi respuesta ya que es la aceptada. Está obteniendo votos bajos ya que está en la parte superior de la lista con una mejor solución debajo. Si está en un sistema GNU, use el timeout
lugar de lo sugerido por @wRAR. Entonces, con la esperanza de que detenga la votación a la baja, así es como funciona:
timeout 1s ./myProgram
Puede usar s
, m
, h
d
por segundos (el valor predeterminado si se omite), minutos, horas o días. Una característica interesante aquí es que puede especificar otra opción -k 30s
(antes del 1s
arriba) para matarlo con un SIGKILL después de otros 30 segundos, en caso de que no responda al SIGTERM original.
Una herramienta muy útil. Ahora desplácese hacia abajo y hacia arriba, vote @ wRAR''s answer.
Para la posteridad, esta fue mi sugerencia original, inferior, aún podría ser si alguien la utilizara.
Un simple bash-script debería poder hacer eso por ti
./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn''t finish"
Eso debería hacerlo.
$!
se expande al último proceso de fondo (mediante el uso de &
), y kill devuelve falso si no mató ningún proceso, por lo que el eco solo se ejecuta si realmente mató algo.
2>/dev/null
redirige kill''s stderr; de lo contrario, imprimiría algo que le diga que no pudo matar el proceso.
Es posible que desee agregar un -KILL
o cualquier señal que desee utilizar para deshacerse de su proceso también.
EDITAR
Como lo señaló ephemient, aquí hay una carrera, si tu programa finaliza y el otro proceso le arrebata el pid, se lo matará. Para reducir la probabilidad de que suceda, podrías reaccionar al SIGCHLD y no intentar matarlo si eso sucede. Todavía hay posibilidad de matar el proceso incorrecto, pero es muy remoto.
trapped=""
trap ''trapped=yes'' SIGCHLD
./myProgram &
sleep 1
[ -z "$trapped" ] && kill $! 2>/dev/null && echo ''...''
tail -f file & pid=$!
sleep 10
kill $pid 2>/dev/null && echo ''...''