Comment recevoir une notification lorsque mes commandes sont terminées

64

J'exécute une série de commandes sur la ligne de commande qui prend environ vingt minutes. J'aimerais voir une sorte de notification sur mon Mac une fois celle-ci terminée. Je n'ai donc pas besoin de surveiller le terminal une fois celui-ci terminé. Y a-t-il un moyen de faire cela?

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

Modifier :

Je pourrais utiliser xclockmais cela ressemble à un bidouillage. Idéalement, je pourrais envoyer la notification n'importe où, comme mon téléphone, mon écran, etc.

Amir Afghani
la source
2
Bien que vous soyez en ligne de commande, je pense que la réponse ici est en fait spécifique à Mac et non liée à Unix / Linux. C'est parce que je pense que vous voulez probablement utiliser Growl et grownlnotify.
Ce n'est pas une commande de construction, du moins sur ma boîte.
Growl.info Growl est le programme mentionné par @mattdm.
Jsbillings

Réponses:

58

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

Eugene Bujak
la source
1
C'est un exemple merveilleux d'utilisation d'opérateurs de shell &&pour chaîner plusieurs commandes et les encapsuler avec un collectif ||ou une instruction afin de générer une erreur. +1 en effet
bmike
2
Agréable! Pour être en mesure de le faire rapidement si, je renonce à l'erreur par rapport à l' information de succès et a ajouté un alias global à mon zsh: alias -g sd='; say done'. Cela signifie que je n'ai qu'à ajouter sdà n'importe quelle commande, et je serai averti.
wrtsprt
joli. et maintenant j'ai quelque chose à jouer avec
Marco Prins
Essayé et fait et l'erreur est toujours dite :( Exemple:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka
1
Très utile. Je fais écho avec say -v Zarvoxce qui fait sauter tout le monde dans les environs, ceci est une notification légèrement moins alarmante.
Siddhartha
52

Sous Mac OS 10.8, vous pouvez vous envoyer des messages au centre de notifications (similaire à Growl mais intégré à Mac OS).

Consultez « Envoyer une alerte au Centre de notifications à partir de la ligne de commande sous OS X » pour voir comment installer une gemme Ruby qui vous permettra d'envoyer des notifications à partir de la ligne de commande. Pour simplifier le cas d'utilisation courant consistant à se soucier du fait que quelque chose est fait dans le terminal, ajoutez un alias à votre fichier .bash_profile:

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

Ensuite, vous pouvez simplement faire:

$ <long-running task> ; notifyDone

Une fois la tâche longue terminée, vous obtiendrez une jolie fenêtre contextuelle modale qui persistera jusqu'à ce que vous cliquiez dessus:

Notification Center popup

Tom Crockett
la source
10
terminal notificateur peut être installé via homebrew aussi: brew install terminal-notifier. Ensuite, vous pouvez simplement écrire myCommand && terminal-notifier -message 'finished'. Testé sur OS X Yosemite (10.10.1).
Pwdr
4
Vous devez exécuter myCommand; terminal-notifier -message 'finished'sinon la notification ne sera pas affichée en cas d' myCommandéchec.
aheuermann
1
Solution géniale! À propos, cela ne produit aucun son comme les autres notifications OS X. Une solution pour ça?
SexyBeast
1
@Cupidvogel vous pouvez simplement ajouter une saycommande, par exemple my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett
2
Diverses réponses à cette question donnent beaucoup plus de détails: apple.stackexchange.com/questions/57412/…
Joshua Goldberg
20

Utilisez Growl .

Dans le .dmgfichier, recherchez les extras, il y a un binaire growlnotify. Installez-le, quelque chose comme dans /usr/local/bin. Ensuite, vous pouvez utiliser cette commande

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

pour afficher un popup, comme ça:

grognement

Loïc Wolff
la source
2
J'utilise presque cette approche mais j'étends Growl avec Prowl pour que Growl puisse envoyer la notification à mon iPhone.
Ian C.
3
Le centre de notification de Mountain Lion rend Growl inutile ... Voir ma réponse pour savoir comment l'utiliser.
Tom Crockett
16

Depuis Mac OS X Lion 10.7, Terminal dispose de nouveaux indicateurs d’état pour résoudre les problèmes suivants:

Dans les onglets:

  • Activité: un indicateur d'activité (indicateur de progression en rotation) est affiché lorsqu'il y a eu une sortie récente sur le terminal. Cela vous permet de voir s'il est actuellement occupé ou s'il a terminé un long processus. (Ou bien sûr, vous pouvez l'utiliser pour indiquer quand il a commencé à produire une sortie après avoir effectué un travail silencieux pendant un certain temps.)

  • Non lu: un point de suspension "…" est affiché pour indiquer un nouveau texte non lu dans les onglets d'arrière-plan. Lorsque vous sélectionnez l'onglet, l'indicateur est effacé.

  • Alerte: une "cloche" est affichée pour indiquer quand un BEL a été écrit dans des onglets ou des fenêtres en arrière-plan. En outre, le terminal affiche un badge rouge sur l'icône de l'application, indiquant le nombre d'alertes / sonneries "non lues" dans tous les terminaux. Si le terminal lui-même est à l’arrière-plan, il affiche également l’icône Dock lorsqu’une sonnerie est jouée.

Dans les icônes Dock de la fenêtre réduites:

  • Activité: l'activité est indiquée en affichant le nom du processus de premier plan.

  • Non lu: le texte non lu est indiqué par des points de suspension.

  • Les fenêtres de terminal réduites affichent le contenu en direct dans leurs icônes de Dock. Cela peut être utilisé pour voir s'il y a une activité, ou même pour déterminer ce que fait le terminal, si le résultat recherché est identifiable (par exemple, un affichage "supérieur" est assez facile à reconnaître, même pour les petites tailles). Ceci est particulièrement utile lorsque le grossissement du Dock est activé ou que vous avez de la place pour un grand Dock.

En outre, vous pouvez afficher quelque chose dans le terminal pour attirer votre attention (ce qui serait visible même dans les fenêtres réduites). Par exemple:

  • Afficher un grand astérisque: banner \*

  • Inverser l'affichage: printf '\e[?5h'

  • Peignez l'affichage en rouge: tput setab 1; tput clear

  • Asseyez-vous en boucle en faisant clignoter l'écran: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Il existe également des codes d'échappement pour manipuler les fenêtres (déplacement, définition de la taille, zoom, réduction, etc.). Vous pouvez agrandir la fenêtre du terminal, par exemple:

printf '\e[9;1t'

Voir "Manipulation de la fenêtre" sur http://invisible-island.net/xterm/ctlseqs/ctlseqs.html pour plus de détails.

Une autre approche consiste à utiliser AppleScript pour afficher une alerte dans une fenêtre séparée:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'
Chris Page
la source
Excellente utilisation de tput et des séquences d'échappement - vous avez tout ce dont vous avez besoin, à l'exception d'un message déroulant dans la barre de titre!
bmike
12

Je sais que je suis en retard par rapport à la question, mais je pense qu'il manque un petit élément qui pourrait être utile. J’ai trouvé que, même si c’est bien, avoir une conversation terminale avec vous n’est pas vraiment fonctionnel. Quoi de mieux est quelque chose de plus subtil comme celui-ci:

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

Comme Chris l'a fait remarquer, Lion a ajouté de petits badges de notification lorsqu'un BEL est lancé. Vous pouvez le lancer vous-même avec la commande:

tput bel

Donc, si vous travaillez en arrière-plan et souhaitez recevoir une notification à la fin, vous pouvez essayer quelque chose comme:

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

Cela exécute la commande ping en tant que tâche d’arrière-plan (le blocage et l’accomplissement de cette tâche) et lui permet de lancer une alerte simple à la fin. Historiquement, BEL a été utilisé pour émettre ce bip sonore [horrible]. Cependant, Lion l'a remplacé avec goût par l'effet sonore "commande non valide", un badge de notification et l'icône du terminal qui rebondit deux fois dans le dock.

Austin Lucas
la source
1
printf '\a'serait équivalent à tput bel. Notez que le terminal ne renvoie pas l'icône du Dock si l'onglet à l'origine de l'alerte est actuellement actif.
Lri
5

Je présente dans cette réponse deux choses:

  • La possibilité d'utiliser afplay, qui lit les fichiers sonores , pour la notification.
  • mes outils pour signaler le statut de sortie avec la notification.

J'ai ce 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

Cela joue un son différent selon que l'argument est 0 ou non. J'ai alors un alias:

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

(Qu'ils aient le même nom est sans importance et probablement une mauvaise idée.)

Pour l'utiliser dans votre exemple svn update . && ant clean build start; donebeep,. Notez que j'utilise ;plutôt que de &&sorte qu'il puisse m'avertir en cas d'échec ou de succès.

Avant d’ apprendreafplay , j’avais l'habitude sayde parler. Le rôle de a donebeepété joué par ce script:

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

Ce script prononce directement le code de sortie au lieu d’avoir deux messages différents. Il mentionne également le nom du répertoire en cours (pour aider à préciser quelle tâche est effectuée), et peut recevoir un texte supplémentaire à dire en transmettant des paramètres à l'alias (c'est pourquoi il contient l'alias "$@"). Notez la fin &afin d'éviter d'attendre la fin du discours avant de recevoir une invite.


La page de manuel pourafplay est incomplète; afplay -hliste toutes les options:

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
la source
4

Vous pouvez également utiliser la commande build in say pour la notification, par exemple: say "ant: build: done". Voir: l'homme dit dans le terminal.

mst
la source
1

J'ai écrit ntfyexactement dans ce but. Il est multi-plateforme et peut automatiquement envoyer des notifications lorsque les commandes longues sont terminées.

Si vous possédez Python pip(la plupart des distributions Linux et MacOS l’ont), voici comment l’installer et activer les notifications automatiques:

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

Découvrez-le à http://ntfy.rtfd.io

En plus de cela, il peut aussi:

  • supprime les notifications automatiques lorsque le terminal est au premier plan (X11, iTerm2 et Terminal.app sont pris en charge et activés par défaut)
  • envoyer des notifications en nuage (Pushover, Pushbullet et XMPP)
  • être utilisé pour envoyer des notifications à la fin d'un processus (et non de l'assistance automatique susmentionnée)
  • envoyer manuellement des notifications (bon pour une utilisation dans les scripts!)
Daniel Schep
la source
1

iTerm2 a un mécanisme intégré pour recevoir des notifications, mais vous devez installer l’ intégration Shell .

Lorsque vous lancez une commande longue, sélectionnez:
Edition> Marques et annotations> Alertes> Alerte sur la marque suivante ( ⌥Option+ ⌘Command+ A).

Lorsque l'invite de commande revient, vous pouvez choisir entre:

  • Afficher la boîte d'alerte modale
  • Post Notification (exemple de capture d'écran)

Arturo Herrero
la source
0

Ubuntu fournit l’alias suivant dans ~ / .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$//'\'')"'

Avec cela, vous pouvez ensuite faire des choses comme:

make; alert
sleep 10; alert

Peut-être y a-t-il un équivalent notify-senddans Mac OSX? J'ai vu des fenêtres popup similaires sous Mac et Ubuntu.

Dustin Kirkland
la source
Vous êtes sur le site Apple. Pour répondre à cette question, veuillez expliquer comment accéder notify-sendà Mac OS X.
Daniel Beck
4
Je conviens que c'est un peu inapproprié, mais j'ai en fait trouvé cela utile. Je suis venu à cette question de Google, et ma question initiale n'était pas spécifique à Mac. Comme l'affiche originale, je veux un moyen de ne pas avoir à surveiller mon terminal lors de l'exécution d'une commande qui prend beaucoup de temps; Je viens d’utiliser Ubuntu: /
allyourcode
0

Mon problème avec les sons et les fenêtres modales est que je ne peux pas dire d'où ils viennent. Je travaille actuellement avec un tas d'espaces, et parfois plus de 20 fenêtres de terminal.

Ma solution est portable vers le système Unix et devrait fonctionner avec tout ce qui supporte les séquences d'échappement Ansi. Cette solution fonctionne avec Snow Leopard et fonctionnera probablement avec des versions plus anciennes de Terminal.

Une seule ligne dans .bash_profile

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

Décomposer cela:

$* 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 vous n'aimez pas le rouge, la couleur d'arrière-plan des codes d'échappement Google Ascii. Notez que cela ne change pas tout l'écran en rouge, mais tout ce qui est produit après la fin de la commande.

Sherwood Botsford
la source
0

J'ai fait un script pour résoudre ce qui est ici . Vous n'avez besoin d'aucun logiciel supplémentaire pour cela. Installation:
brew install akashaggarwal7/tools/tsay
Utilisation:
sleep 5; tsay

N'hésitez pas à contribuer!

Akash Agarwal
la source
Raison du vote négatif?
Akash Agarwal
0

Voici ma fonction bash (il suffit de la mettre n'importe où dans votre ~/.bashrcou ~/.zshrc:

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

Pour l'utiliser: watch echo 'hi there'

Vous pouvez également personnaliser le son de notification comme indiqué ici: https://apple.stackexchange.com/a/115373/9622

randomor
la source
0

Je fais ce genre de chose tout le temps. Ma ligne de commande pourrait ressembler à

$ rm Gemfile.lock && bin/setup && bundle install --binstubs && say "All"; say "done"

Si les commandes bin/setupet se bundle installterminent correctement, j'entends la voix système / dictée dire "Tout est fait". Si l'une des deux premières erreurs sort, la &&chaîne ne sera pas suivie et tout ce que j'entendrai sera "Terminé".

Jeff Dickey
la source
0

Vous pouvez utiliser la osascriptcommande intégrée pour exécuter un script Apple qui affiche une notification, par exemple:

osascript -e 'display notification "Command done" with title "Your title here"'

Vous pouvez l'enchaîner avec un simple point-virgule, par exemple

your-command ; osascript -e '....'
jchook
la source