Comment puis-je déclencher une notification lorsqu'un travail / processus se termine?


86

Le lieu où je travaille a des commandes qui prennent beaucoup de temps à exécuter.

Existe-t-il une commande / un utilitaire que je peux utiliser pour me prévenir lorsque l'exécution de la commande est terminée? Ce pourrait être une fenêtre popup ou peut-être un peu de son.


1
La réponse acceptée de @ slhck est cool - j'aurais dû me rendre compte que fg;say "Job finished"cela fonctionnerait. Mais ... y a-t-il moyen de l'automatiser davantage - c.-à-d. Sonner ou avertir après l'achèvement de tout travail nécessitant plus d'un seuil à la minute près? Existe-t-il une variable shell, par exemple dans bash, le temps écoulé de la dernière commande?
Krazy Glew

... 2 heures plus tard, stackoverflow.com/questions/1862510/… ... put '(($ timer_show> $ {LONG_RUNTIME: -300})) && dit "travail long terminé" dans timer_stop ... Ensuite, ajoutez aux commandes de compilation d'Emacs ... et notifiez ma montre Pebble (je déteste les notifications téléphoniques)
Krazy Glew

Réponses:


119

Généralement, si vous le savez avant d' exécuter la commande, vous pouvez simplement le démarrer avec:

command; command-after &

Ceci exécutera la commande une command-after fois la commande précédente terminée (quel que soit son code de sortie). Le &va le démarrer en arrière-plan.

Si vous vous souciez d'une sortie réussie ou échouée, utilisez respectivement:

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

Si la commande a déjà été lancée, vous pouvez utiliser le contrôle du travail pour le suspendre, puis retournez-le au premier plan en le fgchaînant avec votre notification:

command
# enter Ctrl-z
fg ; command-after

Maintenant… ce que vous voulez faire après cela dépend de votre environnement.

  • Sur n'importe quel système , vous pouvez "faire sonner" la sonnerie du terminal . Dépend de votre système exact ce qui fonctionne vraiment (BSD vs. GNU Linux, etc.), mais tput beldevrait le faire. Cependant, je ne pouvais pas le tester de manière fiable maintenant. Recherchez "sonnerie" pour en savoir plus.

  • Sur Mac OS X , vous pouvez utiliser AppleScript pour faire apparaître une boîte de dialogue du Finder:

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

    Vous pourriez le faire dire quelque chose à vous:

    say "Job finished"
    

    Ou vous pouvez utiliser le système de notification de Mountain Lion:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • Dans GNOME , vous zenitypouvez afficher une boîte de dialogue GTK, appelée à partir de la ligne de commande. Voir aussi cette question de débordement de pile: affichage d'une boîte de message à partir d'un script bash sous linux . Il peut être installé via votre gestionnaire de paquets préféré.

    zenity --info --text="Job finished"
    
  • Certaines distributions pourraient avoir xmessage. Il existe spécifiquement pour les environnements GTK gxmessage.

  • Sur les environnements de bureau qui implémentent la spécification de notifications de postes de travail , tels que Ubuntu et GNOME , il existe un système de notification avec lequel vous pouvez déclencher notify-send(en partie libnotify).

    notify-send "Job finished!"
    
  • KDE utilise kdialogpar exemple:

    kdialog --passivepopup 'Job finished'
    

Faites-moi savoir quelle commande vous avez utilisé! J'ai ajouté d'autres options aussi.
Slhck

Je bricole avec notify-send et xmessage. Les deux semblent être intéressants! Voici la prochaine chose que je cherche - superuser.com/questions/345463/…
Utkarsh Sinha

2
sous Mac OS X, vous pouvez également utiliser l'utilitaire de ligne de commande "say". il y a aussi beaucoup de voix disponibles, cochez "say -h";)
trinth

1
Pourquoi suggérez-vous que "commande-après" devrait être exécuté de manière asynchrone? Vouliez-vous dire (command; command-after) &?
G-Man

Cette solution est destinée aux utilisateurs de Konsole et n’est pas une solution parfaite, car elle repose sur le fait que votre commande soit commentée jusqu’à son achèvement, ou totalement silencieuse (aucune sortie) jusqu’à ce que l’invite soit terminée. Cependant, c’est exactement ce dont j’avais besoin pour venir chercher de l’aide. Vous pouvez configurer Konsole pour afficher une notification, émettre un son, etc. Vous devez ensuite activer la surveillance du shell. Surveillez le silence si votre commande génère une quantité de choses jusqu'à son achèvement, ou la silence si elle n'imprime rien, puis le shell retourne.
MrMas

20

Sur les systèmes de type Unix, vous pouvez faire sonner le son:

echo -e "\a"

C'est vraiment utile en plus d'une notification de message sur mac
Sirens

2
pareil quetput bel
Dwight Spencer le


5

Pour obtenir une notification sonore, vous pouvez utiliser spd-say "Some text". Exemple:

some-command; spd-say "Yo"

Quel OS? Je ne le vois pas sur Mac ni sur Ubuntu
Edward Falk

@EdwardFalk J'utilise Ubuntu
milkovsky

OK, j'utilise une version assez ancienne, alors peut-être que c'est dans les nouvelles versions.
Edward Falk

1
C'est juste une application de synthèse vocale. Vous pouvez l'installer via sudo apt-get install speech-dispatcher. Ou utilisez des alternatives askubuntu.com/questions/501910/…
milkovsky

Ahh, pas installé par défaut? J'aurais dû y penser. Merci pour le lien.
Edward Falk

4

Je viens de commencer à utiliser notifu pour les notifications de bureau de Cygwin. C'est une application de notification en ligne de commande pour Windows.

Exemple:

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

4

J'ai écrit ntfyexactement dans ce but. Il est multi-plateforme et peut envoyer automatiquement 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!)

Bien sur vous. C'est vraiment la réponse la plus utilisable.
Adam Bittlingmayer

Je suis d'accord. Je l'utilise pour afficher une notification sur mon bureau et la transmettre simultanément à mon téléphone.
Michael

3

Pour Linux, il existe un truc astucieux pour le faire automatiquement sans avoir à taper une commande de notification à chaque fois.

Installez d'abord Autokey. Cela aide à définir des actions pour différentes frappes.

sudo apt-get install autokey-gtk

Définissez maintenant une nouvelle phrase dans Autokey et affectez le raccourci clavier à Alt + Entrée. Ajouter cette phrase:

; notify-send "Job finished!" &
  #

Notez qu'une nouvelle ligne après la première ligne est importante.

Ajoutez également un filtre de fenêtre. J'utilise guake et terminal. Incluez tout autre terminal que vous utilisez.

.*(guake)|(Terminal).*

Vous avez terminé!!

Maintenant, chaque fois que vous avez besoin de recevoir des notifications pour une commande, exécutez-la en utilisant Alt + Entrée au lieu de Entrée / Retour.

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


3

Bien que d’autres réponses aient déjà couvert la plupart des moyens d’obtenir des notifications sur un travail terminé, je tiens à vous donner deux centimes puisque vous avez posé votre question dans le format suivant:

Le lieu où je travaille a des commandes qui prennent beaucoup de temps à exécuter.

J'ai le même problème. Parfois, quelque chose peut durer 15 minutes.

J'ai la fonction suivante dans mon .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
}

Cela utilise l'application Pushover afin de transmettre une notification à mon téléphone. De cette façon, je peux aller déjeuner ou participer à une réunion tout en étant averti des tâches que j'ai commencées sur mon ordinateur avant de partir.

Je l'utilise de la manière suivante:

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

Donc, si la commande retourne un code de sortie correct, le premier push sera exécuté. En cas d'erreur, le second sera exécuté.

Ofc vous devez créer un utilisateur sur Pushover, et enregistrer une application pour envoyer des notifications à partir de https://pushover.net/

espérons que cela a aidé!


OK, donc "Pushover" est un service Web qui envoie des notifications aux téléphones sur lesquels l'application "Pushover" est installée?
Edward Falk

1
c'est un service Web qui envoie des notifications aux téléphones, aux ordinateurs et à tout avec un navigateur Web moderne . Ainsi, vous pouvez avoir le pushover ouvert sur votre PC et votre téléphone et être averti sur tous les appareils. chouette, hein? :-)
Thatkookooguy le

1

Si vous utilisez csh ou tcsh comme shell interactif, vous pouvez utiliser la notifycommande suivante:

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

Vous pouvez obtenir un effet similaire en bash avec set -bou set -o notify.

Cela ne répond probablement pas à vos exigences, car tout ce qu’il fait est d’imprimer un message; Je ne pense pas qu'il peut être configuré pour ouvrir une fenêtre ou sonner la cloche.


J'essaie d'éviter de regarder la coquille pour savoir si un travail est fini. Merci quand même!
Utkarsh Sinha


1

Si vous utilisez npmalors node-notifier, fournissez une solution multiplate-forme .

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

Aperçu

  • Linux KDE

Linux KDE

  • les fenêtres

les fenêtres

  • Mac OS

Mac

  • Grognement

Grognement


1

Si seulement j'avais remarqué ce fil il y a des années. Ma solution était essentiellement la même que celle de Slhck, mais j'ai écrit un script. Je l'utilise tout le temps. Poster ici pour le partager.

#!/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

Une petite explication: la chaîne "\x1b]0;$msg\a"est la séquence d'échappement ANSI pour placer le message dans la barre de titre de la fenêtre à partir de laquelle il a été exécuté. Je trouve assez pratique parfois de pouvoir voir de quelle fenêtre provient le message.


1

Cela arrive donc assez tard, mais j'ai commencé à utiliser un système pour le faire: j'ai un script bash qui exécute n'importe quelle commande qui lui est transmise par la suite.

http://somesh.io/2017/02/19/get-notified-when-long-commands-are-done-executing-on-ubuntu/

#!/bin/bash


# file location : /usr/bin/n

set +e


# $@ executes whatever command is typed after the filename

$@


notify-send "Task Completed"

et puis je commence simplement par n

n bundle install
n npm install


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.