是否只有在脚本运行时才显示图标?


10

我对脚本非常陌生。这是我编写的简单脚本(有效),经过5分钟后显示一个图像:

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

这是我的问题:有时我不记得是否启动了计时器。有没有一种方法可以添加文本或图标指示(理想情况下在任务栏上,但在任何地方都不错),显示时间为5分钟(从启动计时器到结束计时器)?

非常感谢您的任何建议。


1
Bash不是处理桌面功能的最佳方法。您可以查看zenity或yad,但它们在睡眠功能方面效果不佳。如果您考虑使用Python,那将是一个非常简单的脚本,可以使用GTK / wx系统任务栏图标。
多里安

对于具有zenity的更复杂的bash解决方案,您可以查看以下代码:github.com/john-davies/shellpomo/blob/master/shellpomo
Dorian

嗨,多里安-非常感谢您的建议。我很高兴使用Python,您能为我介绍GTK / wx系统任务栏图标的使用方法吗?
圣人。

Answers:


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 '18

嗨Pomsky-notify-send -t解决方案像梦一样运作。非常感谢您的帮助。
圣人。

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

这是一种非常典型的方法,经常在shell脚本中使用。它的作用是连续运行,并且每四分之一秒检查脚本是否通过运行pgrep -fif..fiShell脚本中的语句对命令的退出状态进行操作,因此pgrep -f返回成功的退出状态意味着它已找到脚本的进程并正在运行。否则,我们转到else语句。

在这两种情况下,我们都打印一行文本,告诉用户它是否正在运行。还添加了printf "\r%b" "\033[2K"用于打印转义序列以清除行的代码(仅用于更清洁的输出)。

从那里开始,天空才是极限。您可以将该文本通过管道传递给终端中的另一个进程,也可以将监视脚本的输出传递给indicator-sysmonitor,后者允许在指示器中显示自定义信息。可以通过安装

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

之后,只需配置指示器以显示自定义命令,该命令就是监视脚本。在此处可以找到配置定制命令的示例。

当然,可以用Python编写自己的指标,但是如果已经有了用于该指标的工具,那可能就太过分了。


1
indicator-sysmonitor听起来很有用,我应该尝试一下。
pa4080 '18

6

这是基于此答案和Internet上其他研究的Python启动器,在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以在整个Shell命令系统范围内进行访问。您可以从以下专用 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

我已经使用以下语法对其进行了测试:

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_catxosd-bin 安装xosd-bin包装中使用,例如:

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

这样会在屏幕上的位置1005秒为单位显示“运行”,并以字体大小显示几秒钟,20,50firefox在准备就绪时开始显示-您不需要sleep这种方法。您可以使用xfontsel获取该选项的X逻辑字体描述符(这很奇怪-*-*-…-f,例如,如果您要使用其他字体。阅读man osd_cat更多选项。

yad

您可以使用yad 安装yad以下方法:

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

这样的好处是您可以中止命令或立即执行命令,如果不执行任何操作,则5在本示例中,命令将在几秒钟后关闭。


甜点好-谢谢您的建议。我正在寻找的是在整个5分钟内都保留在屏幕上的东西。
圣人。

@智者。两者都可以做到,yad窗口可以最小化,而osd文本不能。
甜点

@智者。我已经测试了这两个提议的解决方案,它们都工作得很好。
pa4080 '18

0

您可以将这个已经起作用的脚本multi-timer删除,并去除其中的大部分,以用作通用的倒数计时器:

旋转披萨

它使用与indicator-sysmonitorSerge的答案中描述的相同。

Systray部分Brightness: 2344也以相同的脚本显示。

如果剥离bash代码的不必要部分对于新用户来说太困难了,我很乐意在此处发布一个脚本show-sleep,该脚本具有必要的有限功能。只需在下面发表评论。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.