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
.
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é:
le script ne s'exécute pas:
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()
show_proc.py
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
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
nocolor.png
<- ceci est une icône transparente, mais est là :). déplacez le curseur dessus jusqu'à ce que le doigt apparaisse ...
Maintenant, testez show_proc.py
avec la commande:
python3 /path/to/show_proc.py
et lancez votre script
Si tout fonctionne bien, ajoutez ce qui suit aux applications sgtartup:
/bin/bash -c "sleep 15 && python3 /path/to/show_proc.py"
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.