我对脚本编写非常陌生。下面是我编写的简单脚本(可以工作),它会在 5 分钟后显示一张图片:
sleep 300 && firefox file:///home/tasks/fiveminutes.jpg
我的问题是:有时我记不住是否启动了计时器。有没有办法添加一个文本或图标指示(最好是在任务栏上,但任何地方都很好),该指示会出现 5 分钟(从我启动计时器的那一刻到我结束计时器的那一刻)?
非常感谢您的任何建议。
答案1
这是基于 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 存储库:
sudo wget -qO /usr/local/bin/script-indicator https://raw.githubusercontent.com/metalevel-tech/powerNow/master/powerNow.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
有如下脚本就足够了:
#!/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"
打印转义序列以清除行(只是为了更清晰的输出)。
从那里开始,天空就是极限。您可以通过管道将该文本传递给终端中的另一个进程,也可以将监控脚本的输出传递给指标-系统监视器,允许在指标中显示自定义信息。它可以通过
sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
sudo apt-get update
sudo apt-get install indicator-sysmonitor
之后,只需配置指标以显示自定义命令(即监控脚本)。可以找到配置自定义命令的示例这里。
当然,人们可以用 Python 编写自己的指标,但当已经有这样的工具时,这可能就有点小题大做了。
答案3
和osd_cat
您可以osd_cat
使用xosd-bin
包,例如:
<<<"runs" osd_cat -d5 -i20 -o50 -f"-*-*-*-*-*-*-100-*-*-*-*-*-*-*" && firefox
这将在屏幕上的位置显示字体大小的“运行”100
秒数,并在准备就绪时启动 - 使用这种方法时您不需要这样做。您可以使用获取选项的 X 逻辑字体描述符(这个奇怪的东西),例如,如果您想使用不同的字体。阅读更多选项。5
20,50
firefox
sleep
xfontsel
-*-*-…
-f
man osd_cat
和yad
你可以使用yad
如下:
yad --title=runs --text="it’s running!" --timeout=5 --button=Fire:1 --button=Abort:0 || firefox
这样做的好处是您可以中止命令或立即执行它,如果您不执行任何操作,它将5
在此示例中在几秒钟后关闭。
答案4
你可以拿这个已经可以运行的脚本multi-timer
并剥离其中的大部分内容作为通用倒计时器:
它使用indicator-sysmonitor
与 Serge 的答案中描述相同的内容。
Systray部分Brightness: 2344
也由相同的脚本显示。
如果删除 bash 代码中不需要的部分对新用户来说太难,我很乐意在这里发布一个show-sleep
具有必要有限功能的脚本。只需在下面发表评论即可。