我对脚本非常陌生。这是我编写的简单脚本(有效),经过5分钟后显示一个图像:
sleep 300 && firefox file:///home/tasks/fiveminutes.jpg
这是我的问题:有时我不记得是否启动了计时器。有没有一种方法可以添加文本或图标指示(理想情况下在任务栏上,但在任何地方都不错),显示时间为5分钟(从启动计时器到结束计时器)?
非常感谢您的任何建议。
我对脚本非常陌生。这是我编写的简单脚本(有效),经过5分钟后显示一个图像:
sleep 300 && firefox file:///home/tasks/fiveminutes.jpg
这是我的问题:有时我不记得是否启动了计时器。有没有一种方法可以添加文本或图标指示(理想情况下在任务栏上,但在任何地方都不错),显示时间为5分钟(从启动计时器到结束计时器)?
非常感谢您的任何建议。
Answers:
您可以在该过程开始时显示弹出通知。只需将脚本更改为
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"
但是根据您的桌面环境,可以完全忽略此参数(请参阅参考资料)。
这样的脚本就足够了:
#!/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 -f
。 if..fi
Shell脚本中的语句对命令的退出状态进行操作,因此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编写自己的指标,但是如果已经有了用于该指标的工具,那可能就太过分了。
indicator-sysmonitor
听起来很有用,我应该尝试一下。
这是基于此答案和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()
创建可执行文件,并将以上行作为其内容。假设文件名为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...
osd_cat
您可以osd_cat
从xosd-bin
包装中使用,例如:
<<<"runs" osd_cat -d5 -i20 -o50 -f"-*-*-*-*-*-*-100-*-*-*-*-*-*-*" && firefox
这样会在屏幕上的位置100
以5
秒为单位显示“运行”,并以字体大小显示几秒钟,20,50
并firefox
在准备就绪时开始显示-您不需要sleep
这种方法。您可以使用xfontsel
获取该选项的X逻辑字体描述符(这很奇怪-*-*-…
)-f
,例如,如果您要使用其他字体。阅读man osd_cat
更多选项。
yad
您可以使用yad
以下方法:
yad --title=runs --text="it’s running!" --timeout=5 --button=Fire:1 --button=Abort:0 || firefox
这样的好处是您可以中止命令或立即执行命令,如果不执行任何操作,则5
在本示例中,命令将在几秒钟后关闭。
yad
窗口可以最小化,而osd文本不能。
您可以将这个已经起作用的脚本multi-timer
删除,并去除其中的大部分,以用作通用的倒数计时器:
它使用与indicator-sysmonitor
Serge的答案中描述的相同。
Systray部分Brightness: 2344
也以相同的脚本显示。
如果剥离bash代码的不必要部分对于新用户来说太困难了,我很乐意在此处发布一个脚本show-sleep
,该脚本具有必要的有限功能。只需在下面发表评论。