Разбудите меня, когда [медленный] процесс командной строки требует моего внимания?
Иногда я использую программы командной строки, которые требуют ввода через довольно долгое время, и это помогает выполнять свою работу, если есть предупреждение, звуковое сообщение и / или информационное окно поверх текущих окон на рабочем столе. Я имею в виду графическое окружение рабочего стола или оконный менеджер. Для Ubuntu Server может быть создана специальная версия, которая работает в текстовом режиме, если инструмент GUI не работает через окно терминала и через ssh
,
Если я создал свою собственную программу или это небольшой сценарий, я могу изменить его для создания предупреждения, но многие программы поставляются без исходного кода, или с ним довольно сложно связываться. Поэтому было бы неплохо иметь в системе Ubuntu инструмент, который может отслеживать большинство скомпилированных программ, а также скрипты и разбудить меня, когда [медленный] процесс командной строки требует моего внимания.
Когда что-то написано, это означает, что программа ожидает ввода или завершила работу, и результат готов для использования.
Итак, как я могу найти или создать инструмент, который отслеживает активность в окне терминала и выдает предупреждение, когда что-то пишется?
1 ответ
Мониторинг диалога программы и отправка оповещения
Вы можете отслеживать активность
- FIFO с использованием шеллскрипта
viafifo
или же -
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 секунд; вы можете отредактировать файл скрипта, чтобы изменить время задержки).
- начиная
- тестирование, если fifo был изменен и в этом случае
Вы должны закрыть 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, когда команда хочет принять мое решение в середине процесса (перезаписать или нет).