Чи існує спосіб відображення піктограми лише під час запуску мого сценарію?


10

Я дуже-дуже новачок в сценарії. Ось простий сценарій (який працює), який я написав, який відображає зображення, коли минуло 5 хвилин:

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

Ось моє запитання: іноді я не можу згадати, чи запустив таймер. Чи є спосіб додати текстову або піктограму значків (в ідеалі на панелі завдань, але будь-де було б чудово), що з’являється протягом 5 хвилин (з моменту запуску таймера до моменту, коли я його закінчую)?

Дякую за будь-які пропозиції.


1
Bash - це не найкращий спосіб поводження з функціями робочого столу. Ви можете дивитись на зен або яд, але вони не так добре працюють із функцією сну. Якщо ви подумаєте про використання Python, то це був би дуже простий скрипт, який міг би використовувати значок системного лотка GTK / wx.
Доріан

Щоб отримати більш складний баш-рішення з врядністю, ви можете подивитися на цей код: 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. Існує спосіб встановити тайм-аут для бульбашки сповіщень (див. Редагування відповіді), але, на жаль, він може не працювати в певних середовищах робочого столу.
pomsky

Привіт Pomsky - рішення сповіщення-відправлення -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"друк послідовності виходу для очищення лінії (лише для більш чистого виводу).

Звідти небо - це межа. Ви можете передати цей текст іншому процесу в терміналі по трубі або ви можете передати висновок зі сценарію моніторингу на індикатор-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

Ось пусковий засіб 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...

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наступне:

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 і викреслити основну частину його для загального таймера зворотного відліку:

спінінг піца.gif

Він використовує те саме, що indicator-sysmonitorописано у відповіді Сержа.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.