Cómo obtener una notificación cuando se completen mis comandos

55

Estoy ejecutando una serie de comandos en la línea de comandos que demoran aproximadamente veinte minutos en completarse. Me gustaría ver algún tipo de notificación en mi Mac cuando estén terminadas, por lo que no necesito monitorear el terminal para cuando finalice. ¿Hay alguna manera de hacer esto?

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

Editar :

Podría usar xclock pero esto parece un hack. Idealmente, podría enviar la notificación a cualquier lugar, como mi teléfono, pantalla, etc.

    
pregunta Amir Afghani 02.03.2011 - 18:25

13 respuestas

55

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

    
respondido por el Eugene Bujak 02.03.2011 - 21:38
46

En Mac OS 10.8, puedes enviarte mensajes del Centro de notificaciones (similar a Growl pero integrado en Mac OS). Echa un vistazo a esto página para ver cómo instalar una gema de Ruby que le permitirá enviar notificaciones desde la línea de comandos. Para simplificar el uso común de solo preocuparse por el hecho de que se haga algo en el terminal, agregue un alias a su .bash_profile, por ejemplo

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

Entonces simplemente puedes hacerlo

$ <long-running task> ; notifyDone

Una vez que la tarea de larga duración termine, obtendrás una ventana emergente modal agradable que persiste hasta que hagas clic en ella:

    
respondido por el Tom Crockett 19.03.2013 - 01:41
20

Use Growl .

En el archivo .dmg , busque los extras, hay un binario growlnotify. Instálalo, algo así como en /usr/local/bin . Luego puedes usar este comando

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

para mostrar una ventana emergente, así:

    
respondido por el Loïc Wolff 02.03.2011 - 19:15
16

A partir de Mac OS X Lion 10.7, Terminal tiene algunos indicadores de estado nuevos para ayudar con problemas como este:

En pestañas:

  • Actividad: se muestra un indicador de actividad (indicador de progreso de giro) cuando ha habido una salida reciente al terminal. Esto le permite ver si está ocupado actualmente o si ha completado un proceso largo. (O, por supuesto, puede usarlo para saber cuándo ha comenzado a producir resultados después de realizar un trabajo en silencio durante un tiempo).

  • No leído: se muestran puntos suspensivos "..." para indicar el nuevo texto no leído en las pestañas de fondo. Cuando selecciona la pestaña, se borra el indicador.

  • Alerta: se muestra una "campana" para indicar cuando se ha escrito un BEL en las pestañas de fondo o en las ventanas de fondo. Además, Terminal muestra una insignia roja en el ícono de la aplicación, que indica el número de alertas / campanas "no leídas" en todos los terminales. Si la Terminal en sí misma está en segundo plano, también rebota en su icono de Dock cuando se toca una campana.

En la ventana minimizada Dock icons:

  • Actividad: la actividad se indica al mostrar el nombre del proceso en primer plano.

  • No leído: el texto no leído se indica con puntos suspensivos.

  • Las ventanas de terminal minimizadas muestran contenido en vivo en sus iconos de Dock. Esto se puede usar para ver si hay actividad, o incluso para determinar qué está haciendo el terminal, si la salida que está buscando es identificable (por ejemplo, una pantalla "superior" es bastante fácil de reconocer incluso en tamaños pequeños). Esto es especialmente útil cuando la ampliación del Dock está activada o si tiene espacio para un Dock grande.

Además, podría mostrar algo en el terminal para captar su atención (que sería visible incluso en ventanas minimizadas). Por ejemplo:

  • Muestra un asterisco grande: banner \*

  • Invertir la pantalla: printf '\e[?5h'

  • Pinte la pantalla en rojo: tput setab 1; tput clear

  • Siéntate en un bucle, parpadeando la pantalla: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

También hay códigos de escape para manipular ventanas (mover, configurar tamaño, ampliar, minimizar, etc.). Podría ampliar la ventana de la Terminal, por ejemplo:

printf '\e[9;1t'

Consulte "manipulación de ventanas" en enlace para obtener más información.

Otro enfoque es usar AppleScript para mostrar una alerta en una ventana separada:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'
    
respondido por el Chris Page 18.08.2011 - 05:13
11

Sé que llego tarde a la pregunta, pero creo que hay una pequeña pieza faltante que puede ser útil. Descubrí que, aunque está limpio, tener tu terminal de conversación contigo no es exactamente funcional. Lo que es mejor es algo más sutil como este:

ComoChrisseñaló,LionhaañadidopequeñasinsigniasdenotificacióncuandoselanzaunBEL.Puedeslanzarlotúmismoconelcomando:

tputbel

Entonces,siestáshaciendountrabajoensegundoplanoyquieresunanotificacióncuandotermine,puedesintentaralgocomo:

ping-c5www.google.com&&tputbel&

Estoejecutaelcomandopingcomounatareaensegundoplano(elcolgaryrealizaesto)yhacequeemitaunaalertasimplecuandotermina.Históricamente,sehausadoBELparahacerqueelhorriblesonidodelhardware,sinembargo,Lionlohareemplazadoconbuengustoconelefectodesonido"comando no válido", una placa de notificación y el icono del terminal rebotando dos veces en el muelle.

    
respondido por el Austin Lucas 17.07.2012 - 08:19
4

También puede usar el comando build in say para la notificación, por ejemplo, decir "ant: build: done". Ver: hombre decir en la terminal.

    
respondido por el mst 02.03.2011 - 21:12
4

Presento en esta respuesta dos cosas:

  • La opción de usar afplay , que reproduce archivos de sonido , para la notificación.
  • mis herramientas para informar el estado de salida junto con la notificación.

Tengo este 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

Esto reproduce un sonido diferente dependiendo de si el argumento es 0. Entonces tengo un alias:

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

(Que tengan el mismo nombre es irrelevante y probablemente sea una mala idea).

Para usarlo en tu ejemplo, svn update . && ant clean build start; donebeep . Tenga en cuenta que estoy usando ; en lugar de && , para que pueda notificarme en caso de fallo y éxito.

Antes de Aprendí sobre afplay , usé say para hablar mensajes. La función de donebeep fue desempeñada por este script:

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

Este script habla el código de salida directamente en lugar de tener dos mensajes diferentes. También menciona el nombre del directorio actual (para ayudar a aclarar qué tarea se realiza), y se le puede dar un texto adicional para decir al pasar los parámetros al alias (por eso el alias tiene "$@" ). Tenga en cuenta el & final para que no tenga que esperar a que finalice el discurso antes de recibir un aviso.

La página de manual para afplay está incompleto; afplay -h lista todas las opciones:

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
    
respondido por el Kevin Reid 19.08.2011 - 01:41
3

Creo una herramienta simple que hace exactamente esto. enlace

Instalación

Node.js debe instalarse: enlace

$ npm install -g brb

Instrucciones

$ sleep 3; brb
    
respondido por el Viktor Fröberg 08.06.2014 - 12:40
1

Escribí ntfy para exactamente este propósito. Es multiplataforma y puede automáticamente enviar notificaciones cuando finalicen los comandos de ejecución prolongada.

Si tiene pip de Python (la mayoría de las distribuciones de Linux y MacOS lo tienen), aquí se explica cómo instalarlo y habilitar las notificaciones automáticas:

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

Compruébelo en enlace

Además de eso, también puede:

  • suprime las notificaciones automáticas cuando el terminal está en primer plano (X11, iTerm2 & Terminal.app admitido y habilitado de forma predeterminada)
  • enviar notificaciones basadas en la nube (Pushover, Pushbullet y XMPP)
  • se utilizará para enviar notificaciones cuando finalice un proceso (no el soporte automático mencionado anteriormente)
  • enviar notificaciones manualmente (¡es bueno para usar en scripts!)
respondido por el Daniel Schep 19.05.2016 - 17:46
0

Ubuntu envía el siguiente alias en ~ / .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 esto, puedes hacer cosas como:

make; alert
sleep 10; alert

¿Quizás hay un equivalente a notify-send en Mac OSX? He visto ventanas emergentes similares tanto en Mac como en Ubuntu.

    
respondido por el Dustin Kirkland 17.02.2012 - 07:32
0

Mi problema con los sonidos y las ventanas modales es que no puedo decir de dónde vienen. Actualmente trabajo con un montón de espacios y, a veces, más de 20 ventanas de terminal.

Mi solución es portátil al lado de Unix, y debería funcionar con cualquier cosa que admita secuencias de escape ansi. Esta solución funciona con Snow Leopard, y probablemente funcionará con versiones más antiguas de la terminal.

Línea única en .bash_profile

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

Rompiendo eso:

$* 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.

Si no te gusta el rojo, el color de fondo de los códigos de escape de Google Ascii. Tenga en cuenta que esto no cambia el rojo de la pantalla completa, sino que se muestra cualquier resultado después de que el comando haya finalizado.

    
respondido por el Sherwood Botsford 23.03.2013 - 08:19
0

Hice un script para resolver esto, que está aquí . No necesitas ningún software adicional para esto. Instalación:
brew install akashaggarwal7/tools/tsay
Uso:
sleep 5; tsay

¡Siéntete libre de contribuir!

    
respondido por el Akash Agarwal 15.10.2016 - 17:03
0

Aquí está mi función de bash (solo colócala en cualquier lugar de tu ~/.bashrc o ~/.zshrc :

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

Para usarlo: watch echo 'hi there'

También puede personalizar el sonido de notificación como se documenta aquí: enlace

    
respondido por el randomor 06.08.2017 - 06:30

Lea otras preguntas en las etiquetas