监控程序对话并发送警报

监控程序对话并发送警报

有时我会使用命令行程序,这些程序需要很长时间才能输入,如果在桌面上当前窗口的顶部有警报、音频消息和/或信息窗口,则有助于完成工作。我正在考虑图形桌面环境或窗口管理器。除非 GUI 工具通过终端窗口和通过 工作,否则可能会为 Ubuntu Server 制作一个特殊版本,该版本在文本模式下工作ssh

如果我制作了自己的程序或者它是一个小的 shellscript,我可以修改它来生成警报,但许多程序都没有提供源代码,或者很难弄乱它。因此,如果 Ubuntu 系统中有一个工具,可以监视大多数编译程序以及脚本,并在 [缓慢的] 命令行进程需要我的注意时唤醒我,那就太好了。

  • 当某些内容被写入时,它表示程序正在等待输入或已完成并且结果已可供我使用。

  • 那么,如何找到或制作一个工具来监视终端窗口中的活动,并在写入内容时发出警报?

答案1

监控程序对话并发送警报

您可以监控

  1. A先进先出使用 shellscriptviafifo或者
  2. 一个xterm日志档案使用 shellscriptvialog

并让它开始zenity信息消息,当有来自受监控程序的输入时。如果您愿意,您还可以安装espeak并让它发送音频消息

zenity1.当使用 fifo 的监控程序有输入时,启动信息消息viafifo

以下 shellscript 可以监视程序的输出对话框并发送警报。它需要espeakscriptscript在 Ubuntu 中不需要安装)。

sudo apt update
sudo apt install espeak
  • 假设有一个图形桌面环境
  • 在终端窗口中启动一个 shellscript,我们将其称为viafifo
  • 启动要监控的程序‘in viafifo
  • 在终端窗口中运行对话框(这是您输入内容的地方)
  • 使用 fifo 来访问要监视的程序的输出,/dev/stdin/dev/stdoutdev/stderrshellscript 中的主要任务是使用程序script,即监视终端窗口中的活动并写入fifo。
  • 运行while循环
    • 测试 fifo 是否已被修改,如果是的话
      • 启动一个zenity信息消息窗口和一个相应的口头消息espeak
      • 输入过程中允许有短暂的延迟(8 秒;您可以编辑脚本文件来更改延迟时间)。

您需要关闭zenity窗口(可以使用“Enter”键)才能返回到xterm您输入内容的窗口。

键入exitleavescriptviafifo。之后,您可以获得包含整个对话的日志文件。

#!/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"

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

zenity2.当使用 将某些内容写入窗口xterm(来自受监控的程序或用户)时,启动信息消息vialog

以下 shellscript 可以监视与程序的对话并发送警报。它需要espeakxterm

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 文件以激活警报。

在此处输入图片描述

相关内容