スクリプトの実行中にのみアイコンを表示する方法はありますか?


10

私はスクリプト作成に非常に慣れていません。これが私が書いた単純なスクリプト(これは機能します)で、5分経過したときに画像を表示します。

sleep 300 && firefox file:///home/tasks/fiveminutes.jpg

これが私の質問です。タイマーを開始したかどうかを思い出せないことがあります。5分間(タイマーを開始してから終了するまで)表示されるテキストまたはアイコン表示(タスクバーにあるのが理想的ですが、どこにでもすばらしいでしょう)を追加する方法はありますか?

提案をありがとうございました。


1
Bashは、デスクトップ機能を処理するための最良の方法ではありません。あなたはzenityやyadを見ることができますが、スリープ機能ではそれほどうまく機能しません。Pythonの使用を検討する場合、それはGTK / wxシステムトレイアイコンを使用できる非常に単純なスクリプトになります。
ドリアン

zenityを使用したより複雑なbashソリューションについては、次のコードをご覧ください
Dorian

こんにちはドリアン-あなたの提案をどうもありがとう。Pythonを使用してよろしいですか、GTK / wxシステムトレイアイコンの使い方を教えていただけますか?
セージ。

回答:


4

プロセスの開始時にポップアップ通知を表示できます。スクリプトを次のように変更するだけです

notify-send "Your image will arrive" "after 5 minutes" && sleep 300 && firefox file:///home/tasks/fiveminutes.jpg

コマンドの-tパラメーター(およびミリ秒単位の時間)を使用して通知バブルの期間を設定できます。notify-sendたとえば、5分間の期間を設定します。

notify-send -t 300000 "heading" "text"

ただし、デスクトップ環境によってはこのパラメーターは完全に無視される場合があります(これを参照)。


こんにちはPomsky、あなたの提案をありがとう。私が探しているのは、画面全体に5分間残っているものです。
セージ。

1
@セージ。通知バブルのタイムアウトを設定する方法がありますが(回答の編集を参照)、残念ながら、特定のデスクトップ環境では機能しない場合があります。
pomsky

こんにちはPomsky-notify-send -tソリューションは夢のように機能します。本当にありがとうございました。
セージ。

6

次のようなスクリプトで十分です。

#!/usr/bin/env bash

while true
do
    if pgrep -f gedit > /dev/null
    then

       printf "\r%b" "\033[2K"
       printf "Script is running"
    else
       printf "\r%b" "\033[2K" 
       printf "Script is not running."
    fi
    sleep 0.25
done

これは非常に典型的な方法であり、シェルスクリプトでよく使用されます。これにより、継続的に実行され、1/4秒ごとにスクリプトがを介して実行されているかどうかがチェックされますpgrep -fif..fiシェルスクリプトのステートメントは、コマンドの終了ステータスを操作するため、pgrep -f成功した終了ステータスを返すと、スクリプトのプロセスが見つかり、実行されます。それ以外の場合は、elseステートメントに進みます。

どちらの場合も、実行中かどうかをユーザーに知らせるテキスト行を出力します。printf "\r%b" "\033[2K"行をクリアするためのエスケープシーケンスを印刷するためにも追加されています(よりクリーンな出力のため)。

そこからは空が限界です。そのテキストをパイプ経由でターミナル内の別のプロセスに渡すか、監視スクリプトからの出力をindicator-sysmonitorに渡すことができます。これにより、カスタム情報をインジケーターに表示できます。経由でインストールできます

sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
sudo apt-get update
sudo apt-get install indicator-sysmonitor

その後、監視スクリプトとなるカスタムコマンドを表示するようにインジケーターを構成します。カスタムコマンドの設定例はここにあります

もちろん、Pythonで独自のインジケーターを作成することもできますが、すでにそのためのツールがある場合、これは単なるやり過ぎかもしれません。


1
indicator-sysmonitor便利に聞こえますが、試してみるべきです。
pa4080

6

この回答とインターネットでの追加の調査に基づいた、Ubuntu 16.04でうまく機能するPythonランチャーを次に示します。

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

# Execute the script
script = os.path.basename(sys.argv[1])
subprocess.Popen(sys.argv[1:])
script_name = script.rsplit('/', 1)[-1]

class Indicator():
    def __init__(self):
        self.app = 'Script indicator'
        iconpath = "/usr/share/unity/icons/launcher_bfb.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.indicator.set_label("Script Indicator", self.app)
        # the thread:
        self.update = Thread(target=self.show_seconds)
        # daemonize the thread to make the indicator stopable
        self.update.setDaemon(True)
        self.update.start()

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

        menu.show_all()
        return menu

    def show_seconds(self):
        global script_name
        t = 0
        process = subprocess.call(['pgrep', script_name], stdout=subprocess.PIPE)
        while (process == 0):
            t += 1
            GObject.idle_add(
                self.indicator.set_label,
                script_name + ' ' + str(t) + 's', self.app,
                priority=GObject.PRIORITY_DEFAULT
                )
            time.sleep(1)
            process = subprocess.call(['pgrep', script_name], stdout=subprocess.PIPE)

        subprocess.call(['notify-send', script_name + ' ended in ' + str(t) + 's'])
        time.sleep(10)
        Gtk.main_quit()

    def stop(self, source):
        global script_name
        subprocess.call(['pkill', script_name], stdout=subprocess.PIPE)
        Gtk.main_quit()

Indicator()
# this is where we call GObject.threads_init()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
  • スクリプトを改善する方法を見つけた場合は、回答を編集してください。Pythonの経験はあまりありません。

実行可能ファイルを作成し、上記の行をコンテンツとして配置します。ファイルがと呼ばれてscript-indicator.pyいるとしましょう。ニーズとスクリプトの性質に応じて、このランチャーを次のいずれかの方法で使用できます。

./script-indicator.py /path/to/script.sh
./script-indicator.py /path/to/script.sh &
./script-indicator.py /path/to/script.sh > out.log &
./script-indicator.py /path/to/script.sh > /dev/null &
  • script.shあなたが示したいものはどこですか。

script.sh終了時のスクリーンショット:

ここに画像の説明を入力してください

  • 画像をクリックすると、アニメーションデモが表示されます。

または、/usr/local/binシステム全体でシェルコマンドとしてアクセスできるようにスクリプトを配置することもできます。この専用の GitHub Gist からダウンロードできます。

sudo wget -qO /usr/local/bin/script-indicator https://gist.githubusercontent.com/pa4080/4e498881035e2b5062278b8c52252dc1/raw/c828e1becc8fdf49bf9237c32b6524b016948fe8/script-indicator.py
sudo chmod +x /usr/local/bin/script-indicator

次の構文でテストしました。

script-indicator /path/to/script.sh
script-indicator /path/to/script.sh &
script-indicator /path/to/script.sh > output.log
script-indicator /path/to/script.sh > output.log &
script-indicator /path/to/script.sh > /dev/null
script-indicator /path/to/script.sh > /dev/null &
nohup script-indicator /path/to/script.sh >/dev/null 2>&1 &
# etc...

2
よくやった !すでにupvoted
Sergiy Kolodyazhnyy

4

osd_cat

パッケージosd_catから使用できxosd-bin xosd-binをインストールするます。例:

<<<"runs" osd_cat -d5 -i20 -o50 -f"-*-*-*-*-*-*-100-*-*-*-*-*-*-*" && firefox

これにより、画面上の位置に秒単位のフォントサイズ100で「実行」が表示され、準備ができると開始されます。この方法では必要ありません。たとえば、別のフォントを使用したい場合などに、オプションのX論理フォント記述子(この奇妙なもの)を取得するために使用できます。その他のオプションについては、こちらをご覧ください。520,50firefoxsleepxfontsel-*-*-…-fman osd_cat

yad

yad yadをインストールする次のように使用できます。

yad --title=runs --text="it’s running!" --timeout=5 --button=Fire:1 --button=Abort:0 || firefox

これには、5この例では数秒後にコマンドが終了しない場合は、コマンドを中止するか、すぐに実行できるという利点があります。


こんにちはデザート-あなたの提案をありがとう。私が探しているのは、画面全体に5分間残っているものです。
セージ。

@セージ。どちらもそれを行う、yadウィンドウを最小化することができます、osdテキストはできません。
デザート

@セージ。私は両方の提案されたソリューションをテストしましたが、それらはかなりうまくいきます。
pa4080

0

この既に機能しているスクリプトmulti-timerを使用して、汎用のカウントダウンタイマーの大部分を取り除くことができます。

回転するpizza.gif

これは、indicator-sysmonitorSergeの回答で説明されているものと同じものを使用します。

SystrayパーツBrightness: 2344も同じスクリプトで表示されます。

bashコードの不要な部分を取り除くことが新規ユーザーにとって非常に難しい場合はshow-sleep、必要な制限された機能で呼び出されるスクリプトをここに投稿できれば幸いです。以下のコメントを投稿してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.