Разбудите меня, когда [медленный] процесс командной строки требует моего внимания?

Иногда я использую программы командной строки, которые требуют ввода через довольно долгое время, и это помогает выполнять свою работу, если есть предупреждение, звуковое сообщение и / или информационное окно поверх текущих окон на рабочем столе. Я имею в виду графическое окружение рабочего стола или оконный менеджер. Для Ubuntu Server может быть создана специальная версия, которая работает в текстовом режиме, если инструмент GUI не работает через окно терминала и через ssh,

Если я создал свою собственную программу или это небольшой сценарий, я могу изменить его для создания предупреждения, но многие программы поставляются без исходного кода, или с ним довольно сложно связываться. Поэтому было бы неплохо иметь в системе Ubuntu инструмент, который может отслеживать большинство скомпилированных программ, а также скрипты и разбудить меня, когда [медленный] процесс командной строки требует моего внимания.

  • Когда что-то написано, это означает, что программа ожидает ввода или завершила работу, и результат готов для использования.

  • Итак, как я могу найти или создать инструмент, который отслеживает активность в окне терминала и выдает предупреждение, когда что-то пишется?

1 ответ

Мониторинг диалога программы и отправка оповещения

Вы можете отслеживать активность

  1. FIFO с использованием шеллскрипта viafifo или же
  2. xterm файл журнала с использованием шеллскрипта vialog

и пусть это начнется zenity информационное сообщение, когда есть вход из контролируемой программы. Если вы хотите, вы также можете установить espeak и пусть он отправит аудио сообщение.

1. Начните zenity информационное сообщение, когда есть вход из отслеживаемой программы с использованием fifo с помощью viafifo,

Следующий шеллскрипт может контролировать вывод диалога из программы и отправлять оповещения. Нужно espeak а также script (а также script не нужно устанавливать в Ubuntu).

sudo apt update
sudo apt install espeak
  • предполагая графическое окружение рабочего стола
  • запустить шеллскрипт в окне терминала, давайте назовем его viafifo,
  • запуск программы для мониторинга "в viafifo '
  • запуск диалога в окне терминала (именно там вы пишете свои данные)
  • использование fifo для получения доступа к выводу контролируемой программы, /dev/stdin, /dev/stdout а также dev/stderr, Основная задача в шеллскрипте - строка с программой 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,

Следующий шеллскрипт может контролировать диалог с программой и отправлять оповещения. Нужно espeak а также xterm,

sudo apt update
sudo apt install espeak xterm
  • предполагая графическое окружение рабочего стола
  • запустить скрипт в окне терминала, которое используется как "консоль" для 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

Для Ubuntu Server может быть создана специальная версия, которая работает в текстовом режиме, если инструмент GUI не работает через окно терминала и через ssh.

Я проверил, и эти инструменты работают с сервером через подключение в текстовом режиме через ssh на компьютер с графическим окружением рабочего стола.

  • На следующем снимке экрана показано, как vialog запускается в клиенте (ноутбук с Ubuntu постоянно работает).
  • затем ssh подключается к серверу и выполняет некоторую трудоемкую задачу (здесь показано копирование нескольких больших iso-файлов.
  • Чтобы активировать предупреждение, нужно скопировать iso-файл Ubuntu Studio, когда команда хочет принять мое решение в середине процесса (перезаписать или нет).

Другие вопросы по тегам