66 votes

Notification sur le bureau lorsque les commandes en cours d'exécution sont terminées

J'aimerais avoir une notification sur le bureau chaque fois qu'une commande qui a été exécutée pendant plus de, disons 15 secondes, se termine dans un Shell interactif.

En d'autres termes, j'aimerais que toutes les commandes soient enveloppées dans quelque chose comme ceci

start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"

Quelle est la meilleure façon d'accomplir cela en bash ?

4voto

Daniel Schep Points 41

J'ai récemment construit un outil qui sert à cet effet. Il peut être exécuté soit comme un wrapper, soit automatiquement avec l'intégration de Shell. Jetez-y un coup d'œil ici : http://ntfy.rtfd.io

Pour l'installer :

sudo pip install ntfy

Pour l'utiliser comme une enveloppe :

ntfy done sleep 3

Pour recevoir des notifications automatiquement, ajoutez ceci à votre .bashrc o .zshrc :

eval "$(ntfy shell-integration)"

1voto

Wilf Points 28034

Votre script fonctionne très bien, assurez-vous simplement d'inclure la balise "shebang ( #!/bin/bash ) ligne. D'autres à #!/bin/bash sont mentionnés ici mais la plupart du temps, #!/bin/bash fonctionne bien pour les scripts bash d'Unix. Il est requis par l'interpréteur scripts pour qu'il sache de quel type de scripts il s'agit.

Cela semble fonctionner comme un test script :

#!/bin/bash
start=$(date +%s);
   echo Started
   sleep 20;
   echo Finished!
[ $(($(date +%s) - start)) -le 15 ] || notify-send -i dialog-warning-symbolic "Header" "Message"

Pour modifier ce script, placez la (les) commande(s) à l'endroit où l'option echo y sleep Les lignes sont.

Note avec notify-send vous pouvez utiliser -i pour spécifier une icône également :-)

Vérifiez également qu'il est exécutable en exécutant chmod +x /PATH/TO/FILE sur elle d'abord.

1voto

Jason Weathered Points 5346

Vous pouvez modifier Bash pour mettre en œuvre la fonctionnalité de wrapper que vous souhaitez.

Si vous êtes enclin à faire de nombreuses modifications de ce type à votre Shell interactif, vous pourriez envisager de passer à un Shell intrinsèquement piratable comme eshell, qui est construit à l'aide d'Emacs elisp et possède toute sa personnalisation légendaire :

http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/

-2voto

Rumesh Points 1359

Vous pouvez également le faire avec une simple instruction if comme celle-ci

#!/bin/bash

START=$(date +%s)

TIME=$(($START+15))

ORIGINAL_COMMAND;

END=$(date +%s)

if [ $END -gt $TIME ]
then
    notify-send "Task Completed"
fi

Vous pouvez utiliser vos propres noms de variables.

Je peux confirmer que cela fonctionne, j'ai testé avec une commande qui prend beaucoup de temps pour se terminer et une autre qui n'en prend pas, et la notification arrive pour celle qui prend beaucoup de temps.

Vous pouvez également le faire avec n'importe quelle commande en remplaçant ORIGINAL_COMMAND con $@ et en exécutant le script en tant que ./script command .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X