Apakah ada cara untuk menampilkan ikon hanya saat skrip saya berjalan?

10

Saya sangat, sangat baru dalam scripting. Ini adalah skrip sederhana (yang berfungsi) yang saya tulis, yang menampilkan gambar ketika 5 menit berlalu:

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

Inilah pertanyaan saya: kadang-kadang saya tidak ingat apakah saya sudah memulai timer. Apakah ada cara untuk menambahkan indikasi teks atau ikon (idealnya di taskbar, tetapi di mana saja akan lebih bagus) yang muncul selama 5 menit (dari saat saya memulai timer hingga saat saya mengakhirinya)?

Terima kasih banyak atas sarannya.

Sage .
sumber
1
Bash bukan cara terbaik untuk menangani fungsi desktop. Anda bisa melihat zenity atau yad, tetapi mereka tidak bekerja dengan baik dengan fungsi tidur. Jika Anda mempertimbangkan untuk menggunakan Python, maka itu akan menjadi skrip yang sangat sederhana yang dapat menggunakan ikon baki sistem GTK / wx.
Dorian
Untuk solusi bash yang lebih kompleks dengan zenity, Anda dapat melihat kode ini: github.com/john-davies/shellpomo/blob/master/shellpomo
Dorian
Hai Dorian - Terima kasih banyak atas saran Anda. Saya akan senang menggunakan Python, bisakah Anda mengarahkan saya ke arah cara untuk ikon baki sistem GTK / wx?
Sage.

Jawaban:

4

Anda dapat menampilkan notifikasi pop-up ketika proses dimulai. Ubah saja skrip Anda ke

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

Anda dapat mengatur durasi gelembung pemberitahuan dengan -tparameter (dan waktu dalam milidetik) dengan notify-sendperintah, misalnya untuk mengatur durasi selama 5 menit, gunakan

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

tetapi parameter ini mungkin diabaikan sepenuhnya tergantung pada lingkungan desktop Anda (lihat ini ).

pomsky
sumber
Hai Pomsky, terima kasih atas saran Anda. Yang saya cari adalah sesuatu yang tetap ada di layar selama 5 menit.
Sage.
1
@Sage. Ada cara untuk mengatur batas waktu untuk gelembung pemberitahuan (lihat edit pada jawabannya), tetapi sayangnya itu mungkin tidak berfungsi di lingkungan desktop tertentu.
pomsky
Hai Pomsky - solusi notify-send -t berfungsi seperti mimpi. Saya sangat menghargai bantuan Anda.
Sage.
6

Cukuplah untuk memiliki skrip seperti:

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

Ini adalah cara yang sangat khas dan sering digunakan dalam skrip shell. Apa yang dilakukan, berjalan terus-menerus, dan setiap seperempat detik memeriksa apakah skrip Anda berjalan pgrep -f. if..fipernyataan dalam skrip shell beroperasi pada status keluar dari perintah, sehingga pgrep -fmengembalikan status keluar yang berhasil berarti ia menemukan proses skrip Anda dan sedang berjalan. Kalau tidak, kita pergi ke pernyataan lain.

Dalam kedua kasus kami mencetak satu baris teks yang memberi tahu pengguna apakah itu berjalan atau tidak. Ada juga ditambahkan printf "\r%b" "\033[2K"untuk mencetak urutan keluar untuk membersihkan garis (hanya untuk keluaran yang lebih bersih).

Dari sana, langit adalah batasnya. Anda dapat meneruskan teks itu ke proses lain di terminal melalui pipa atau Anda bisa meneruskan output dari skrip pemantauan ke indikator-sysmonitor , yang memungkinkan menampilkan informasi khusus dalam indikator. Ini dapat diinstal melalui

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

Setelah itu konfigurasikan indikator untuk menampilkan perintah khusus yang akan menjadi skrip pemantauan. Contoh konfigurasi perintah kustom dapat ditemukan di sini .

Tentu saja, seseorang dapat menulis indikator mereka sendiri dengan Python, tetapi ini mungkin hanya sebuah kerja keras ketika sudah ada alat untuk itu.

Sergiy Kolodyazhnyy
sumber
1
indicator-sysmonitorKedengarannya bermanfaat, saya harus mencobanya.
pa4080
6

Berikut ini adalah peluncur Python, berdasarkan jawaban ini dan penelitian tambahan di Internet, yang bekerja dengan baik di 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()
  • Jika Anda melihat cara untuk meningkatkan skrip, tolong, jangan ragu untuk mengedit jawabannya. Saya belum banyak pengalaman dengan Python.

Buat file yang dapat dieksekusi dan tempatkan baris di atas sebagai kontennya. Mari kita asumsikan file tersebut dipanggil script-indicator.py. Bergantung pada kebutuhan dan sifat skrip Anda, Anda dapat menggunakan peluncur ini dengan salah satu cara berikut:

./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 &
  • Di mana script.shyang ingin Anda tunjukkan.

Cuplikan layar dibuat tepat ketika script.shberakhir:

masukkan deskripsi gambar di sini

  • Klik pada gambar untuk melihat demo animasi.

Atau Anda dapat menempatkan skrip /usr/local/binuntuk dapat diakses sebagai sistem perintah shell lebar. Anda dapat men-download dari mendedikasikan ini GitHub Intisari:

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

Saya sudah mengujinya dengan sintaks berikut:

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
sumber
2
Kerja bagus ! Sudah terbalik
Sergiy Kolodyazhnyy
4

Dengan osd_cat

Anda dapat menggunakan osd_catdari xosd-bin Instal xosd-binpaket, misalnya:

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

Ini menampilkan "berjalan" dengan ukuran font 100selama beberapa 5detik pada posisi 20,50di layar dan mulai firefoxketika sudah siap - Anda tidak perlu sleepdengan pendekatan ini. Anda dapat menggunakan xfontseluntuk mendapatkan X Font Logical Descriptor ( -*-*-…thingy aneh ini ) untuk -fopsi, misalnya jika Anda ingin menggunakan font yang berbeda. Baca man osd_catuntuk opsi lainnya.

Dengan yad

Anda bisa menggunakan yad Instal yadsebagai berikut:

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

Ini memiliki keuntungan bahwa Anda dapat membatalkan perintah atau menjalankannya segera, jika Anda tidak melakukan apa-apa itu akan ditutup setelah beberapa 5detik dalam contoh ini.

pencuci mulut
sumber
Hai Dessert - terima kasih atas saran Anda. Yang saya cari adalah sesuatu yang tetap ada di layar selama 5 menit.
Sage.
@Sage. keduanya melakukan itu, yadjendela bisa diperkecil, teks osd tidak bisa.
hidangan penutup
@Sage. Saya telah menguji kedua solusi yang diusulkan dan mereka bekerja dengan cukup baik.
pa4080
0

Anda dapat mengambil skrip yang sudah berfungsi inimulti-timer dan menghapus sebagian besar untuk penghitung waktu mundur generik:

berputar pizza.gif

Ini menggunakan hal yang sama yang indicator-sysmonitordijelaskan dalam jawaban Serge.

Bagian Systray Brightness: 2344juga ditampilkan oleh skrip yang sama.

Jika menghapus bagian yang tidak dibutuhkan dari kode bash terlalu sulit bagi pengguna baru, saya akan senang untuk mengirim skrip yang disebut show-sleepdengan fungsionalitas terbatas yang diperlukan. Cukup kirim komentar di bawah ini.

WinEunuuchs2Unix
sumber