Come posso attivare una notifica al termine di un processo / processo?


84

Il posto in cui lavoro ha comandi che richiedono molto tempo per essere eseguiti.

C'è un comando / utilità che posso usare per avvisarmi quando l'esecuzione del comando è finita? Potrebbe essere una finestra popup o forse un piccolo suono.


1
@ La risposta accettata di slhck è fica: avrei dovuto rendermene conto fg;say "Job finished" funzionerebbe. Ma ... c'è un modo in cui può essere ulteriormente automatizzato - cioè suonare il campanello o avvisare dopo il completamento di qualsiasi lavoro che richiede più di una soglia come un minuto? Esiste una variabile di shell, ad es. in bash, che è il tempo trascorso dell'ultimo comando?
Krazy Glew

... 2 ore dopo, trovato stackoverflow.com/questions/1862510/... ... inserisci '(($ timer_show & gt; $ {LONG_RUNTIME: -300})) & amp; & amp; dì "long running job completed" "in timer_stop ... next, aggiungi ai comandi di compilazione di emacs ... e notifica il mio orologio Pebble (odio le notifiche del telefono)
Krazy Glew

Risposte:


114

In generale, se lo sai prima eseguendo il comando, puoi solo avviarlo con:

command; command-after &

Questo eseguirà il command-after dopo il comando precedente è uscito (indipendentemente dal suo codice di uscita). Il & lo avvierà in background.

Se ti interessa un'uscita riuscita o fallita, usa rispettivamente:

command && command-after-only-if-success &
command || command-after-only-if-fail &

Se il comando ha già iniziato puoi usare il controllo dei lavori per sospenderlo, quindi riportarlo in primo piano con fg incatenato con la tua notifica:

command
# enter Ctrl-z
fg ; command-after

Ora ... quello che vuoi fare dopo dipende dal tuo ambiente.

  • Sopra qualsiasi sistema , Puoi "Suona" la campana del terminale . Dipende dal tuo sistema esatto che cosa funziona veramente (BSD vs. GNU Linux, ecc.), Ma tput bel dovresti ... dovrebbe. Non ho potuto testarlo in modo affidabile in questo momento, però. Cerca "suoneria" per saperne di più.

  • Sopra Mac OS X , puoi usare AppleScript per far apparire una finestra di dialogo del Finder:

    osascript -e 'tell Application "Finder" to display dialog "Job finished" '
    

    Potresti dirti qualcosa:

    say "Job finished"
    

    Oppure puoi usare il sistema di notifica di Mountain Lion:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • Nel GNOME , zenity può mostrare una finestra di dialogo GTK, chiamata dalla riga di comando. Vedi anche questa domanda sull'overflow dello stack: mostrando una finestra di messaggio da uno script bash in linux . Può essere installato tramite il gestore di pacchetti preferito.

    zenity --info --text="Job finished"
    
  • Alcune distribuzioni potrebbero avere xmessage. In particolare per gli ambienti GTK, c'è gxmessage.

  • Ubuntu ha un sistema di notifica che puoi attivare con notify-send.

    notify-send "Job finished!"
    
  • KDE usi kdialog, per esempio:

    kdialog --passivepopup 'Job finished'
    

Fammi sapere quale comando hai usato! Ho aggiunto anche altre opzioni.
slhck

Sto scherzando con notify-send e xmessage. Entrambi sembrano interessanti! Ecco la prossima cosa che sto cercando - superuser.com/questions/345463/...
Utkarsh Sinha

2
su Mac OS X, è anche possibile utilizzare l'utilità della riga di comando "say". ci sono anche molte voci disponibili, controlla "say -h";)
trinth

1
Perché stai suggerendo che "command-after" dovrebbe essere eseguito in modo asincrono? Volevi dire? (command; command-after) &?
G-Man

Questa soluzione è per gli utenti di Konsole e non è una soluzione perfetta in quanto si basa sul comando sia prolisso finché non è completo, o completamente silenzioso (senza output) fino a quando non viene completato il punto in cui il prompt ritorna. Tuttavia, questo è esattamente ciò di cui avevo bisogno quando sono venuto in cerca di aiuto. Puoi configurare Konsole per far apparire una notifica, riprodurre un suono, ecc. Quindi devi attivare il monitoraggio della shell. Monitora il silenzio se il tuo comando restituisce un po 'di cose fino al suo completamento, o silenzia se non stampa nulla e poi restituisce la shell.
MrMas

19

Sui sistemi unix puoi suonare il campanello acustico:

echo -e "\a"

Questo è davvero utile in aggiunta alla notifica di un messaggio su mac
Sirens

1
uguale a tput bel
Dwight Spencer


4

Ho appena iniziato a usare notifu per le notifiche desktop da Cygwin. È un'app di notifica della riga di comando per Windows.

Esempio:

ls -l && /c/notifu-1.6/notifu64 /m "This is a simple Notifu message."

4

Per ottenere una notifica sonora è possibile utilizzare spd-say "Some text". Esempio:

some-command; spd-say "Yo"

Quale sistema operativo? Non lo vedo su Mac o Ubuntu
Edward Falk

@EdwardFalk Sto usando Ubuntu
milkovsky

OK, sto usando una versione piuttosto vecchia, quindi forse è nelle versioni più recenti.
Edward Falk

1
È solo un'applicazione di sintesi vocale. Puoi installarlo tramite sudo apt-get install speech-dispatcher. O usare alternative askubuntu.com/questions/501910/...
milkovsky

Ah, non installato di default? Avrei dovuto pensarci. Grazie per il link.
Edward Falk

3

Per Linux, c'è un trucco ingegnoso per farlo automaticamente senza dover digitare un comando per la notifica ogni volta.

Prima installare Autokey. Questo aiuta a definire le azioni per diverse sequenze di tasti.

sudo apt-get install autokey-gtk

Ora, definire una nuova frase in autokey e assegnare il tasto di scelta rapida come Alt + Invio. Aggiungi questa frase:

; notify-send "Job finished!" &
  #

Si noti che una nuova riga dopo la prima riga è importante.

Inoltre, aggiungi un filtro finestra. Io uso guake e terminale. Includere qualsiasi altro terminale che si utilizza.

.*(guake)|(Terminal).*

Hai finito!!

Ora, ogni volta che è necessario ricevere notifiche per un comando, eseguirlo usando Alt + Invio invece di Invio / Invio.

Fonte: http://dotpad.blogspot.in/2014/12/notification-when-command-finished.html


3

Anche se altre risposte hanno già coperto la maggior parte dei modi per ottenere le notifiche su un lavoro finito, voglio dare i miei due centesimi da quando hai fatto la tua domanda nel seguente formato:

Il posto in cui lavoro ha comandi che richiedono molto tempo per essere eseguiti.

Ho lo stesso problema. A volte qualcosa può funzionare per 15 minuti.

Ho la seguente funzione nel mio .bashrc:

# push a notification to your phone. can be handy if you're running a
# build and you want to be notified when it's finished.
push() {
    curl -s -F "token=PUSHOVER_TOKEN" \
    -F "user=PUSHOVER_USER" \
    -F "title=terminal" \
    -F "message=$1" https://api.pushover.net/1/messages.json > /dev/null 2>&1
}

Questo utilizza l'app Pushover per inviare una notifica al mio telefono. In questo modo posso andare a pranzo o partecipare a una riunione e ricevere comunque una notifica sui lavori che ho iniziato sul mio computer prima di partire.

Lo uso nel modo seguente:

command_to_run && push "yes! command finished successfully!" || push "awww man! something failed :-("

Quindi, se il comando restituisce un codice di uscita corretto, verrà eseguita la prima pressione. In caso di errore, verrà eseguito il secondo.

Ofc è necessario creare un utente su Pushover e registrare un'app da cui inviare le notifiche https://pushover.net/

Spero che questo ha aiutato!


OK, quindi "pushover" è un servizio Web che invia notifiche ai telefoni su cui è installata l'app "pushover"?
Edward Falk

1
è un servizio web che invia notifiche a telefoni, computer e amp; tutto con un browser web moderno . Quindi, puoi avere un pushover aperto sul tuo PC e telefono e ricevere notifiche su tutti i dispositivi. pulito, eh? :-)
Thatkookooguy

3

scrissi ntfy proprio per questo scopo. È piattaforme e può automaticamente invia notifiche quando terminano i comandi con esecuzione prolungata.

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

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

Dai un'occhiata a http://ntfy.rtfd.io

Oltre a ciò, può anche:

  • supress notifiche automatiche quando il terminale è in primo piano (X11, iTerm2 e Terminal.app supportati e abilitati di default)
  • inviare notifiche basate su cloud (pushover, pushbullet e XMPP)
  • essere utilizzato per inviare notifiche quando termina un processo (non il suddetto supporto automatico)
  • inviare manualmente le notifiche (utile per gli script!)

Bravo. Questa è davvero la risposta più utile.
Adam Bittlingmayer

Sono d'accordo. Lo uso per visualizzare una notifica sul desktop e trasmettere la notifica al mio telefono allo stesso tempo.
Michael

1

Se usi csh o tcsh come shell interattiva, puoi usare notify comando:

% long-running-command &
[1] 14431
% notify %1
% 
(later, when the command finishes)
[1]    Done                          long-running-command

È possibile ottenere un effetto simile in bash con set -b o set -o notify.

Questo probabilmente non soddisfa le tue esigenze, poiché tutto ciò che fa è stampare un messaggio; Non penso che possa essere configurato per far apparire una finestra o suonare il campanello.


Sto cercando di evitare di guardare il guscio per scoprire se un lavoro è finito. Grazie comunque!
Utkarsh Sinha


1

Se stai usando npm poi node-notifier fornire un soluzione multipiattaforma .

notify -t "Agent Coulson" --icon https://raw.githubusercontent.com/mikaelbr/node-notifier/master/example/coulson.jpg -m "Well, that's new. "

Anteprima

  • Linux KDE

Linux KDE

  • finestre

Windows

  • Mac OS

mac

  • Ringhiare

Growl


1

Vorrei aver notato questo thread anni fa. La mia soluzione era essenzialmente uguale a quella di Slhck, ma ho scritto una sceneggiatura. Io lo uso per tutto il tempo. Pubblicando qui per condividerlo.

#!/bin/bash

msg='all done'
quiet=false
if [ "$1" = '-q' ]; then quiet=true; shift; fi
if [ $# -gt 0 ]; then msg="$*"; fi

echo -ne "\x1b]0;$msg\a"
if [ -x /usr/bin/zenity ]; then
  unset WINDOWID
  exec zenity --info --text="$msg"
elif [ -x /usr/bin/xmessage ]; then
  exec xmessage -nearmouse "$msg"
elif [ -x /usr/bin/osascript ]; then
  if ! $quiet; then say "done" &; fi
  osascript -e "tell application \"System Events\" to display dialog \"$msg\""
else
  echo $msg
fi

Una piccola spiegazione: la corda "\x1b]0;$msg\a" è la sequenza di escape ANSI per inserire il messaggio nella barra del titolo della finestra da cui è stato eseguito. Trovo abbastanza utile a volte essere in grado di vedere da quale finestra proviene il messaggio.




Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.