我有一个在后台运行的脚本。我希望(仅当脚本运行时)在面板中显示一个图标;如果脚本未运行,则不应显示该图标,就像 Dropbox 图标一样。
我该如何实现这一点?我已经安装了Xubuntu 14.04
。
答案1
如果进程正在运行,如何在面板中显示图标
基于(并解释于)这个答案,我们可以相当容易地创建一个指示器,它可以在Xubuntu
Unity 或任何其他版本上运行,以显示进程、脚本或应用程序是否运行。
脚本运行:
脚本无法运行:
在下面的脚本(指标)中,我添加了一个线程来检测该进程到指标中:
#!/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
在脚本的头部部分,有以下行:
# --- set the path to the script below script = "/path/to/script.sh" #---
设置脚本或应用程序的路径
复制以下两个图标(右键单击 -> 另存为),然后保存与 位于同一目录中
show_proc.py
,且名称与以下所示完全相同green.png
nocolor.png
show_proc.py
现在通过命令进行测试运行:python3 /path/to/show_proc.py
并启动你的脚本
如果一切正常,请将以下内容添加到 sgtartup 应用程序中:
/bin/bash -c "sleep 15 && python3 /path/to/show_proc.py"
答案2
在 Xubuntu 中,通过将以下内容粘贴到终端来安装通用监视面板插件:
sudo apt-get install xfce4-genmon-plugin
来自通用监控插件页面:
“此插件循环生成指示的脚本/程序,捕获其输出(stdout)并将结果字符串显示到面板中。该字符串还可以包含标记以显示图像、栏、按钮和个性化工具提示。”
设置以下脚本以使用通用监视器面板插件运行。我建议不要使用标签。请务必将其替换your_script
为脚本的名称并添加到图标的路径中。
#!/bin/bash
status=$(pgrep your_script)
if [ -n "$status" ]; then
echo "<img>/path/to/your/icon.png</img>"
else
echo ""
fi
您提到 Dropbox 很有趣。我为 Dropbox 使用了这个插件。
还有Unity 面板插件显示命令或脚本输出。但是,我只有 Xfce,所以我无法确认具体哪一个。希望一切顺利。