バックグラウンドで動作するスクリプトがあります。パネルが実行されている場合にのみ(のみ)パネルにアイコンを表示したいと思います。 Dropboxアイコンのように、スクリプトが実行されていない場合は表示されません。
どうすればこれを達成できますか? Xubuntu 14.04
をインストールしました。
この回答 に基づいて(および説明されている)、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"
Xubuntuで、ターミナルに次を貼り付けてGeneric Monitorパネルプラグインをインストールします。
Sudo apt-get install xfce4-genmon-plugin
Generic Monitorプラグイン ページから:
」このプラグインは、指定されたスクリプト/プログラムを周期的に生成し、その出力(stdout)をキャプチャし、結果の文字列をパネルに表示します。文字列には、画像、バー、ボタンツールチップ。」
Generic Monitorパネルプラグインを使用して実行するには、次のスクリプトを設定します。ラベルなしをお勧めします。必ず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に使用しています。
また、コマンドまたはスクリプトの出力を表示する nityのパネルのプラグイン もあります。ただし、Xfceがあるだけなので、特定のXfceを確認することはできません。すべてがうまくいくことを願っています。