AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1106774
Accepted
sudodus
sudodus
Asked: 2019-01-04 16:27:39 +0800 CST2019-01-04 16:27:39 +0800 CST 2019-01-04 16:27:39 +0800 CST

当一个 [缓慢的] 命令行进程需要我注意时叫醒我?

  • 772

有时我使用命令行程序,它需要在相当长的时间后输入,如果桌面上当前窗口顶部有警报、音频消息和/或信息窗口,它有助于完成他们的工作。我正在考虑图形桌面环境或窗口管理器。除非 GUI 工具通过终端窗口和通过ssh.

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

  • 写东西时,表明程序正在等待输入或已完成,结果可供我使用。

  • 那么如何找到或制作一个工具来监视终端窗口中的活动并在编写某些内容时产生警报?

bash monitoring
  • 1 1 个回答
  • 520 Views

1 个回答

  • Voted
  1. Best Answer
    sudodus
    2019-01-04T17:19:54+08:002019-01-04T17:19:54+08:00

    监视程序的对话并发送警报

    您可以监控的活动

    1. 使用 shellscript的fifoviafifo或
    2. 使用 shellscript的xterm日志文件vialog

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

    1.zenity当使用 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 秒;您可以编辑脚本文件以更改延迟时间)。

    您应该关闭zenity窗口(可以使用“Enter”)以返回到xterm您输入输入的窗口。

    键入exit离开script和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"
    

    在此处输入图像描述

    在此处输入图像描述

    在此处输入图像描述

    2. 启动zenity信息消息,当xterm使用vialog.

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

    sudo apt update
    sudo apt install espeak xterm
    
    • 假设图形桌面环境
    • 在终端窗口中启动一个 shellscript,它的使用就像一个“控制台”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 Server 通过远程监控ssh

    除非 GUI 工具通过终端窗口和 ssh 工作,否则可能会为在文本模式下工作的 Ubuntu Server 制作一个特殊版本。

    我检查了,这些工具通过文本模式连接ssh到具有图形桌面环境的计算机与服务器一起使用。

    • 以下屏幕截图说明了如何vialog在客户端(具有 Ubuntu 持久直播的笔记本电脑)中启动。
    • 然后ssh连接到服务器并执行一些耗时的任务(这里通过复制几个大的 iso 文件来说明。
    • 当命令需要我在过程中间做出决定(覆盖与否)时,复制 Ubuntu Studio iso 文件以激活警报需要足够的时间。

    在此处输入图像描述

    • 2

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve