C'è un modo per visualizzare un'icona solo mentre il mio script è in esecuzione?


10

Sono molto, molto nuovo nello scripting. Ecco il semplice script (che funziona) che ho scritto, che visualizza un'immagine quando sono trascorsi 5 minuti:

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

Ecco la mia domanda: a volte non ricordo se ho avviato il timer. C'è un modo per aggiungere un'indicazione di testo o icona (idealmente sulla barra delle applicazioni, ma ovunque sarebbe fantastico) che appare per 5 minuti (dal momento in cui avvio il timer al momento in cui lo finisco)?

Grazie mille per eventuali suggerimenti.


1
Bash non è il modo migliore per gestire le funzioni del desktop. Potresti guardare zenity o yad, ma non funzionano così bene con una funzione sleep. Se dovessi prendere in considerazione l'utilizzo di Python, sarebbe uno script molto semplice che potrebbe utilizzare un'icona nella barra delle applicazioni di GTK / wx.
Dorian,

Per una soluzione bash più complessa con zenity, puoi dare un'occhiata a questo codice: github.com/john-davies/shellpomo/blob/master/shellpomo
Dorian

Ciao Dorian - Grazie mille per i tuoi suggerimenti. Sarei felice di usare Python, puoi indicarmi un how-to per l'icona della barra delle applicazioni GTK / wx?
Salvia.

Risposte:


4

È possibile visualizzare una notifica popup all'avvio del processo. Cambia il tuo script in

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

È possibile impostare la durata del fumetto di notifica con il -tparametro (e il tempo in millisecondi) con il notify-sendcomando, ad esempio per impostare la durata per 5 minuti utilizzare

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

ma questo parametro può essere ignorato completamente a seconda dell'ambiente desktop (vedi questo ).


Ciao Pomsky, grazie per il tuo suggerimento. Quello che sto cercando è qualcosa che rimane sullo schermo per tutti i 5 minuti.
Salvia.

1
@Saggio. C'è un modo per impostare il timeout per il fumetto di notifica (vedi modifica alla risposta), ma sfortunatamente potrebbe non funzionare in determinati ambienti desktop.
pomsky

Ciao Pomsky - la soluzione di notifica-invio -t funziona come un sogno. Apprezzo molto il vostro aiuto.
Salvia.

6

È sufficiente avere una sceneggiatura del genere:

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

Questo è un modo molto tipico e spesso usato negli script di shell. Ciò che fa, viene eseguito continuamente e ogni quarto di secondo verifica se lo script è in esecuzione tramite pgrep -f. if..file istruzioni negli script di shell funzionano sullo stato di uscita dei comandi, quindi pgrep -frestituire lo stato di uscita riuscito significa che ha trovato il processo dello script ed è in esecuzione. Altrimenti, andiamo alla dichiarazione else.

In entrambi i casi stampiamo una riga di testo che indica all'utente se è in esecuzione o meno. Inoltre è stato aggiunto printf "\r%b" "\033[2K"per stampare una sequenza di escape per cancellare la linea (solo per un output più pulito).

Da lì, il cielo è il limite. È possibile passare tale testo a un altro processo nel terminale tramite pipe oppure è possibile passare l'output dallo script di monitoraggio all'indicatore-sysmonitor , che consente di visualizzare informazioni personalizzate nell'indicatore. Può essere installato tramite

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

Dopodiché basta configurare l'indicatore per visualizzare un comando personalizzato che sarebbe lo script di monitoraggio. Qui puoi trovare un esempio di configurazione di un comando personalizzato .

Certo, si potrebbe scrivere il proprio indicatore in Python, ma questo potrebbe essere solo un eccesso quando c'è già uno strumento per quello.


1
indicator-sysmonitorsembra utile, dovrei provarlo.
pa4080,

6

Ecco il launcher di Python, basato su questa risposta e su un'ulteriore ricerca in Internet, che funziona bene in 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()
  • Se vedi qualche modo per migliorare lo script, per favore, non esitare a modificare la risposta. Non ho molta esperienza con Python.

Crea un file eseguibile e posiziona le righe sopra come contenuto. Supponiamo che il file sia chiamato script-indicator.py. A seconda delle esigenze e della natura dello script, è possibile utilizzare questo programma di avvio in uno dei seguenti modi:

./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 &
  • Dov'è script.shquello che vuoi indicare.

Schermata fatta proprio quando script.shtermina:

inserisci qui la descrizione dell'immagine

  • Clicca sull'immagine per vedere una demo animata.

In alternativa è possibile posizionare lo script in modo /usr/local/binche sia accessibile come sistema di comando della shell a livello. Puoi scaricarlo da questo GitHub Gist dedicato :

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

L'ho provato con la seguente sintassi:

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
Buon lavoro ! Già votato
Sergiy Kolodyazhnyy

4

Con osd_cat

È possibile utilizzare osd_catdal xosd-bin Installa xosd-binpacchetto, ad esempio:

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

Questo visualizza "corre" con la dimensione del carattere 100per 5secondi nella posizione 20,50sullo schermo e inizia firefoxquando è pronto - non è necessario sleepcon questo approccio. È possibile utilizzare xfontselper ottenere il descrittore di caratteri logici X (questo strano -*-*-…aspetto) per l' -fopzione, ad esempio se si desidera utilizzare un carattere diverso. Leggi man osd_catper ulteriori opzioni.

Con yad

È possibile utilizzare yad Installa yadcome segue:

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

Ciò ha il vantaggio di poter interrompere il comando o eseguirlo immediatamente, se non si fa nulla, si chiuderà dopo 5pochi secondi in questo esempio.


Ciao Dessert - grazie per il tuo suggerimento. Quello che sto cercando è qualcosa che rimane sullo schermo per tutti i 5 minuti.
Salvia.

@Saggio. entrambi lo fanno, la yadfinestra può essere minimizzata, il testo osd no.
dessert

@Saggio. Ho testato entrambe le soluzioni proposte e funzionano abbastanza bene.
pa4080,

0

Puoi prendere questo script già funzionantemulti-timer e rimuoverne la maggior parte per un timer per il conto alla rovescia generico:

spinning pizza.gif

Usa lo stesso indicator-sysmonitordescritto nella risposta di Serge.

Anche la parte Systray Brightness: 2344viene visualizzata dallo stesso script.

Se l'eliminazione di porzioni non necessarie del codice bash è troppo difficile per i nuovi utenti, sarei felice di pubblicare qui uno script chiamato show-sleepcon le funzionalità limitate necessarie. Pubblica un commento qui sotto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.