2009-04-13 21 views
8

Estoy buscando mi bash para emitir un pitido, si el comando que ejecuto toma más que un cierto tiempo de pared (digamos 1 minuto).bash to beep si el comando tarda más de 1 minuto en terminar

si sigue emitiendo pitidos cada pocos minutos después de presionar enter o algo así ... eso es grandote.

¿Alguna idea inteligente?

Puedo usar la función de monitor de pantalla como último recurso. (Estoy en cygwin, pero eso no debería importar).

Aclaro:

$ ls  
    < output appears > 
$ rsync foo bar 
    < since this takes lot of time, i switch to other console 
     and forget this .. .and remember only after some time > 
    < so when this finished, i want it to beep > 
+0

Espero que el script proporcionado es lo que necesita – Drakosha

Respuesta

2

Hay comandos en Linux que emitirá un sonido para usted. Consulte el código fuente para el pitido disponible con Ubuntu (y probablemente otras distros) o eche un vistazo a http://www.johnath.com/beep/beep.c para otra fuente (creo que es el mismo código).

Le permite controlar la frecuencia, la longitud y las repeticiones (entre otras cosas) con facilidad.

para conseguir realmente que funcione, se necesita un script que se inicia el programa real trabajador en el fondo, luego entra en un bucle "sleep 60", a pitar hasta que termine.

El siguiente script debería ser un buen comienzo. Lo ejecuta con algo como:

beeper sleep 3600 

y se corre el sleep 3600 en el fondo, a pitar cada minuto hasta que termine.

#!/bin/bash 
$* & 
pid=$! 
oldmin=$(date +%M) 
exf=$pid 
while [[ $exf == $pid ]] ; do 
    min=$(date +%M) 
    if [[ $oldmin != $min ]] ; then 
     beep 
     oldmin=$min 
    fi 
    exf="$(ps -ef | awk '{print $2}' | grep $pid)" 
    sleep 2 
done 

Así es como funciona. Ejecuta los argumentos como un proceso en segundo plano y guarda la ID del proceso. Luego se repite cada dos segundos, verificando cuándo cambia el minuto y el sonido cuando ese es el caso (por lo que el primer pitido puede ser cualquier cosa hasta un minuto).

La salida del lazo ocurre cuando el proceso desaparece de la salida ps.

Incluso puede hacer que el beeper duerma 3600 & para dejar todo en segundo plano. Para detener el pitido, finalice el proceso del zumbador (si desea que el trabajo continúe sin pitidos) o elimine el proceso del trabajador (lo que detendrá tanto el trabajo como el pitido).

+1

1. '$ *'? La división de Wordsplitting y Pathname se comerá a tus bebés. 2. 'ps' para comprobar si un PID está todavía vivo Nonono, hombre matar, lee sobre matar -0. 3. ¿Convolucionó mucho? – lhunath

+0

Por eso dije que el script era un comienzo (tampoco agregué otras características como un mensaje de ayuda o un error para verificar si el comando comienza). El ps funciona bien, así que no hay necesidad de cambiarlo, a pesar de que hay otras funciones disponibles (admito que no sabía sobre el 'kill -0', es bueno). – paxdiablo

-1

No sé improvisada si funciona en bash, pero con muchas conchas algo así como

command && echo ^G 

(Ctrl-g) emitirá un pitido después de la finalización con éxito de la orden. Esto a menudo es útil cuando desea ejecutar un comando de larga ejecución y luego ir a trabajar en otra ventana, pero recibe una notificación cuando termina lo primero. (Estoy claro si ese es su objetivo o no).

0

Estoy seguro de que he usado algo como:

echo "\007" 

no tienen una cáscara * nix útil para probar.

+1

'echo -e" \ 007 "' funciona para mí en Linux/bsd – xkcd150

0
echo "\007" 
  • pitidos para mí.

    $!

  • devuelve el pid del último proceso ejecutado en segundo plano en bash, por lo que puede dormir sobre él y verificar si aún se está ejecutando.

Para ser más claros, capture el pid usando $! y duerma en un ciclo infinito y comprueba si pid arriba todavía está vivo.

Después (con suerte) la comprensión de lo que quiere, aquí está el código:

#! /bin/bash 

if [[ "$#" != "1" ]] 
then 
    echo "Usage: $0 <command>" 
    echo "Will wait till the command finishes and starts beeping once a minute" 
    exit 1 
fi 

CMD="$1" 
SECS_BETWEEN_BEEPS="60" 

# echo commmand and start time: 
echo "@@ Command: '${CMD}'" 
echo "@@ Starting at `date`" 

# execute and wait till finish: 
"${CMD}" 
wait 

# echo finish time: 
echo "@@ Finished at `date`" 

# beep once in SECS_BETWEEN_BEEPS: 
while ((1)) 
do 
    echo -en '\a' 
    sleep "${SECS_BETWEEN_BEEPS}" 
done 
-2

Usted está pidiendo dos cosas totalmente diferentes aquí. Primero, pregunte qué hacer para recibir pitidos después de un minuto, luego pida que se emitan pitidos después de que finalice el comando. Estas son dos cosas que se abordan completamente diferente.

# bof [command] [args...] - Beep on Finish 
bof() { 
    "[email protected]"; local r=$? 

    printf '\a' 
    return $r 
} 

Esta función se ejecuta un comando y luego emite un pitido una vez que el comando de hacerlo, mientras se asegura de que el código de salida del comando es el código de salida de la función.

# bot [command] [args...] - Beep on Timeout 
bot() { 
    { sleep 60; printf '\a'; } & 

    "[email protected]"; local r=$? 

    kill $! 
    return $r 
} 

Esta función emitirá un pitido después de un cierto tiempo a menos que el comando se ha completado antes de ese momento (en este caso, 60 segundos, un minuto).

# bem [command] [args...] - Beep every Minute 
bem() { 
    { while sleep 60; do printf '\a'; done; } & 

    "[email protected]"; local r=$? 

    kill $! 
    return $r 
} 

Ésta es una adaptación sencilla de la función anterior que emite un pitido cada minutos durante el tiempo que su comando está todavía vivo.

# bofem [command] [args...] - Beep on Finish every Minute 
bofem() { 
    "[email protected]"; local r=$? 

    until read -t 60 -n 1; do printf '\a'; done 
    return $r 
} 

Y, por último, una función que emite un pitido cada minutos, pero sólo después de que el comando ha terminado. Sigue emitiendo pitidos hasta que presionas una tecla para detenerlo. Luego, la función regresa con el código de salida de su comando.

Creo que cubrirá todas las bases que podría haber pensado con su pregunta.

uso (y combinar) que de este modo:

bof rsync foo bar:  # Beep when rsync finishes. 
bot ssh foo 'ls bar/' # Beep if the 'ssh' process takes too long to run. 
0

me gusta la respuesta proporcionada por Pax. Echar un vistazo a lo que 'pitido' puede hacer:

[email protected]:/usr/src/linux # beep --help 

Uso: pitido [Frecuencia f] [longitud -l] [-r repeticiones] [-d retardo] [-d retardo] [ -s] [c] [dispositivo -e]

pitido [Opciones ...] [-n] [--new] [Opciones ...] ... bip [-h] [- -help] pitido [-v] [-V] [--version]

Por lo tanto, se podría oscilar los pitidos (haciéndolos más fuerte, más largo, o ambos) como el el programa continúa funcionando más de lo esperado.

Si trabajas en él, puedes hacer que el script reproduzca las versiones MUSAC de los éxitos favoritos de los 80, lo que seguramente atraerá a alguien a la terminal, sin más motivo que detenerlo.

3

Una sugerencia humilde: si tiene un comando que sabe que llevará un tiempo, simplemente siga el comando con un punto y coma, luego pite.

rsync foo bar; beep 
Cuestiones relacionadas