2009-04-13 16 views
8

Sto cercando la mia bash per emettere un segnale acustico, se il comando che eseguo prende più di un certo tempo di muro (diciamo 1 minuto).bash per emettere un segnale acustico se il comando richiede più di 1 minuto per terminare

se continua a emettere segnali acustici ogni pochi minuti dopo aver premuto Invio o qualcosa del genere .. questo è notevole.

Qualche idea intelligente?

Posso utilizzare la funzione di monitoraggio dello schermo come ultima risorsa. (Sono su cygwin, ma non dovrebbe essere importante).

Vorrei chiarire:

$ 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

spero che lo script fornito sia quello che ti serve – Drakosha

risposta

2

Non ci sono comandi in Linux che vi beep per voi. Controlla il codice sorgente per il beep disponibile con Ubuntu (e probabilmente altre distribuzioni) o dai un'occhiata a http://www.johnath.com/beep/beep.c per un'altra fonte (è lo stesso codice, credo).

Consente di controllare facilmente frequenza, lunghezza e ripetizioni (tra le altre cose).

Per effettivamente farlo funzionare, avrete bisogno di uno script che avvia il programma attuale lavoratore in sottofondo, poi va in un loop "sleep 60", segnale acustico fino a quando non finisce.

Il seguente script dovrebbe essere un buon inizio. Si esegue con qualcosa di simile:

beeper sleep 3600 

e si corre il sleep 3600 in background, segnale acustico ogni minuto fino a quando non finisce.

#!/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 

Ecco come funziona. Esegue gli argomenti come un processo in background e salva l'ID del processo. Quindi esegue il ciclo ogni due secondi, controllando quando il minuto cambia e emette un segnale acustico quando questo è il caso (quindi il primo bip qui potrebbe essere qualsiasi cosa fino a un minuto).

L'uscita dal ciclo si verifica quando il processo scompare dall'uscita di ps.

Si può persino fare un segnale acustico di 3600 & per mettere l'intero lotto in background. Per interrompere il segnale acustico, interrompere il processo di segnalazione acustica (se si desidera che il lavoro continui senza segnali acustici) o uccidere il processo di lavoro stesso (che interromperà sia il lavoro che il segnale acustico).

+1

1. '$ *'? L'espansione di Wordsplitting e Pathname mangerà i tuoi bambini. 2. 'ps' per verificare se un PID è ancora vivo? Nonono, uccidi, leggi di kill -0. 3. Molto convinto? – lhunath

+0

Questo è il motivo per cui ho detto che lo script era un inizio (non ho aggiunto altre funzionalità come un messaggio di aiuto o un controllo degli errori per sapere se il comando inizia). Il ps funziona bene quindi non c'è bisogno di cambiarlo, nonostante siano disponibili altre funzionalità (ammetto che non sapevo nulla di "kill -0", è bello). – paxdiablo

-1

Non so estemporaneo se funziona su bash, ma con molte conchiglie qualcosa come

command && echo ^G 

(ctrl-g) emette un segnale acustico dopo il completamento del comando. Questo è spesso utile quando si desidera eseguire un comando di lunga durata e poi andare a lavorare in un'altra finestra, ma ricevere una notifica al termine della prima operazione. (Io sono chiaro se questo è il vostro obiettivo o meno.)

0

Sono sicuro che ho usato qualcosa come:

echo "\007" 

non hanno un guscio * nix a portata di mano per testare.

+1

'echo -e" \ 007 "' funziona per me su linux/bsd – xkcd150

0
echo "\007" 
  • emette un segnale acustico per me.

    $!

  • restituisce il pid dell'ultimo processo eseguito in background in bash, in modo da poter dormire su di esso e verificare se è ancora in esecuzione.

Per essere più chiari, acquisire il pid utilizzando $! e dormi nel ciclo infinito e controlla se il pid sopra è ancora vivo.

Dopo (si spera) capire ciò che si vuole, ecco il codice:

#! /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

Stai chiedendo due cose completamente diverse qui. Prima chiedi cosa fare per ottenere un segnale acustico dopo un minuto, quindi chiedi di ricevere un segnale acustico dopo che il comando è terminato. Queste sono due cose che vengono affrontate in modo completamente diverso.

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

    printf '\a' 
    return $r 
} 

Questa funzione esegue un comando e poi emette un segnale acustico una volta una volta del comando fatto, pur facendo in modo che il codice di uscita del comando è il codice di uscita della funzione.

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

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

    kill $! 
    return $r 
} 

Questa funzione emette un segnale acustico, dopo un certo periodo di tempo a meno che il comando è stato completato prima di quel momento (qui, 60 secondi, un minuto).

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

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

    kill $! 
    return $r 
} 

Questo è un semplice adattamento della funzione precedente che emette un segnale acustico ogni minuto per il tempo che il comando è ancora 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 
} 

E, infine, una funzione che emette un segnale acustico ogni minuto, ma solo dopo che il comando è terminato. Tiene i beep fino a quando non premi un tasto per fermarlo. Quindi, la funzione ritorna con il codice di uscita del comando.

Penso che copriremo tutte le basi che potevi avere con la tua domanda.

Usa (e combinare) loro in questo 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

Mi piace la risposta fornita da Pax. Date un'occhiata a ciò che 'bip' in grado di fare:

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

Usage: beep [freq -f] [lunghezza -l] [-r ripetizioni] [-d delay] [-d delay] [ -s] [-c] [-e dispositivo]

bip [Opzioni ...] [-n] [- nuovo] [Opzioni ...] ... beep [-h] [- -help] beep [-v] [-V] [--version]

Quindi, si potrebbe oscillare i bip (che li rende più forte, più a lungo, o entrambi) come il programma continua a funzionare più a lungo del previsto.

Se ci lavori, puoi fare in modo che la sceneggiatura riproduca le versioni MUSAC delle hit 80 preferite di tutti, che sicuramente attireranno qualcuno al terminale, se non altro per farla smettere.

3

Un umile suggerimento: se si dispone di un comando che si sa richiederà un po ', basta seguire il comando con un punto e virgola, quindi un segnale acustico.

rsync foo bar; beep 
Problemi correlati