Cómo recibir una notificación cuando mis comandos hayan terminado

55

Estoy ejecutando una serie de comandos en la línea de comandos que demora 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 forma de hacer esto?

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

Editar :

Podría usar xclock Pero esto parece un hack. Lo ideal sería enviar la notificación a cualquier lugar, como mi teléfono, pantalla, etc.

Amir Afghani
fuente
2
Aunque estás en la línea de comandos, creo que la respuesta aquí es en realidad específica de Mac y no relacionada con Unix / Linux. Eso es porque creo que probablemente quieras usar Growl y grownlnotify.
Eso no es un comando incorporado, al menos en mi caja.
crecer.es Growl es el programa al que se refiere @mattdm.
jsbillings

Respuestas:

55

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

Eugene Bujak
fuente
Este es un maravilloso ejemplo del uso de operadores de shell. && para encadenar varios comandos y envolverlo con un colectivo || o declaración para levantar un error. +1 de hecho
bmike
1
¡Bonito! Sin embargo, para poder hacerlo rápidamente, renuncio a la información de error frente a éxito y agregué un alias global a mi zsh: alias -g sd='; say done'. Esto significa que solo tengo que añadir sd a cualquier orden, y me avisará.
wrtsprt
Buena esa. y ahora tengo algo para jugar
Marco Prins
Intentado y hecho y error siempre se dice :( Ejemplo: (echo alik && echo Orly && say done) || say error
AlikElzin-kilaka
1
Muy útil. He estado haciendo eco con say -v Zarvox lo que hace saltar a todos en la vecindad, esta es una notificación algo menos alarmante.
Siddhartha
46

En Mac OS 10.8 puede enviarse mensajes del Centro de notificaciones (similar a Growl pero integrado en Mac OS). Revisa esta página para ver cómo instalar una gema de Ruby que le permitirá enviar notificaciones desde la línea de comandos. Para simplificar la base de datos 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 hacer

$ <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:

Notification Center popup

Tom Crockett
fuente
9
notificador de terminal se puede instalar a través de Homebrew , también: brew install terminal-notifier. Entonces puedes escribir myCommand && terminal-notifier -message 'finished'. Probado en OS X Yosemite (10.10.1).
Pwdr
3
Deberías correr myCommand; terminal-notifier -message 'finished' de lo contrario, la notificación no se mostrará si myCommand falla
aheuermann
Solución impresionante! Por cierto, esto no produce ningún sonido como otras notificaciones de OS X. ¿Alguna solución para eso?
SexyBeast
@Cupidvogel puedes agregar un say comando, por ejemplo my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett
1
Varias respuestas a esta pregunta dan muchos más detalles: apple.stackexchange.com/questions/57412/…
Joshua Goldberg
20

Utilizar Gruñido .

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

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

para mostrar una ventana emergente, así:

growl

Loïc Wolff
fuente
2
Utilizo casi este enfoque exacto pero extiendo Growl con Merodear para que Growl pueda enviar la notificación a mi iPhone.
Ian C.
3
El Centro de notificaciones de los leones de montaña hace que Growl sea innecesario ... ver mi respuesta para saber cómo usarlo para esto.
Tom Crockett
16

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

En las pestañas:

  • Actividad: se muestra un indicador de actividad (indicador de progreso de giro) cuando se ha producido 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 texto nuevo no leído en las pestañas de fondo. Cuando selecciona la pestaña, el indicador se borra.

  • Alerta: se muestra una "campana" para indicar cuándo 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 el Terminal en sí está en el fondo, también rebota su icono de Dock cuando se toca una campana.

En la ventana minimizada los iconos del Dock:

  • Actividad: la actividad se indica mostrando el nombre del proceso de 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 gran asterisco: banner \*

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

  • Pintar la pantalla de color 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 hacer zoom en la ventana del terminal, por ejemplo:

printf '\e[9;1t'

Ver "manipulación de la ventana" en http://invisible-island.net/xterm/ctlseqs/ctlseqs.html para detalles.

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."'
Chris Page
fuente
Excelente uso del tput y las secuencias de escape: ¡tienes todo excepto un mensaje de desplazamiento en la barra de título!
bmike
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:

http://i.stack.imgur.com/FaZmF.png

Como Chris señaló, Lion ha agregado pequeñas insignias de notificación cuando se lanza un BEL. Puedes lanzarlo tú mismo con el comando:

tput bel

Por lo tanto, si está realizando un trabajo en segundo plano y desea una notificación cuando finalice, puede intentar algo como:

ping -c 5 www.google.com && tput bel &

Esto ejecuta el comando ping como una tarea en segundo plano (el colgar y realiza esto) y hace que emita una alerta simple cuando termina. Históricamente, se ha usado BEL para hacer que el [horrible] pitido del hardware, sin embargo, Lion lo ha reemplazado con buen gusto con el efecto de sonido "comando no válido", una placa de notificación y el icono del terminal rebotando dos veces en el dock.

Austin Lucas
fuente
1
printf '\a' sería equivalente a tput bel. Tenga en cuenta que la Terminal no hace rebotar el icono del Dock si la pestaña que causó la alerta está actualmente activa.
Lri
4

También puede usar el comando compilar en decir para la notificación, por ejemplo, decir "ant: construir: hecho". Ver: el hombre dice en la terminal.

mst
fuente
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 Estado de salida de informe junto con la notificación.

Tengo este guion, ~/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 ; más bien que &&, para que pueda notificarme sobre el fracaso y el éxito.

antes de aprendí sobre afplay, Solía say para hablar mensajes en su lugar. El rol de donebeep fue jugado 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 (es por eso que el alias tiene "$@" en eso). Note el final & para que no tenga que esperar a que finalice el discurso antes de recibir un aviso.


los página de manual para afplay esta incompleto afplay -h Enumera 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
Kevin Reid
fuente
1

escribí ntfy para exactamente este propósito Es multiplataforma y puede automáticamente enviar notificaciones cuando los comandos de larga duración terminen.

Si tienes Python pip (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

Échale un vistazo a http://ntfy.rtfd.io

Además de eso, también puede:

  • Suprimir notificaciones automáticas cuando el terminal está en primer plano (X11, iTerm2 & amp; Terminal.app admitido y habilitado de forma predeterminada)
  • enviar notificaciones basadas en la nube (Pushover, Pushbullet y XMPP)
  • ser utilizado para enviar notificaciones cuando finaliza un proceso (no el soporte automático mencionado anteriormente)
  • enviar notificaciones manualmente (bueno para usar en scripts!)
Daniel Schep
fuente
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, entonces 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.

Dustin Kirkland
fuente
Estás en el sitio de Apple. Para que esto sea una respuesta, por favor explica cómo obtener notify-send en Mac OS X.
Daniel Beck
4
Estoy de acuerdo en que esto es algo inapropiado, pero en realidad lo encontré útil. Llegué a esta pregunta de Google, y mi pregunta original no era específica de Mac. Al igual que el póster original, quiero una forma de no tener que monitorear mi terminal cuando se ejecuta un comando que lleva mucho tiempo; Simplemente estoy usando Ubuntu: /
allyourcode
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 las secuencias de escape ANSI. Esta solución funciona con Snow Leopard, y probablemente funcionará con versiones más antiguas de la terminal.

Una sola línea en .bash_profile

function watch { $* ; echo -n -e "\033[41m" ;  echo $* DONE ;  date ;  echo -n -e "\033[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, google ascii escape códigos de color de fondo. Tenga en cuenta que esto no cambia toda la pantalla de color rojo, sino que simplemente se muestra algo después de que el comando haya finalizado.

Sherwood Botsford
fuente
0

Hice un script para resolver esto que es 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!

Akash Agarwal
fuente
¿Motivo de downvote?
Akash Agarwal
0

Aquí está mi función de bash (solo póngala en cualquier parte de su ~/.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í: https://apple.stackexchange.com/a/115373/9622

randomor
fuente