มีวิธีแสดงไอคอนเฉพาะขณะที่สคริปต์ของฉันทำงานหรือไม่


10

ฉันเป็นคนใหม่มากในการเขียนสคริปต์ นี่เป็นสคริปต์ง่าย ๆ (ใช้งานได้) ที่ฉันเขียนซึ่งจะแสดงรูปภาพเมื่อผ่านไป 5 นาที:

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

นี่คือคำถามของฉัน: บางครั้งฉันจำไม่ได้ว่าฉันเริ่มจับเวลาแล้วหรือยัง มีวิธีเพิ่มตัวบ่งชี้ข้อความหรือไอคอน (นึกคิดบนทาสก์บาร์ แต่จะดีมาก) ที่ปรากฏเป็นเวลา 5 นาที (จากช่วงเวลาที่ฉันเริ่มจับเวลาไปจนถึงช่วงเวลาที่ฉันจบ)?

ขอบคุณมากสำหรับคำแนะนำใด ๆ


1
Bash ไม่ใช่วิธีที่ดีที่สุดในการจัดการฟังก์ชันเดสก์ท็อป คุณสามารถดู zenity หรือ yad ได้ แต่มันไม่ได้ผลดีเท่านี้กับฟังก์ชั่น sleep หากคุณจะพิจารณาใช้ Python นั่นจะเป็นสคริปต์ที่ง่ายมากที่สามารถใช้ไอคอนถาดระบบ GTK / wx
Dorian

สำหรับวิธีการแก้ปัญหา bash ที่ซับซ้อนยิ่งขึ้นด้วย zenity คุณสามารถดูรหัสนี้: github.com/john-davies/shellpomo/blob/master/shellpomo
Dorian

สวัสดี Dorian - ขอบคุณมากสำหรับคำแนะนำของคุณ ฉันยินดีที่จะใช้ 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
@ปราชญ์. มีวิธีตั้งค่าการหมดเวลาสำหรับฟองการแจ้งเตือน (ดูการแก้ไขคำตอบ) แต่น่าเสียดายที่มันอาจไม่ทำงานในบางสภาพแวดล้อมบนเดสก์ท็อป
pomsky

สวัสดี Pomsky - ระบบแจ้งเตือน - ส่ง - ทีทำงานเหมือนฝัน ผมขอขอบคุณความช่วยเหลือของคุณ.
ปราชญ์

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 แต่อาจเป็นเพียง overkill เมื่อมีเครื่องมือสำหรับที่แล้ว


1
indicator-sysmonitorฟังดูมีประโยชน์ฉันควรลองดู
pa4080

6

นี่คือ Python launcher จากคำตอบนี้และการวิจัยเพิ่มเติมในอินเทอร์เน็ตซึ่งใช้งานได้ดีใน 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 กระทู้:

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
เยี่ยมมาก! โหวตขึ้นแล้ว
Sergiy Kolodyazhnyy

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วินาทีในตัวอย่างนี้


สวัสดี Dessert - ขอบคุณสำหรับคำแนะนำของคุณ สิ่งที่ฉันกำลังมองหาคือสิ่งที่เหลืออยู่บนหน้าจอตลอด 5 นาที
ปราชญ์

@ปราชญ์. ทั้งสองอย่างนั้นyadหน้าต่างสามารถย่อเล็กสุดข้อความ osd ไม่สามารถ
ของหวาน

@ปราชญ์. ฉันได้ทดสอบวิธีแก้ปัญหาที่เสนอทั้งสองและพวกเขาทำงานได้ดี
pa4080

0

คุณสามารถนำสคริปต์ที่multi-timerใช้งานได้ไปแล้วและตัดส่วนใหญ่ออกเป็นตัวจับเวลานับถอยหลังทั่วไป:

pizza.gif

มันใช้indicator-sysmonitorคำอธิบายเดียวกันในคำตอบของ Serge

ส่วน Systray Brightness: 2344ยังแสดงโดยสคริปต์เดียวกัน

หากการแยกส่วนที่ไม่จำเป็นของรหัส bash นั้นยากเกินไปสำหรับผู้ใช้รายใหม่ฉันยินดีที่จะโพสต์สคริปต์ที่นี่show-sleepด้วยความสามารถที่ จำกัด เพียงแสดงความคิดเห็นด้านล่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.