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 ?

34voto

sourav c. Points 40637

D'après ce que j'ai compris, vous voulez un emballage . Et vous voulez utiliser une commande à travers elle afin qu'elle vous donne la notification souhaitée si le temps d'exécution de votre commande est supérieur à 15 secondes. Voici donc ce qu'il faut faire.

wrapper(){
    start=$(date +%s)
    "$@"
    [ $(($(date +%s) - start)) -le 15 ] || notify-send "Notification" "Long\
 running command \"$(echo $@)\" took $(($(date +%s) - start)) seconds to finish"
}

Copiez cette fonction dans votre ~/.bashrc et la source ~/.bashrc comme,

. ~/.bashrc

Utilisation

wrapper <your_command>

Si cela prend plus de 15 secondes, vous recevrez une notification sur votre bureau décrivant la commande et son temps d'exécution.

Ejemplo

wrapper sudo apt-get update

screenshot of desktop-nitification

32voto

precise Points 14840

Unter ~/.bashrc il existe un alias alert défini comme suit :

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$//'\'')"'

qui peut être utilisé pour notifier la fin de l'exécution d'une commande.

使用方法

$ the_command; alert

par exemple

$ sudo apt-get update; alert

snap1

Vous pouvez personnaliser l'alias en fonction de vos besoins et de vos envies.

28voto

titanae Points 1481

Vous voulez https://launchpad.net/undistract-me (installable à partir des archives Ubuntu avec sudo apt-get install undistract-me ) qui fait précisément ce que vous demandez, y compris travailler automatiquement (c'est-à-dire sans avoir à se souvenir d'ajouter quelque chose de supplémentaire à des commandes potentiellement longues).

13voto

Steve Karg Points 11

En dehors d'un wrapper comme celui suggéré par souravc, il n'y a pas vraiment de bon moyen de faire cela en bash. Vous pouvez le contourner avec un piège DEBUG et un PROMPT_COMMAND. Un DEBUG trap est déclenché à chaque fois que vous exécutez une commande, et PROMPT_COMMAND est exécuté juste avant que le prompt soit écrit.

Donc des trucs pour ~/.bashrc devient quelque chose comme

trap '_start=$SECONDS' DEBUG
PROMPT_COMMAND='(if (( SECONDS - _start > 15 )); then notify-send "Long running command ended"; fi)'

Il s'agit d'un hack, ne soyez donc pas surpris si vous rencontrez des effets secondaires bizarres.

5voto

Sergiy Kolodyazhnyy Points 97292

EDITAR

TL;DR : créer un raccourci d'autocomplétion dans .inputrc et la fonction dans .bashrc . Exécutez la commande comme d'habitude, tapez dans, mais au lieu de ENTER appuyez sur le raccourci que vous avez spécifié dans .inputrc

La personne qui a mis la prime sur cette question a dit :

"Toutes les réponses existantes nécessitent de taper une commande supplémentaire après la commande. Je veux une réponse qui le fasse automatiquement."

En cherchant des solutions à ce problème, je suis tombé sur ce question de stackexchange, qui permet de lier CtrlJ à une séquence de commandes : Ctrla (déplacement au début de la ligne), placez la chaîne "mesure" devant la commande que vous avez entrée, Ctrlm (exécuter)

Ainsi, vous obtenez la fonctionnalité de l'auto-complétion et la séparation de la fonction ENTER pour mesurer le temps, tout en préservant l'objectif initial de la deuxième fonction que j'ai postée ci-dessous.

A partir de maintenant, voici le contenu de mon ~/.inputrc fichier :

"\C-j": "\C-a measure \C-m"

Et voici le contenu de .bashrc (note , je n'ai pas utilisé bash depuis une éternité - j'utilise mksh comme mon Shell , donc c'est ce que vous voyez dans le post original. La fonctionnalité est toujours la même)

PS1=' serg@ubuntu [$(pwd)]
================================
$ '
function measure () 
{

/usr/bin/time --output="/home/xieerqi/.timefile" -f "%e" $@ 

if [ $( cat ~/.timefile| cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi

}

Poste original

Voici mon idée : utiliser une fonction dans le fichier .bashrc . Principe de base - utiliser /usr/bin/time pour mesurer le temps nécessaire à l'exécution de la commande, et si ce temps est supérieur à 15 secondes, envoyer une notification.

function measure () 
{

if [ $( /usr/bin/time -f "%e" $@ 2>&1 >/dev/null ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi

}

Ici, je redirige la sortie vers /dev/null mais pour visualiser la sortie, la redirection vers un fichier peut aussi être faite.

Une bien meilleure approche, à mon avis, est d'envoyer la sortie du temps dans un fichier quelconque de votre dossier personnel (pour ne pas polluer votre système avec des fichiers de temps, et pour savoir toujours où chercher). Voici cette deuxième version

function measure () 
{

/usr/bin/time --output=~/.timefile -f "%e" $@ 

if [ $( cat ~/.timefile | cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi

}

Et voici les captures d'écran de la première et de la deuxième version, dans cet ordre

Première version, pas de sortie enter image description here

Deuxième version, avec sortie enter image description here

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