¿Comando Bash Run por cierto tiempo?

12

Estoy haciendo script bash para mi uso. ¿Cómo puedo ejecutar un comando durante cierto tiempo, como 20 segundos y terminar el comando? Probé muchas soluciones pero nada funciona, también probé el comando timeout sin éxito. Por favor, dame alguna solución para esto.

por ejemplo: quiero ejecutar este comando en script y terminal después de 10 segundos

some command
Umair Riaz
fuente

Respuestas:

14

Hm, eso debería hacer el truco:

xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave

xmessageproporciona un caso de prueba rápida aquí (en su caso, el comando airodump debería ir allí); &lo pone en segundo plano.

$!contiene el PID del último proceso iniciado (consulte, por ejemplo, /programming//a/1822042/2037712 ); El PID se guarda en la variable pidsave.

Después de esperar un poco ( sleep), envíe una TERMseñal al proceso.

mpy
fuente
Gracias amigo, funciona, pero ahora tengo 1 problema. Quiero ver la salida que se crea por comando, pero xmessage windows no muestra nada.
Umair Riaz
@UmairRiaz: xmessage fue solo un ejemplo. Para adaptar su ejemplo en la pregunta y registrar el resultado del comando, use some command > logfile &en la primera línea. Luego puedes analizar logfile.
mpy
4

Desde el indicador bash puedes usar "

  • your_command & sleep 20; kill $!
  • O utilice el comando de tiempo de espera: por ejemplo, aptget install timeoutytimeout -k 3m 14s your_command
  • O use expectcomo se explica aquí: /unix/43340/how-to-introduce-timeout-for-shell-scripting
  • o hazlo con perl: perl -e "alarm 10; exec @ARGV" "Your_command"
  • O use esta solución más críptica: $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( Fuente y explicación )
Hennes
fuente
1

Otra forma es usar pgrep $ pattern, o pkill $ pattern; devuelve todos los PID que coinciden con el patrón dado, buscando en todos los procesos en ejecución en la máquina. Entonces, para limitar el alcance de los PID a solo los que posee, use: pgrep -P $ mypid $ pattern, o pkill -P $ mypid $ pattern

Entonces, para ejecutar un proceso en segundo plano durante un período de tiempo establecido, su secuencia de comandos se vería así:

#!/bin/bash 
mypid=$$
run_something &
sleep $time_in_seconds
pkill -P $mypid something

Tenga en cuenta que esto eliminará todos los procesos con el mismo patrón de nombre que se ejecuta bajo el PID principal actual. Por lo tanto, puede usar esto para iniciar múltiples procesos y matarlos a todos simultáneamente después de un cierto tiempo.

Pablo
fuente
0

Podrías usar una alarma de línea de comandos como ebay-alarm

Instale el script del despertador y haga

ebay-alarm 10 sec -c some command &

marinara
fuente