web-dev-qa-db-fra.com

Comment puis-je afficher une icône dans le panneau si (et pendant) un certain processus est en cours d'exécution?

J'ai un script qui fonctionne en arrière-plan. Je voudrais montrer une icône dans le panneau (seulement) s'il fonctionne; il ne devrait pas montrer si le script n'est pas en cours d'exécution, tout comme l'icône Dropbox.

Comment puis-je atteindre cet objectif? J'ai installé Xubuntu 14.04.

3
joshsoj

Comment afficher une icône dans le panneau si un processus est exécuté

Basé sur (et expliqué dans) cette réponse , nous pouvons assez facilement créer un indicateur, qui fonctionne à la fois sur Xubuntu et sur Unity ou toute autre version, pour indiquer si un processus, un script ou une application s'exécute ou non.

le script est exécuté:

enter image description here

le script ne s'exécute pas:

enter image description here

Dans le script (indicateur) ci-dessous, j'ai ajouté un thread pour détecter le processus de l'indicateur:

#!/usr/bin/env python3
import subprocess
import os
import time
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
from threading import Thread

# --- set the path to the script below
script = "/path/to/script.sh"
#---

currpath = os.path.dirname(os.path.realpath(__file__))

def runs(script):
    # function to check if the process runs
    try:
        return subprocess.check_output(["pgrep", "-f", script]).decode("utf-8")
    except subprocess.CalledProcessError:
        pass

class Indicator():
    def __init__(self):
        self.app = 'show_proc'
        iconpath = currpath+"/nocolor.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())

        self.update = Thread(target=self.check_runs)
        # daemonize the thread to make the indicator stopable
        self.update.setDaemon(True)
        self.update.start()     

    def check_runs(self):
        # the function (thread), checking for the process to run
        runs1 = ""
        while True:
            time.sleep(1)
            runs2 = runs(script)
            # if there is a change in state, update the icon
            if runs1 != runs2:
                if runs2:
                    # set the icon to show
                    GObject.idle_add(
                        self.indicator.set_icon,
                        currpath+"/green.png",
                        priority=GObject.PRIORITY_DEFAULT
                        )
                else:
                    # set the icon to hide
                    GObject.idle_add(
                        self.indicator.set_icon,
                        currpath+"/nocolor.png",
                        priority=GObject.PRIORITY_DEFAULT
                        )
            runs1 = runs2


    def create_menu(self):
        menu = Gtk.Menu()
        # quit
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        menu.append(item_quit)
        menu.show_all()
        return menu

    def stop(self, source):
        Gtk.main_quit()

Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Comment utiliser

  1. Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom show_proc.py
  2. Dans la section head du script, dans la ligne:

    # --- set the path to the script below
    script = "/path/to/script.sh"
    #---
    

    définir le chemin d'accès à votre script ou vos applications

  3. Copiez les deux icônes ci-dessous (clic droit -> enregistrer sous) et sauvegardez-les dans un seul et même répertoire que show_proc.py, et portant exactement le nom indiqué ci-dessous

    green.png

    enter image description here

    nocolor.png

    enter image description here <- ceci est une icône transparente, mais est là :). déplacez le curseur dessus jusqu'à ce que le doigt apparaisse ...

  4. Maintenant, testez show_proc.py avec la commande:

    python3 /path/to/show_proc.py
    

    et lancez votre script

  5. Si tout fonctionne bien, ajoutez ce qui suit aux applications sgtartup:

    /bin/bash -c "sleep 15 && python3 /path/to/show_proc.py"
    
1
Jacob Vlijm

Sous Xubuntu, installez le plug-in du panneau Generic Monitor en collant les éléments suivants dans le terminal:

Sudo apt-get install xfce4-genmon-plugin

Depuis la page plug-in Generic Monitor :
"Ce plugin génère périodiquement le script/programme indiqué, en capture la sortie (stdout) et affiche la chaîne résultante dans le panneau. La chaîne peut également contenir des balises pour afficher une image, une barre, un bouton et une infobulle. "

Définissez le script suivant pour qu'il s'exécute à l'aide du plug-in du panneau Generic Monitor. Je recommande sans étiquette. Assurez-vous de remplacer your_script par le nom de votre script et d’ajouter le chemin de votre icône.

#!/bin/bash

status=$(pgrep your_script)

if [ -n "$status" ]; then
    echo "<img>/path/to/your/icon.png</img>"
else
    echo ""
fi

Il est intéressant que vous mentionniez Dropbox. J'utilise ce plugin pour Dropbox.

Il y a aussi plugins pour le panneau dans Unity qui affichent une sortie de commande ou de script. Cependant, je n'ai que Xfce, je ne peux donc pas en confirmer un en particulier. J'espère que tout se passe bien.

1
jbrock