Existe uma maneira de exibir um ícone apenas enquanto o meu script está sendo executado?

9

Sou muito novo em scripts. Aqui está o script simples (que funciona) que eu escrevi, que exibe uma imagem quando 5 minutos se passaram:

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

Eis a minha pergunta: às vezes não consigo lembrar se comecei o timer. Existe uma maneira de adicionar uma indicação de texto ou ícone (idealmente na barra de tarefas, mas em qualquer lugar seria ótimo) que aparece por 5 minutos (a partir do momento que inicio o timer até o momento em que termino)?

Muito obrigado por qualquer sugestão.

    
por Sage . 25.05.2018 / 17:30

5 respostas

4

Você pode exibir uma notificação pop-up quando o processo é iniciado. Apenas mude o seu script para

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

Você pode definir a duração da bolha de notificação com o parâmetro -t (e o tempo em milissegundos) com o comando notify-send , por exemplo, para definir a duração de 5 minutos de uso

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

mas esse parâmetro pode ser completamente ignorado, dependendo do seu ambiente de trabalho (veja isto ).

    
por pomsky 25.05.2018 / 17:59
6

É suficiente ter um script assim:

#!/usr/bin/env bash

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

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

Esta é uma maneira muito típica e frequentemente usada em scripts de shell. O que isto faz, está sendo executado continuamente, e a cada um quarto de segundo verifica se o seu script está rodando via pgrep -f . As declarações if..fi nos scripts de shell operam no status de saída dos comandos, portanto pgrep -f retornando o status de saída bem-sucedida significa que ele encontrou o processo do seu script e está em execução. Caso contrário, vamos para outra declaração.

Em ambos os casos, imprimimos uma linha de texto que informa ao usuário se ele está em execução ou não. Também foi adicionado printf "\r%b" "3[2K" para imprimir uma seqüência de escape para limpar a linha (apenas para saída mais limpa).

De lá, o céu é o limite. Você pode passar esse texto para outro processo no terminal via pipe ou pode passar a saída do script de monitoramento para indicator-sysmonitor , que permite exibir informações personalizadas no indicador. Pode ser instalado via

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

Depois disso, basta configurar o indicador para exibir um comando personalizado que seria o script de monitoramento. Exemplo de configuração de um comando personalizado pode ser encontrado aqui .

Claro, pode-se escrever seu próprio indicador em Python, mas isso pode ser um exagero quando já existe uma ferramenta para isso.

    
por Sergiy Kolodyazhnyy 25.05.2018 / 18:08
6

Aqui está o lançador Python, baseado em esta resposta e uma pesquisa adicional na Internet, que funciona bem no 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 você encontrar alguma maneira de melhorar o script, não hesite em editar a resposta. Eu não tenho muita experiência com Python.

Crie um arquivo executável e coloque as linhas acima como seu conteúdo. Vamos supor que o arquivo seja chamado de script-indicator.py . Dependendo das suas necessidades e da natureza do seu script, você pode usar este launcher de uma das seguintes maneiras:

./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 &
  • Onde script.sh é o que você deseja indicar.

Captura de tela feita quando o script.sh é finalizado:

  • Cliquenaimagemparaverumademonstraçãoanimada.

Comoalternativa,vocêpodecolocaroscriptem/usr/local/binparaficaracessívelcomoocomandoshellemtodoosistema.Vocêpodebaixá-lode este dedicar 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

Eu testei com a seguinte sintaxe:

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...
    
por pa4080 25.05.2018 / 20:29
4

com osd_cat

Você pode usar osd_cat do xosd-bin , por exemplo:

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

Isso exibe "execuções" com o tamanho da fonte 100 por 5 segundos na posição 20,50 na tela e inicia firefox quando estiver pronto - você não precisa de sleep com essa abordagem. Você pode usar xfontsel para obter o X Logical Font Descriptor (este estranho -*-*-… thingy) para a opção -f , por ex. se você quiser usar uma fonte diferente. Leia man osd_cat para mais opções.

com yad

Você pode usar yad daseguinteforma:

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

Isso tem a vantagem de poder abortar o comando ou executá-lo imediatamente, se você não fizer nada, ele será fechado após 5 segundos neste exemplo.

    
por dessert 25.05.2018 / 17:55
0

Você pode pegar este já está em execução o script multi-timer e retire a maior parte dele para um contador de contagem regressiva genérico:

Ele usa o mesmo indicator-sysmonitor descrito na resposta de Serge.

A parte do Systray Brightness: 2344 também é exibida pelo mesmo script.

Se remover partes desnecessárias do código bash for muito difícil para novos usuários, eu ficaria feliz em postar um script chamado show-sleep com a funcionalidade limitada necessária. Basta postar um comentário abaixo.

    
por WinEunuuchs2Unix 17.08.2018 / 03:40

Tags