Come ottenere una notifica quando i miei comandi sono terminati

55

Sto eseguendo una serie di comandi sulla riga di comando che impiegano circa venti minuti per essere completati. Mi piacerebbe vedere una sorta di notifica sul mio Mac quando questi sono finiti quindi non ho bisogno di monitorare il terminale per quando finisce. C'è un modo per farlo?

$ svn update . && ant clean build start && *notify_me_somehow*

Modifica :

Potrei usare xclock ma questo sembra un trucco. Idealmente potrei inviare la notifica ovunque, come il mio telefono, schermo, ecc.

    
posta Amir Afghani 02.03.2011 - 18:25
fonte

13 risposte

55

(svn update . && ant clean build start && say done) || say error

    
risposta data 02.03.2011 - 21:38
fonte
46

In Mac OS 10.8 è possibile inviare messaggi del Centro notifiche (simili a Growl ma incorporati in Mac OS). Controlla questo pagina per vedere come installare una gemma Ruby che ti consentirà di inviare notifiche dalla riga di comando. Per semplificare l'uso comune del semplice fatto di occuparsi del fatto che qualcosa nel terminale è stato fatto, aggiungi un alias al tuo .bash_profile, ad esempio

alias notifyDone='terminal-notifier -title "Terminal" -message "Done with task!"'

Quindi puoi semplicemente fare

$ <long-running task> ; notifyDone

Una volta terminata l'attività di lunga durata, riceverai un bel popup modale che persiste finché non fai clic su di esso:

    
risposta data 19.03.2013 - 01:41
fonte
20

Utilizza Growl .

Nel file .dmg , cerca gli extra, c'è un binario growlnotify. Installalo, qualcosa di simile a /usr/local/bin . Quindi puoi usare questo comando

growlnotify --sticky --appIcon <icon> --message <message> -t <title>

per mostrare un popup, in questo modo:

    
risposta data 02.03.2011 - 19:15
fonte
16

A partire da Mac OS X Lion 10.7, Terminal ha alcuni nuovi indicatori di stato per aiutare con problemi come questo:

Nelle schede:

  • Attività: un indicatore di attività (indicatore di progresso della filatura) viene visualizzato quando c'è stato un recente output sul terminale. Ciò consente di vedere se è attualmente occupato o ha completato un lungo processo. (O, naturalmente, puoi usarlo per dire quando ha iniziato a produrre output dopo aver eseguito silenziosamente il lavoro per un po '.)

  • Non letti: viene visualizzato un puntino di sospensione "..." per indicare il nuovo testo non letto nelle schede dello sfondo. Quando si seleziona la scheda, l'indicatore viene cancellato.

  • Avviso: viene visualizzato un "campanello" per indicare quando un BEL è stato scritto in schede di sfondo o finestre di sfondo. Inoltre, Terminal visualizza un simbolo rosso sull'icona dell'applicazione, che indica il numero di avvisi / campane "non letti" in tutti i terminali. Se il terminale stesso è in background, rimbalza anche l'icona del Dock quando viene suonata una campana.

In finestra minimizzata Icone dock:

  • Attività: l'attività viene indicata visualizzando il nome del processo in primo piano.

  • Non letto: il testo non letto è indicato con un puntino di sospensione.

  • Le finestre dei terminali minimizzate mostrano i contenuti live nelle loro icone Dock. Questo può essere usato per vedere se c'è attività, o anche per determinare cosa sta facendo il terminale, se l'output che stai cercando è identificabile (ad esempio, una visualizzazione "top" è abbastanza facile da riconoscere anche a piccole dimensioni). Ciò è particolarmente utile quando l'ingrandimento del Dock è attivato o se hai spazio per un Dock di grandi dimensioni.

Inoltre, potresti visualizzare qualcosa nel terminale per attirare la tua attenzione (che sarebbe visibile anche in finestre ridotte a icona). Ad esempio:

  • Visualizza un grande asterisco: banner \*

  • Inverti il display: printf '\e[?5h'

  • Dipingi il display rosso: tput setab 1; tput clear

  • Siediti in loop, facendo lampeggiare lo schermo: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Esistono anche i codici di escape per manipolare le finestre (spostare, impostare le dimensioni, ingrandire, ridurre al minimo, ecc.). È possibile ingrandire la finestra del terminale, ad esempio:

printf '\e[9;1t'

Vedi "manipolazione delle finestre" al link per i dettagli.

Un altro approccio consiste nell'utilizzare AppleScript per visualizzare un avviso in una finestra separata:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'
    
risposta data 18.08.2011 - 05:13
fonte
11

So di essere in ritardo rispetto alla domanda, ma penso che ci sia un pezzo mancante che potrebbe essere d'aiuto. Ho scoperto che, mentre è pulito, avere il terminale con te non è esattamente funzionale. La cosa migliore è qualcosa di più sottile come questo:

ComehasottolineatoChris,LionhaaggiuntopiccolibadgedinotificaquandovienelanciatounBEL.Puoilanciarlotustessoconilcomando:

tputbel

Quindi,selavoriinbackgroundedesideriunanotificaaltermine,puoiprovarequalcosadeltipo:

ping-c5www.google.com&&tputbel&

Questoesegueilcomandopingcomeattivitàinbackground(l'impiccagioneecompleta)elanciaunsempliceavvisoaltermine.Storicamente,BELèstatoutilizzatoperemettereunsegnaleacustico[orribile],tuttaviaLionhasostituitoconpiacerel'effettosonoro"comando non valido", un badge di notifica e l'icona del terminale che rimbalza due volte nel dock.

    
risposta data 17.07.2012 - 08:19
fonte
4

Potresti anche usare il comando build in say per la notifica, ad esempio: "ant: build: done." Vedi: l'uomo dice nel terminale.

    
risposta data 02.03.2011 - 21:12
fonte
4

Presento in questa risposta due cose:

  • L'opzione di utilizzare afplay , che riproduce i file audio , per la notifica.
  • i miei strumenti per segnalazione dello stato di uscita insieme alla notifica.

Ho questo script, ~/bin/donebeep :

#!/bin/bash
if [ "$@" = 0 ]; then
  afplay -v 2 /System/Library/Sounds/Blow.aiff &
else
  afplay -v 2 /System/Library/Sounds/Sosumi.aiff &
fi

Suona un suono diverso a seconda che l'argomento sia 0. Quindi ho un alias:

alias donebeep='(savestatus=$?; ~/bin/donebeep $savestatus "$@"; exit $savestatus)'

(Che abbiano lo stesso nome è irrilevante e probabilmente una cattiva idea.)

Per usarlo nel tuo esempio, svn update . && ant clean build start; donebeep . Tieni presente che sto utilizzando ; anziché && , in modo che possa notificarmi in caso di errore oltre che di esito positivo.

Prima di Ho imparato circa afplay , ho usato say per parlare invece di messaggi. Il ruolo di donebeep è stato interpretato da questo script:

#!/bin/bash
say -v Bruce "Done $(basename "$(pwd)"), $@." &

Questo script pronuncia direttamente il codice di uscita invece di avere due messaggi diversi. Indica anche il nome della directory corrente (per aiutare a chiarire quale attività è stata eseguita), e può essere dato del testo aggiuntivo per dire passando i parametri all'alias (ecco perché l'alias ha "$@" in esso). Tieni presente la percentuale di trascinamento% co_de in modo che non sia necessario attendere la fine del discorso prima di ricevere una richiesta.

La pagina man per & è incompleto; afplay elenca tutte le opzioni:

Usage:
afplay [option...] audio_file

Options: (may appear before or after arguments)
  {-v | --volume} VOLUME
    set the volume for playback of the file
  {-h | --help}
    print help
  { --leaks}
    run leaks analysis  {-t | --time} TIME
    play for TIME seconds
  {-r | --rate} RATE
    play at playback rate
  {-q | --rQuality} QUALITY
    set the quality used for rate-scaled playback (default is 0 - low quality, 1 - high quality)
  {-d | --debug}
    debug print output
    
risposta data 19.08.2011 - 01:41
fonte
3

Creo uno strumento semplice che fa esattamente questo. link

Installazione

Node.js deve essere installato: link

$ npm install -g brb

Istruzioni

$ sleep 3; brb
    
risposta data 08.06.2014 - 12:40
fonte
1

Ho scritto ntfy esattamente per questo scopo. È multipiattaforma e può automaticamente inviare notifiche quando i comandi con esecuzione prolungata terminano.

Se hai il pip di Python (la maggior parte delle distribuzioni Linux e MacOS lo hanno), ecco come installarlo e abilitare le notifiche automatiche:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

Guarda il link

Oltre a ciò, può anche:

  • supress notifiche automatiche quando il terminale è in primo piano (X11, iTerm2 e Terminal.app supportati e abilitati di default)
  • invia notifiche basate su cloud (pushover, pushbullet e XMPP)
  • essere utilizzato per inviare notifiche quando termina un processo (non il suddetto supporto automatico)
  • invia manualmente notifiche (utili per gli script!)
risposta data 19.05.2016 - 17:46
fonte
0

Ubuntu spedisce il seguente alias in ~ / .bashrc:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Con questo, puoi fare cose come:

make; alert
sleep 10; alert

Forse c'è un equivalente a notify-send in Mac OSX? Ho visto finestre popup simili in Mac e Ubuntu.

    
risposta data 17.02.2012 - 07:32
fonte
0

Il mio problema con i suoni e le finestre modali è che non posso dire da dove vengono. Attualmente lavoro con un sacco di spazi, e talvolta verso l'alto di 20 finestre di terminale.

La mia soluzione è portatile sul lato unix e dovrebbe funzionare con qualsiasi cosa supporti le sequenze di escape ansi. Questa soluzione funziona con Snow Leopard e probabilmente funzionerà con versioni più antiche del terminale.

Riga singola in .bash_profile

function watch { $* ; echo -n -e "3[41m" ;  echo $* DONE ;  date ;  echo -n -e "3[0m" ; }

Rompendo:

$* expands to the original command I want to watch.
first escape sequence changes background color to red
echo repeats the command (with red background, the word DONE.
Running Date tells you when it finished.
last escape resets the terminal to what it was.

Se non ti piace il colore di sfondo rosso, google ascii escape code. Nota che questo non cambia tutto lo schermo in rosso, ma solo qualsiasi cosa viene emessa dopo che il comando è terminato.

    
risposta data 23.03.2013 - 08:19
fonte
0

Ho creato uno script per risolvere questo problema qui . Non hai bisogno di alcun software aggiuntivo per questo. Installazione:
brew install akashaggarwal7/tools/tsay
Uso:
sleep 5; tsay

Sentiti libero di contribuire!

    
risposta data 15.10.2016 - 17:03
fonte
0

Ecco la mia funzione bash (basta metterla ovunque in ~/.bashrc o ~/.zshrc :

watch(){
  cmd=$@ # Somehow interpolate $@ directly doesn't work.
  $@ && say 'Watch Completed!' && osascript -e "display notification \"Completed: $cmd\" with title \"Watch Alert\""
}

Per usarlo: watch echo 'hi there'

Puoi anche personalizzare il suono della notifica come documentato qui: link

    
risposta data 06.08.2017 - 06:30
fonte

Leggi altre domande sui tag