Есть ли способ отобразить значок только во время работы моего скрипта?

10

Я очень, очень плохо знаком со сценариями. Вот простой скрипт (который работает), который я написал, который отображает изображение, когда прошло 5 минут:

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

Вот мой вопрос: иногда я не могу вспомнить, запустил ли я таймер. Есть ли способ добавить текстовую или пиктограмму (в идеале на панели задач, но в любом месте было бы замечательно), которая появляется в течение 5 минут (с момента запуска таймера до момента его завершения)?

Большое спасибо за любые предложения.

Мудрец.
источник
1
Bash - не самый лучший способ справиться с функциями рабочего стола. Вы можете посмотреть на zenity или yad, но они не так хорошо работают с функцией сна. Если вы подумаете об использовании Python, то это будет очень простой скрипт, который может использовать значок в системном трее GTK / wx.
Дориан
Для более сложного решения bash с zenity вы можете взглянуть на этот код: github.com/john-davies/shellpomo/blob/master/shellpomo
Дориан
Привет Дориан - Большое спасибо за ваши предложения. Я был бы счастлив использовать 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
@Sage. Есть способ установить тайм-аут для всплывающего уведомления (см. Редактирование ответа), но, к сожалению, он может не работать в определенных средах рабочего стола.
Помский
Привет, Помский - решение 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

Это очень типичный способ и часто используется в сценариях оболочки. Что это делает, работает постоянно, и каждую четверть секунды он проверяет, выполняется ли ваш скрипт через pgrep -f. if..fiоператоры в сценариях оболочки работают с состоянием выхода команд, поэтому pgrep -fвозвращение статуса успешного завершения означает, что он нашел процесс вашего сценария и он запущен. В противном случае мы переходим к другому заявлению.

В обоих случаях мы печатаем строку текста, которая сообщает пользователю, работает он или нет. Также добавлена printf "\r%b" "\033[2K"возможность печати escape-последовательности для очистки линии (только для более чистого вывода).

Оттуда небо - предел. Вы можете передать этот текст другому процессу в терминале через канал или вы можете передать выходные данные из скрипта мониторинга в индикатор-системный монитор , который позволяет отображать пользовательскую информацию в индикаторе. Может быть установлен через

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

После этого просто настройте индикатор для отображения пользовательской команды, которая будет скриптом мониторинга. Пример настройки пользовательской команды можно найти здесь .

Конечно, можно написать собственный индикатор на Python, но это может быть просто излишним, когда уже есть инструмент для этого.

Сергей Колодяжный
источник
1
indicator-sysmonitorзвучит полезно, я должен попробовать это.
pa4080
6

Вот пусковая установка Python, основанная на этом ответе и дополнительном исследовании в Интернете, которая хорошо работает в Ubuntu 16.04:

#!/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...
pa4080
источник
2
Хорошая работа ! Уже проголосовали
Сергей Колодяжный
4

С osd_cat

Вы можете использовать osd_catиз xosd-bin Установите xosd-binпакета, например:

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

Это отображает «работает» с размером шрифта в 100течение 5нескольких секунд в позиции 20,50на экране и начинается, firefoxкогда он будет готов - вам не нужно sleepс этим подходом. Вы можете использовать, xfontselчтобы получить X Logical Font Descriptor (эта странная -*-*-…штука) для -fопции, например, если вы хотите использовать другой шрифт. Читайте man osd_catбольше вариантов.

С yad

Вы можете использовать yad Установить Ядследующим образом:

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

Преимущество в том, что вы можете прервать выполнение команды или выполнить ее немедленно, если вы ничего не сделаете, 5в этом примере она закроется через несколько секунд.

Десерт
источник
Привет Десерт - спасибо за ваше предложение. То, что я ищу, это то, что остается на экране в течение 5 минут.
Мудрец.
@Sage. оба делают это, yadокно может быть свернуто, текст OSD не может.
десерт
@Sage. Я протестировал оба предложенных решения, и они работают довольно хорошо.
pa4080
0

Вы можете взять этот уже работающий скриптmulti-timer и вырезать большую его часть для общего таймера обратного отсчета:

спиннинг pizza.gif

Он использует то же, что indicator-sysmonitorописано в ответе Сержа.

Часть Systray Brightness: 2344также отображается тем же сценарием.

Если вычеркнуть ненужные части кода bash слишком сложно для новых пользователей, я был бы рад опубликовать здесь скрипт show-sleepс необходимой ограниченной функциональностью. Просто оставьте комментарий ниже.

WinEunuuchs2Unix
источник