有时我会使用命令行程序,这些程序需要很长时间才能输入,如果在桌面上当前窗口的顶部有警报、音频消息和/或信息窗口,则有助于完成工作。我正在考虑图形桌面环境或窗口管理器。除非 GUI 工具通过终端窗口和通过 工作,否则可能会为 Ubuntu Server 制作一个特殊版本,该版本在文本模式下工作ssh
。
如果我制作了自己的程序或者它是一个小的 shellscript,我可以修改它来生成警报,但许多程序都没有提供源代码,或者很难弄乱它。因此,如果 Ubuntu 系统中有一个工具,可以监视大多数编译程序以及脚本,并在 [缓慢的] 命令行进程需要我的注意时唤醒我,那就太好了。
当某些内容被写入时,它表示程序正在等待输入或已完成并且结果已可供我使用。
那么,如何找到或制作一个工具来监视终端窗口中的活动,并在写入内容时发出警报?
答案1
监控程序对话并发送警报
您可以监控
- A先进先出使用 shellscript
viafifo
或者 - 一个
xterm
日志档案使用 shellscriptvialog
并让它开始zenity
信息消息,当有来自受监控程序的输入时。如果您愿意,您还可以安装espeak
并让它发送音频消息。
zenity
1.当使用 fifo 的监控程序有输入时,启动信息消息viafifo
。
以下 shellscript 可以监视程序的输出对话框并发送警报。它需要espeak
和script
(script
在 Ubuntu 中不需要安装)。
sudo apt update
sudo apt install espeak
- 假设有一个图形桌面环境
- 在终端窗口中启动一个 shellscript,我们将其称为
viafifo
。 - 启动要监控的程序‘in
viafifo
’ - 在终端窗口中运行对话框(这是您输入内容的地方)
- 使用 fifo 来访问要监视的程序的输出,
/dev/stdin
和/dev/stdout
。dev/stderr
shellscript 中的主要任务是使用程序script
,即监视终端窗口中的活动并写入fifo。 - 运行
while
循环- 测试 fifo 是否已被修改,如果是的话
- 启动一个
zenity
信息消息窗口和一个相应的口头消息espeak
。 - 输入过程中允许有短暂的延迟(8 秒;您可以编辑脚本文件来更改延迟时间)。
- 启动一个
- 测试 fifo 是否已被修改,如果是的话
您需要关闭zenity
窗口(可以使用“Enter”键)才能返回到xterm
您输入内容的窗口。
键入exit
leavescript
并viafifo
。之后,您可以获得包含整个对话的日志文件。
#!/bin/bash
# date editor comment
# 2019-01-01 sudodus version 1.0
# 2019-01-05 sudodus fixed output of version
# 2019-01-05 sudodus version 1.1
version=1.1
name=${0##*/}
# Usage
if [ "$1" == "-h" ] || [ "$1" == "--help" ]
then
echo "'$name' is a wrapper, that sends a notification, when the wrapped program
has written to standard input and standard error and may be waiting for input.
---
Usage: $name <options>
Example: $name
$name -h # this help text
$name -v # show version"
exit
elif [ "$1" == "-v" ]
then
echo "$name version $version"
exit
fi
# Preparation
message="Check, if the monitored program asks for input"
inversvid="\0033[7m"
resetvid="\0033[0m"
tmpdir=$(mktemp -d)
tmpfifo=$(mktemp --tmpdir=$tmpdir)
rm "$tmpfifo"
mkfifo "$tmpfifo"
#ls -l "$tmpdir"
sleep 1
cnt1=$(stat --printf "%Y" "$tmpfifo")
< "$tmpfifo" cat >> $tmpdir/${name}.log &
# Monitor the output from program with a while loop
while true
do
if test -f $tmpdir/stop
then
break
fi
cnt0=$cnt1
sleep 0.5
cnt1=$(stat --printf "%Y" "$tmpfifo")
if [ $cnt1 -gt $((cnt0+8)) ]
then
# zenity --notification --text="$message" 2> /dev/null
espeak "$message" &
zenity --info --title="${0##*/} ${1##*/} $2 ..." \
--text="$message" --width=500 2> /dev/null
sleep 0.5
cnt1=$(stat --printf "%Y" "$tmpfifo")
fi
sleep 1
done &
# Prepare for the monitoring
echo -en "\0033]0;$name: 'exit' to leave subshell\0007"
echo -en "\0033]1;$name\0007"
ncol=$(tput cols)
nfill=$((ncol -13 -${#name}))
hyphs=$(for ((i=1;i<=nfill;i++));do echo -n '-';done;echo '')
echo -e "$inversvid----- Start $name $hyphs$resetvid"
tstart=$(date '+%s')
# Monitoring
script -fq $tmpfifo
# Finish writing after monitoring
tend=$(date '+%s')
tuse=$((tend-tstart))
winttl=$(pwd)
echo -en "\0033]0;$winttl\0007"
echo -en "\0033]1;$winttl\0007"
ncol=$(tput cols)
nfill=$((ncol -11 -${#name}))
hyphs=$(for ((i=1;i<=nfill;i++));do echo -n '-';done;echo '')
echo -e "$inversvid----- End $name $hyphs$resetvid"
touch $tmpdir/stop # to break the while loop
sleep 3
savlog="Finished. Save the log '${name}.log'?"
espeak "$savlog" &
zenity --question --title="${0##*/} ${1##*/} $2 ..." \
--text="$savlog" --width=500 2> /dev/null
if [ $? = 0 ]
then
echo "$name used $tuse seconds" >> $tmpdir/${name}.log
mv $tmpdir/${name}.log . && echo "See '${name}.log'" || echo "Failed to save the log file"
fi
echo "$name used $tuse seconds plus a few (5-10) seconds for preparing and finishing"
# Clean up
rm -r "$tmpdir"
zenity
2.当使用 将某些内容写入窗口xterm
(来自受监控的程序或用户)时,启动信息消息vialog
。
以下 shellscript 可以监视与程序的对话并发送警报。它需要espeak
和xterm
。
sudo apt update
sudo apt install espeak xterm
- 假设有一个图形桌面环境
- 在终端窗口中启动 shell 脚本,该窗口的作用类似于
vialog
xterm
在窗口中启动要监视的程序xterm
在窗口中运行对话框(这是您输入内容的地方)- 使用日志文件来
xterm
访问要监视的程序的输出和输入 - 运行
while
循环- 测试日志文件是否已被修改,如果是
- 启动一个
zenity
信息消息窗口和一个相应的口头消息espeak
。 - 输入过程中允许有短暂的延迟(8 秒;您可以编辑脚本文件来更改延迟时间)。
- 启动一个
- 测试日志文件是否已被修改,如果是
您需要关闭zenity
窗口(可以使用“Enter”键)才能返回到xterm
您输入内容的窗口。
关闭xterm
窗口即可停止监控。
#!/bin/bash
# date editor comment
# 2018-12-31 sudodus version 1.0
version=1.0
name="${0##*/}"
if [ "$1" == "-h" ] || [ "$1" == "--help" ]
then
echo "'$name' is a wrapper, that sends a notification, when the wrapped program
has written to standard input and standard error and may be waiting for input.
---
Usage: $name [program name] [parameters]
Examples: $name # to run program(s) interactively in an xterm window
$name program
$name -h # to get help (this text)
$name -v # show version"
exit
elif [ "$1" == "-v" ]
then
echo "$name version $version"
exit
fi
tstart=$(date '+%s')
echo "----- start $name at $(date '+%F %T') ----------------------------"
tmpstr="${1##*/}"
xtermlog=$(mktemp -u)
if [ $# -eq 0 ]
then
mess_zenity="Check, if the monitored program asks for input"
mess_espeak="${mess_zenity/program/, Program,}"
xterm -title "monitored by ${0##*/}" -fa default -fs 11 -bg '#2c2b2a' \
-l -lf "$xtermlog" -sb -rightbar 2> /dev/null & pid=$!
else
mess_espeak="Check if '${tmpstr^} ${2##*/} ${3##*/} ...' asks for input"
mess_zenity="Check if '$tmpstr $2 $3 ...' asks for input"
xterm -title "${1##*/} $2 $3 ..." -fa default -fs 11 -bg '#2c2b2a' \
-l -lf "$xtermlog" -e "$@" 2> /dev/null & pid=$!
fi
sleep 0.5
sync
cnt1=$(stat --printf "%Y" "$xtermlog")
tail -f "$xtermlog" & ptail=$!
cont=true
while $cont
do
sleep 1
cnt0=$cnt1
tmpstr=$(ps -Af |sed "s/grep $pid//"|grep "$pid")
# echo "$tmpstr"
if [ "$tmpstr" != "" ]
then
cnt1=$(stat --printf "%Y" "$xtermlog")
if [ $cnt1 -gt $((cnt0 + 8)) ]
then
# zenity --notification --text="$message" 2> /dev/null
espeak "$mess_espeak" &
zenity --info --title="${0##*/} ${1##*/} $2 ..." \
--text="$mess_zenity" --width=500 2> /dev/null
touch "$xtermlog"
cnt1=$(stat --printf "%Y" "$xtermlog")
fi
sleep 1
else
sleep .2
# echo "process $pid has finished"
cont=false
fi
done
# clean up
tmpstr="$(tail -n1 "$xtermlog" | sed 's/.*exit.*/exit/')"
if [ "$tmpstr" != "exit" ]
then
echo ""
fi
rm -r "$xtermlog"
kill $ptail
tend=$(date '+%s')
tuse=$((tend-tstart))
echo "------- end $name at $(date '+%F %T') --- used $tuse seconds"
3. 通过以下方式远程监控 Ubuntu Serverssh
除非 GUI 工具通过终端窗口和 ssh 运行,否则可能会为 Ubuntu Server 制作一个以文本模式运行的特殊版本。
我检查了一下,这些工具通过文本模式连接与ssh
具有图形桌面环境的计算机一起与服务器一起工作。
- 以下屏幕截图说明了如何
vialog
在客户端(装有 Ubuntu 持久直播的笔记本电脑)中启动。 - 然后
ssh
连接到服务器并执行一些耗时的任务(这里通过复制几个大的 iso 文件来说明)。 - 当命令需要我在此过程中做出决定(覆盖还是不覆盖)时,需要花费足够的时间来复制 Ubuntu Studio iso 文件以激活警报。