Eliminar el proceso después de que se haya permitido que se ejecute durante un tiempo

13

Quiero limitar el tiempo que un grepcomando de proceso puede ejecutarse o estar vivo.

Por ejemplo. Quiero realizar lo siguiente:

grep -qsRw -m1 "parameter" /var

Pero antes de ejecutar el grepcomando, quiero limitar la duración del grepproceso, digamos que no más de 30 segundos.

¿Cómo hago esto?

Y si puede, ¿cómo regreso o restablezco para no tener límite de tiempo después?

yael
fuente
3
¿no preguntaste esto ya? stackoverflow.com/questions/3061377/…
No, esta otra pregunta porque no recibo respuesta sobre la pregunta original Yael
44
@yael: obtuviste una solución perfectamente buena anteriormente timeout, e incluso recibiste instrucciones sobre cómo instalarla. Es grosero ignorar esta respuesta y luego duplicar su pregunta.
Paul R
lo siento pero NO, no quiero instalar nada en mi sistema THX yael
55
@yael: entonces necesita actualizar su pregunta original para incluir esta restricción , NO simplemente duplicar la pregunta y comenzar de nuevo
Paul R

Respuestas:

12

Puede usar timelimit , está disponible en el ubuntu predeterminado o puede compilarlo usted mismo.

timelimit ejecuta un comando y finaliza el proceso generado después de un tiempo determinado con una señal dada. Primero se envía una señal de "advertencia", luego, después de un tiempo de espera, una señal de "muerte", similar a la forma en que init (8) opera en el apagado.

feniix
fuente
2
No está en mi Ubuntus (escritorio 10.10, servidor 11.04), por lo que probablemente no sea un valor predeterminado. Pero se agarró fácilmente con un rápido sudo aptitude install timelimit. Funciona muy bien una vez instalado.
Día
7

Aquí hay un poco de hack para eso:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Básicamente, comienza la búsqueda en segundo plano, luego inicia una subshell que espera 30 segundos y luego mata el proceso de búsqueda. Si la búsqueda toma <30s, el proceso ya estará muerto. No es una buena idea matar un proceso que ya está muerto, ya que hay una pequeña posibilidad de que algo más reutilice el pid, pero para algo como esto generalmente está bien. Por último, la búsqueda se vuelve a poner en primer plano y se ejecutará hasta que finalice o se elimine.

Walter Mundt
fuente
¿Cómo obtener el $? del grep en este caso porque en mi script tomo el $? de grep y verificar si grep coincide con la cadena? yael
No estoy seguro de que haya una manera directa de hacerlo. Además, este enfoque no funciona en un script donde bash no tiene control de trabajo activo. Puede que tenga que recurrir a un poco de piratería de Perl para hacer el trabajo en un script. Hmm ...
Walter Mundt
¿Es posible llegar a esta pregunta a Perl? Yael
4

Crea un nuevo archivo llamado "tgrep" y pon lo siguiente (o llámalo como quieras):

#!/bin/bash
grep $@ &
PID=$!
sleep 30 && kill $PID 2>/dev/null &
wait $PID
exit 0

A continuación, corre chmod a+x tgrep. Ahora si quieres usarlo puedes escribir

./tgrep -i "results" /home/dan/*txt

O simplemente puede usarlo como tgrep (sin el ./ y poder usarlo desde cualquier directorio) si lo coloca en un directorio contenido en su variable $ PATH (como / home / dan / bin /, si está en su variable $ PATH, de lo contrario puede agregarla).

Jarvin
fuente