Czy istnieje sposób wyświetlania ikony tylko podczas działania skryptu?

10

Jestem bardzo, bardzo nowy w skryptowaniu. Oto prosty skrypt (który działa), który napisałem, który wyświetla obraz po upływie 5 minut:

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

Oto moje pytanie: czasami nie pamiętam, czy uruchomiłem stoper. Czy istnieje sposób, aby dodać tekst lub ikonę (najlepiej na pasku zadań, ale gdziekolwiek byłoby świetnie), która pojawia się przez 5 minut (od momentu uruchomienia stopera do momentu jego zakończenia)?

Dziękuję bardzo za wszelkie sugestie.

Szałwia .
źródło
1
Bash nie jest najlepszym sposobem obsługi funkcji pulpitu. Możesz spojrzeć na zenity lub yad, ale nie działają one tak dobrze z funkcją snu. Jeśli rozważasz użycie Pythona, byłby to bardzo prosty skrypt, który mógłby użyć ikony zasobnika systemowego GTK / wx.
Dorian
Aby uzyskać bardziej złożone rozwiązanie bash z zenity, możesz spojrzeć na ten kod: github.com/john-davies/shellpomo/blob/master/shellpomo
Dorian
Cześć Dorian - Dziękuję bardzo za sugestie. Z przyjemnością skorzystam z Pythona. Czy możesz wskazać mi instrukcję dotyczącą ikony zasobnika systemowego GTK / wx?
Szałwia.

Odpowiedzi:

4

Po wyświetleniu procesu możesz wyświetlić wyskakujące powiadomienie. Po prostu zmień skrypt na

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

Możesz ustawić czas trwania powiadomienia bąbelkowego za pomocą -tparametru (i czas w milisekundach) za pomocą notify-sendpolecenia, na przykład, aby ustawić czas trwania na 5 minut

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

ale ten parametr może zostać całkowicie zignorowany w zależności od środowiska pulpitu (zobacz to ).

pomsky
źródło
Cześć Pomsky, dziękuję za twoją sugestię. To, czego szukam, to coś, co pozostaje na ekranie przez całe 5 minut.
Szałwia.
1
@Szałwia. Istnieje sposób ustawienia limitu czasu dla bańki powiadomień (patrz edycja odpowiedzi), ale niestety może nie działać w niektórych środowiskach pulpitu.
pomsky
Cześć Pomsky - rozwiązanie powiadomienie-wysłanie-t działa jak sen. Doceniam twoją pomoc.
Szałwia.
6

Wystarczy mieć taki skrypt:

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

Jest to bardzo typowy sposób i często używany w skryptach powłoki. Działa to nieprzerwanie i co kwadrans sprawdza, czy skrypt działa pgrep -f. if..fiinstrukcje w skryptach powłoki działają na statusie wyjścia komend, więc pgrep -fzwrócenie pomyślnego statusu wyjścia oznacza, że ​​znalazł proces skryptu i działa. W przeciwnym razie przejdziemy do instrukcji else.

W obu przypadkach drukujemy wiersz tekstu informujący użytkownika, czy jest uruchomiony, czy nie. Dodano również printf "\r%b" "\033[2K"drukowanie sekwencji ucieczki w celu wyczyszczenia linii (tylko w celu uzyskania czystszego wyniku).

Stamtąd niebo jest granicą. Możesz przekazać ten tekst do innego procesu w terminalu za pomocą potoku lub przekazać dane wyjściowe ze skryptu monitorowania do wskaźnika-sysmonitor , który umożliwia wyświetlanie niestandardowych informacji we wskaźniku. Można go zainstalować za pośrednictwem

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

Następnie wystarczy skonfigurować wskaźnik, aby wyświetlał niestandardowe polecenie, które byłoby skryptem monitorowania. Przykład konfiguracji niestandardowego polecenia można znaleźć tutaj .

Oczywiście można napisać własny wskaźnik w Pythonie, ale może to być po prostu przesada, jeśli jest już na to narzędzie.

Sergiy Kolodyazhnyy
źródło
1
indicator-sysmonitorbrzmi użytecznie, powinienem spróbować.
pa4080
6

Oto program uruchamiający Python, oparty na tej odpowiedzi i dodatkowych badaniach w Internecie, który działa dobrze w 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()
  • Jeśli widzisz jakiś sposób na ulepszenie skryptu, nie wahaj się edytować odpowiedzi. Nie mam dużego doświadczenia z Pythonem.

Utwórz plik wykonywalny i umieść powyższe wiersze jako jego zawartość. Załóżmy, że plik się nazywa script-indicator.py. W zależności od potrzeb i charakteru skryptu możesz użyć tego programu uruchamiającego na jeden z następujących sposobów:

./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 &
  • Gdzie script.shjest ten, który chcesz wskazać.

Zrzut ekranu wykonany tuż po script.shzakończeniu:

wprowadź opis zdjęcia tutaj

  • Kliknij na obrazek, aby zobaczyć animowane demo.

Alternatywnie możesz umieścić skrypt, /usr/local/binaby był dostępny jako system poleceń powłoki w całym systemie. Możesz pobrać go z tego dedykowanego 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

Przetestowałem to przy użyciu następującej składni:

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
źródło
2
Dobra robota ! Już przegłosowano
Sergiy Kolodyazhnyy
4

Z osd_cat

Możesz użyć osd_catz xosd-bin Zainstaluj xosd-binpakietu, np .:

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

To wyświetla „przebiegi” z czcionkami 100przez 5kilka sekund w pozycji 20,50na ekranie i rozpoczyna się, firefoxgdy jest gotowy - nie potrzebujesz sleeptego podejścia. Możesz użyć, xfontselaby uzyskać X logiczny deskryptor czcionki (to dziwne -*-*-…) dla -fopcji, np. Jeśli chcesz użyć innej czcionki. Czytaj man osd_catwięcej opcji.

Z yad

Możesz użyć yad Zainstaluj yadw następujący sposób:

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

Ma to tę zaletę, że możesz przerwać polecenie lub wykonać je natychmiast, jeśli nic nie zrobisz, zamknie się ono po 5kilku sekundach w tym przykładzie.

deser
źródło
Cześć Deser - dziękuję za twoją sugestię. To, czego szukam, to coś, co pozostaje na ekranie przez całe 5 minut.
Szałwia.
@Szałwia. oba to robią, yadokno można zminimalizować, tekst osd nie.
deser
@Szałwia. Przetestowałem oba zaproponowane rozwiązania i działają całkiem nieźle.
pa4080
0

Możesz wziąć ten już działający skryptmulti-timer i rozebrać go w celu uzyskania ogólnego timera odliczającego:

spinning pizza.gif

Wykorzystuje to samo, co indicator-sysmonitoropisano w odpowiedzi Serge'a.

Część Systray Brightness: 2344jest również wyświetlana przez ten sam skrypt.

Jeśli usunięcie niepotrzebnych fragmentów kodu bash jest zbyt trudne dla nowych użytkowników, chętnie opublikuję tutaj skrypt o nazwie show-sleepwymaganej ograniczonej funkcjonalności. Po prostu opublikuj komentarz poniżej.

WinEunuuchs2Unix
źródło