La siguiente secuencia de comandos muestra cómo hacerlo utilizando tareas en segundo plano. La primera sección elimina un proceso de 60 segundos después del límite de 10 segundos. El segundo intenta matar un proceso que ya ha salido. Tenga en cuenta que, si configura el tiempo de espera realmente alto, las ID del proceso pueden volcarse y usted matará el proceso incorrecto, pero esto es más un problema teórico: el tiempo de espera debería ser muy grande y tendría que para comenzar un lote de procesos.
#!/usr/bin/bash
sleep 60 &
pid=$!
sleep 10
kill -9 $pid
sleep 3 &
pid=$!
sleep 10
kill -9 $pid
Aquí está la salida en mi caja de Cygwin:
$ ./limit10
./limit10: line 9: 4492 Killed sleep 60
./limit10: line 11: kill: (4560) - No such process
Si sólo desea que esperar hasta que el proceso ha terminado, es necesario entrar en un bucle y comprobar. Esto es ligeramente menos preciso desde sleep 1
y los otros comandos realmente tomarán más de un segundo (pero no mucho más). Utilice esta secuencia de comandos para reemplazar la segunda sección anterior (los comandos "echo $proc
" y "date
" son para la depuración, no esperaría tenerlos en la solución final).
#!/usr/bin/bash
date
sleep 3 &
pid=$!
((lim = 10))
while [[ $lim -gt 0 ]] ; do
sleep 1
proc=$(ps -ef | awk -v pid=$pid '$2==pid{print}{}')
echo $proc
((lim = lim - 1))
if [[ -z "$proc" ]] ; then
((lim = -9))
fi
done
date
if [[ $lim -gt -9 ]] ; then
kill -9 $pid
fi
date
Básicamente, comprueba si el proceso todavía se está ejecutando cada segundo. Si no, sale del ciclo con un valor especial para no intentar matar al niño. De lo contrario, se agota y mata al niño.
Aquí está la salida para un sleep 3
:
Mon Feb 9 11:10:37 WADT 2009
pax 4268 2476 con 11:10:37 /usr/bin/sleep
pax 4268 2476 con 11:10:37 /usr/bin/sleep
Mon Feb 9 11:10:41 WADT 2009
Mon Feb 9 11:10:41 WADT 2009
y una sleep 60
:
Mon Feb 9 11:11:51 WADT 2009
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
Mon Feb 9 11:12:03 WADT 2009
Mon Feb 9 11:12:03 WADT 2009
./limit10: line 20: 4176 Killed sleep 60
@jm, vea mi respuesta actualizada para saber cómo dejar de esperar lo antes posible f timeout y child-exit -normalmente. – paxdiablo
Pregunta similar, algunas respuestas diferentes: http://stackoverflow.com/questions/687948 –