如果(以及当)某个进程正在运行时,我如何在面板中显示图标?

如果(以及当)某个进程正在运行时,我如何在面板中显示图标?

我有一个在后台运行的脚本。我希望(仅当脚本运行时)在面板中显示一个图标;如果脚本未运行,则不应显示该图标,就像 Dropbox 图标一样。

我该如何实现这一点?我已经安装了Xubuntu 14.04

答案1

如果进程正在运行,如何在面板中显示图标

基于(并解释于)这个答案,我们可以相当容易地创建一个指示器,它可以在XubuntuUnity 或任何其他版本上运行,以显示进程、脚本或应用程序是否运行。

脚本运行:

在此处输入图片描述

脚本无法运行:

在此处输入图片描述

在下面的脚本(指标)中,我添加了一个线程来检测该进程到指标中:

#!/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()

如何使用

  1. 将以下脚本复制到一个空文件中,并将其另存为show_proc.py
  2. 在脚本的头部部分,有以下行:

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

    设置脚本或应用程序的路径

  3. 复制以下两个图标(右键单击 -> 另存为),然后保存与 位于同一目录中show_proc.py,且名称与以下所示完全相同

    green.png

    在此处输入图片描述

    nocolor.png

    在此处输入图片描述<-- 这是一个透明的图标,但它就在那里:)。将光标移到它上面,直到出现手指......

  4. show_proc.py现在通过命令进行测试运行:

    python3 /path/to/show_proc.py
    

    并启动你的脚本

  5. 如果一切正常,请将以下内容添加到 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,所以我无法确认具体哪一个。希望一切顺利。

相关内容