Вы можете отслеживать активность
xterm
, теперь с интерактивным режимом и запускатьzenity
информационное сообщение при вводе данных из контролируемой программы. Если вы хотите, вы также можете установитьespeak
и позволить ему отправлять звуковое сообщение .
zenity
при вводе данных из контролируемой программы с использованием FIFO. Следующий сценарий оболочки может отслеживать диалог вывода из программы и отправлять предупреждение.
wrapper
xterm
xterm
(, где вы вводите ввод)/dev/stdout
и dev/stderr
. while
zenity
информационного сообщения. Ожидается, что вы закроете окно zenity
, (можете работать с 'Enter' ), чтобы вернуться в окно xterm
, где вы вводите свой ввод.
#!/bin/bash
if [ $# -eq 0 ]
then
echo "'$0' 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: $0 [parameters]
Example: $0.program"
exit
fi
message="'${1##*/} $2...' has written something, maybe asks for input"
tmpdir=$(mktemp -d)
tmpfifo=$(mktemp --tmpdir=$tmpdir)
rm "$tmpfifo"
mkfifo "$tmpfifo"
#ls -l "$tmpdir"
cnt1=$(stat --printf "%Y" "$tmpfifo")
sleep 1
xterm -title "${1##*/} $2..." -fa default -fs 11 -bg '#403600' \
-e bash -c "$* 2>&1 | tee /dev/stderr 2>&1 > $tmpfifo" 2> /dev/null & pid=$!
#< "$tmpfifo" espeak &
< "$tmpfifo" cat &
cont=true
while $cont
do
tmpstr=$(ps -Af |sed "s/grep $pid//"|grep "$pid")
# echo "$tmpstr"
if [ "$tmpstr" != "" ]
then
cnt0=$cnt1
cnt1=$(stat --printf "%Y" "$tmpfifo")
if [ "$cnt1" != "$cnt0" ]
then
# zenity --notification --text="$message" 2> /dev/null
# espeak "$message" &
zenity --info --title="${0##*/} ${1##*/} $2..." \
--text="$message" --width=500 2> /dev/null
fi
sleep 1
else
sleep.2
# echo "process $pid has finished"
cont=false
fi
done
# clean up
rm -r "$tmpdir"
Вы также можете запустить espeak
рядом с zenity
, чтобы получить звуковое сообщение. В этом случае вы можете удалить символ #
в начале этой строки. (В программе может быть много текста, поэтому обычно не рекомендуется перенаправлять fifo на espeak
. Лучше перенаправить файл fifo на cat
и распечатать его в «консоли».)
Вы можете протестировать некоторые командные строки с помощью cp -i
и mv -i
и вы можете протестировать с помощью следующего небольшого сценария оболочки program
,
#!/bin/bash
while true
do
read -p "Waiting for input. 'Stop' to Quit " string
if [ "${string:0:4}" == "Stop" ]
then
printf "$string. Gotcha\n"
break
elif [ "$string" != "" ]
then
printf "$string\n"
printf "Working for 10 seconds...\n"
sleep 10
else
sleep 3
fi
done
Текст справки:
$./wrapper
'./wrapper' 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: ./wrapper [parameters]
Example:./wrapper.program
Мониторингprogram
:
$./wrapper./program
zenity
окно информационного сообщения:
Диалог в окне xterm
:
Waiting for input. 'Stop' to Quit Hello
Hello
Working for 10 seconds...
Waiting for input. 'Stop' to Quit World
World
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Goodbye
Goodbye
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Stop
Вывод «Консоли» в исходном окне терминала после завершения:
$./wrapper./program
Waiting for input. 'Stop' to Quit Hello
Working for 10 seconds...
Waiting for input. 'Stop' to Quit World
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Goodbye
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Stop. Gotcha
Мониторингcp -ip
:
$ LANG=C /path/wrapper cp -ip ubuntustudio-18.04-dvd-amd64.iso ubuntu-18.04.1-desktop-amd64.iso /tmp
zenity
окно информационного сообщения:
Диалог вxterm
:
cp: overwrite '/tmp/ubuntustudio-18.04-dvd-amd64.iso'? y
cp: overwrite '/tmp/ubuntu-18.04.1-desktop-amd64.iso'? n
Мониторингsudo parted /dev/sdc
:
$ LANG=C./wrapper sudo parted /dev/sdc
Диалог вxterm
:
[sudo] password for sudodus:
GNU Parted 3.2
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: SanDisk Extreme (scsi)
Disk /dev/sdc: 16,0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
3 2097kB 258MB 256MB primary fat32 boot
4 258MB 1366MB 1108MB primary
2 1366MB 12,4GB 11,0GB extended lba
5 1367MB 6736MB 5369MB logical ext2
6 6737MB 12,4GB 5615MB logical ext4
1 12,4GB 16,0GB 3662MB primary ntfs
(parted) q
zenity
информационное сообщение, когда что-то записывается в xterm
окно (из контролируемой программы или от пользователя ). Следующий сценарий оболочки может отслеживать диалог с программой и отправлять предупреждения.
wrapper
xterm
xterm
(, где вы вводите данные)xterm
для доступа к выходным данным и входным данным отслеживаемой программы while
zenity
. Ожидается, что вы закроете окно zenity
, (можете работать с 'Enter' ), чтобы вернуться в окно xterm
, где вы вводите свой ввод.
Теперь есть интерактивный режим, в котором вы используете окно 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"
Сохраните этот bash
код в файл и дайте ему [например] имя vialog
, сделайте его исполняемым и, возможно, переместите его в каталог по вашему пути.
$ vialog
----- start vialog at 2018-12-31 14:37:41 ----------------------------
Вы работаете в окне xterm
, и диалог также отображается в стартовом окне.
sudodus@bionic64 /media/multimed-2/test/test0/pomsky-wrap $./program
Waiting for input. 'Stop' to Quit Hello World
Hello World
Working for 10 seconds...
Waiting for input. 'Stop' to Quit I am writing...
I am writing...
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Stop
Stop. Gotcha
sudodus@bionic64 /media/multimed-2/test/test0/pomsky-wrap $ scrot -sb
sudodus@bionic64 /media/multimed-2/test/test0/pomsky-wrap $ exit
exit
------- end vialog at 2018-12-31 14:39:02 --- used 81 seconds