Send a notification or alert when bash asks for input from user
I am using Ubuntu 16.04 LTS. There is an alias in my .bashrc
which uses notify-send
:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '''s/^s*[0-9]+s*//;s/[;&|]s*alert$//''')"'
I can append alert
to other commands as somecommand; alert
or somecommand && alert
and get get a pop-up notification after somecommand
finishes (successfully). It reminds me that the command I ran in a Terminal window which is now minimised or in a different workspace has finished executing.
But I want a similar alert when it waits for an input from the user instead of completion (e.g. Yes/No prompt). How can I do that?
Analogous solution using notify-send
would be great, but other relatively simple alternative would also be fine.
In case there's a confusion, I'm not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal windows while running commands with lengthy output which may ask for user-input (e.g. apt update && apt upgrade
).
bash shell prompt notify-send
add a comment |
I am using Ubuntu 16.04 LTS. There is an alias in my .bashrc
which uses notify-send
:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '''s/^s*[0-9]+s*//;s/[;&|]s*alert$//''')"'
I can append alert
to other commands as somecommand; alert
or somecommand && alert
and get get a pop-up notification after somecommand
finishes (successfully). It reminds me that the command I ran in a Terminal window which is now minimised or in a different workspace has finished executing.
But I want a similar alert when it waits for an input from the user instead of completion (e.g. Yes/No prompt). How can I do that?
Analogous solution using notify-send
would be great, but other relatively simple alternative would also be fine.
In case there's a confusion, I'm not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal windows while running commands with lengthy output which may ask for user-input (e.g. apt update && apt upgrade
).
bash shell prompt notify-send
Why not send the alert just before theread
command?
– RudiC
Dec 27 '18 at 14:06
@RudiC Could you please expand your comment (to an answer perhaps, I'm not good at bash scripting)? In case there's a confusion, I'm not not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal window while running commands with lengthy output which may ask for user-input (e.g.apt update && apt upgrade
).
– pomsky
Dec 27 '18 at 16:18
Sounds like you DON'T have access to the scripts / commands, so CAN'T modify them, and want to be informed whenever any waits inside for a user interaction?
– RudiC
Dec 27 '18 at 16:29
@RudiC Exactly! Is that impossible to achieve?
– pomsky
Dec 27 '18 at 16:31
Can't tell from the top of my head. No simple approach...
– RudiC
Dec 27 '18 at 16:41
add a comment |
I am using Ubuntu 16.04 LTS. There is an alias in my .bashrc
which uses notify-send
:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '''s/^s*[0-9]+s*//;s/[;&|]s*alert$//''')"'
I can append alert
to other commands as somecommand; alert
or somecommand && alert
and get get a pop-up notification after somecommand
finishes (successfully). It reminds me that the command I ran in a Terminal window which is now minimised or in a different workspace has finished executing.
But I want a similar alert when it waits for an input from the user instead of completion (e.g. Yes/No prompt). How can I do that?
Analogous solution using notify-send
would be great, but other relatively simple alternative would also be fine.
In case there's a confusion, I'm not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal windows while running commands with lengthy output which may ask for user-input (e.g. apt update && apt upgrade
).
bash shell prompt notify-send
I am using Ubuntu 16.04 LTS. There is an alias in my .bashrc
which uses notify-send
:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '''s/^s*[0-9]+s*//;s/[;&|]s*alert$//''')"'
I can append alert
to other commands as somecommand; alert
or somecommand && alert
and get get a pop-up notification after somecommand
finishes (successfully). It reminds me that the command I ran in a Terminal window which is now minimised or in a different workspace has finished executing.
But I want a similar alert when it waits for an input from the user instead of completion (e.g. Yes/No prompt). How can I do that?
Analogous solution using notify-send
would be great, but other relatively simple alternative would also be fine.
In case there's a confusion, I'm not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal windows while running commands with lengthy output which may ask for user-input (e.g. apt update && apt upgrade
).
bash shell prompt notify-send
bash shell prompt notify-send
edited Dec 27 '18 at 16:33
pomsky
asked Dec 27 '18 at 13:01
pomskypomsky
423212
423212
Why not send the alert just before theread
command?
– RudiC
Dec 27 '18 at 14:06
@RudiC Could you please expand your comment (to an answer perhaps, I'm not good at bash scripting)? In case there's a confusion, I'm not not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal window while running commands with lengthy output which may ask for user-input (e.g.apt update && apt upgrade
).
– pomsky
Dec 27 '18 at 16:18
Sounds like you DON'T have access to the scripts / commands, so CAN'T modify them, and want to be informed whenever any waits inside for a user interaction?
– RudiC
Dec 27 '18 at 16:29
@RudiC Exactly! Is that impossible to achieve?
– pomsky
Dec 27 '18 at 16:31
Can't tell from the top of my head. No simple approach...
– RudiC
Dec 27 '18 at 16:41
add a comment |
Why not send the alert just before theread
command?
– RudiC
Dec 27 '18 at 14:06
@RudiC Could you please expand your comment (to an answer perhaps, I'm not good at bash scripting)? In case there's a confusion, I'm not not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal window while running commands with lengthy output which may ask for user-input (e.g.apt update && apt upgrade
).
– pomsky
Dec 27 '18 at 16:18
Sounds like you DON'T have access to the scripts / commands, so CAN'T modify them, and want to be informed whenever any waits inside for a user interaction?
– RudiC
Dec 27 '18 at 16:29
@RudiC Exactly! Is that impossible to achieve?
– pomsky
Dec 27 '18 at 16:31
Can't tell from the top of my head. No simple approach...
– RudiC
Dec 27 '18 at 16:41
Why not send the alert just before the
read
command?– RudiC
Dec 27 '18 at 14:06
Why not send the alert just before the
read
command?– RudiC
Dec 27 '18 at 14:06
@RudiC Could you please expand your comment (to an answer perhaps, I'm not good at bash scripting)? In case there's a confusion, I'm not not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal window while running commands with lengthy output which may ask for user-input (e.g.
apt update && apt upgrade
).– pomsky
Dec 27 '18 at 16:18
@RudiC Could you please expand your comment (to an answer perhaps, I'm not good at bash scripting)? In case there's a confusion, I'm not not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal window while running commands with lengthy output which may ask for user-input (e.g.
apt update && apt upgrade
).– pomsky
Dec 27 '18 at 16:18
Sounds like you DON'T have access to the scripts / commands, so CAN'T modify them, and want to be informed whenever any waits inside for a user interaction?
– RudiC
Dec 27 '18 at 16:29
Sounds like you DON'T have access to the scripts / commands, so CAN'T modify them, and want to be informed whenever any waits inside for a user interaction?
– RudiC
Dec 27 '18 at 16:29
@RudiC Exactly! Is that impossible to achieve?
– pomsky
Dec 27 '18 at 16:31
@RudiC Exactly! Is that impossible to achieve?
– pomsky
Dec 27 '18 at 16:31
Can't tell from the top of my head. No simple approach...
– RudiC
Dec 27 '18 at 16:41
Can't tell from the top of my head. No simple approach...
– RudiC
Dec 27 '18 at 16:41
add a comment |
2 Answers
2
active
oldest
votes
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file, now with an interactive mode
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
1. Start a zenity
info message, when there is input from a monitored program using a fifo.
The following shellscript can monitor the output dialogue from a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdout
anddev/stderr
. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window.
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
#!/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 <program name> [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"
You may wish to run espeak
near zenity
to get an audio message too. In that case you can remove the #
character in the beginning of that line. (There may be a lot of text from the program, so it is usually a bad idea to redirect the fifo to espeak
. It is better to redirect the fifo to cat
and have it printed in the 'console'.)
Demo
You can test some command lines with cp -i
and mv -i
and you can test with the following little shellscript program
,
#!/bin/bash
while true
do
read -p "Waiting for input. 'Stop' to Quit " string
if [ "${string:0:4}" == "Stop" ]
then
printf "$string. Gotchan"
break
elif [ "$string" != "" ]
then
printf "$stringn"
printf "Working for 10 seconds ...n"
sleep 10
else
sleep 3
fi
done
Help text:
$ ./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 <program name> [parameters]
Example: ./wrapper .program
Monitoring program
:
$ ./wrapper ./program
zenity
info message window:
Dialogue in the xterm
window:
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
'Console' output in the original terminal window after finishing:
$ ./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
Monitoring cp -ip
:
$ LANG=C /path/wrapper cp -ip ubuntustudio-18.04-dvd-amd64.iso ubuntu-18.04.1-desktop-amd64.iso /tmp
zenity
info message window:
Dialogue in xterm
:
cp: overwrite '/tmp/ubuntustudio-18.04-dvd-amd64.iso'? y
cp: overwrite '/tmp/ubuntu-18.04.1-desktop-amd64.iso'? n
Monitoring sudo parted /dev/sdc
:
$ LANG=C ./wrapper sudo parted /dev/sdc
Dialogue in 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
2. Start a zenity
info message, when something is written to an xterm
window (from the monitored program or from the user).
The following shellscript can monitor the dialogue with a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a log file of
xterm
to get access to the output from and input to the program to be monitored - running a
while
loop
- testing if the log file has been modified and in that case
- starting a
zenity
info message window. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the log file has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Now there is an interactive mode, where you use the xterm
window just as you use any terminal window. Close the xterm
window to stop monitoring.
#!/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"
Save thís bash
code to a file and give it [for example] the name vialog
, make it executable and maybe move it to a directory in your path.
$ vialog
----- start vialog at 2018-12-31 14:37:41 ----------------------------
You work in the xterm
window and the dialogue is echoed to the starting window too.
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
@pomsky, I enjoy working on solutions to your problem. Please let me know if any of the edited shellscripts can do what you want, and if not, what it should do (how to improve it).
– sudodus
Dec 31 '18 at 14:25
See also this link Wake me up when a slow command line process wants my attention?
– sudodus
Jan 4 at 2:40
@pomsky, I'm glad these methods are useful for you :-) Have a look also at the fifo method using the compiled programscript
in my thread at AskUbuntu (linked in my previous comment). Please tell me which of the methods, that works best for you, so that I can focus on that method.
– sudodus
Jan 4 at 15:11
add a comment |
Invitation to feedback
Instead of adding another shellscript to my already existing answer, I think it is better with a second answer. I will listen to feedback and focus on the preferred script/method and try to merge what is preferred into one answer (unless there are reasons to keep them all (for different purposes).
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
This answer focuses on a second alternative using a fifo.
Start a zenity
info message, when there is input from a monitored program using a fifo.
1.1 Using xterm
, monitoring standard output and standard error via a fifo
This wrapper
method has the
advantage, that no direct input will trigger the alert. This works well with many programs, for examplecp -i
andsudo
.
disadvantage, that
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
sftp
will lose the prompt, and the user cannot know, when the program is ready for a new task. - some programs echo the input (there is indirect input), and this will trigger the alert, which may cause a lot of alerts in a shellscript, that does not take that into account. Example:
ssh
.
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
1.2 Using the compiled program script
and its log file via a fifo
The following shellscript can monitor the output dialogue from a program and send an alert. It needs espeak
and script
(script
need not be installed in Ubuntu and Debian).
sudo apt update
sudo apt install espeak
- assuming a graphical desktop environment
- start a shellscript in a terminal window, let us call it
viafifo
. - starting the program to be monitored 'in
viafifo
'
running the dialogue in the terminal window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdin
,/dev/stdout
anddev/stderr
. The main task in the shellscript is the line with the programscript
, that is monitoring the activity in the terminal window and writing to the fifo. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window and a correspoding spoken message withespeak
. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Type exit
to leave script
and viafifo
. After that you can get a log file with the whole dialogue.
viafifo
is tested with
Ubuntu 18.04.1 LTS. <--- You find the bash code ofviafifo
in this link.
Debian 9.6.0, 'Stretch'. See the following screenshots and printout oftime viafifo
andviafifo.log
.
Demo example
Screenshots
time viafifo
user@debian:~$ time viafifo
----- Start viafifo ------------------------------------------------------------
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
----- End viafifo --------------------------------------------------------------
See 'viafifo.log'
viafifo used 8 seconds plus a few (5-10) seconds for preparing and finishing
real 0m13.295s
user 0m0.104s
sys 0m0.012s
viafifo.log
user@debian:~$ cat viafifo.log
Script started on Sat 05 Jan 2019 07:57:45 PM UTC
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
viafifo used 8 seconds
user@debian:~$
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f491121%2fsend-a-notification-or-alert-when-bash-asks-for-input-from-user%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file, now with an interactive mode
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
1. Start a zenity
info message, when there is input from a monitored program using a fifo.
The following shellscript can monitor the output dialogue from a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdout
anddev/stderr
. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window.
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
#!/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 <program name> [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"
You may wish to run espeak
near zenity
to get an audio message too. In that case you can remove the #
character in the beginning of that line. (There may be a lot of text from the program, so it is usually a bad idea to redirect the fifo to espeak
. It is better to redirect the fifo to cat
and have it printed in the 'console'.)
Demo
You can test some command lines with cp -i
and mv -i
and you can test with the following little shellscript program
,
#!/bin/bash
while true
do
read -p "Waiting for input. 'Stop' to Quit " string
if [ "${string:0:4}" == "Stop" ]
then
printf "$string. Gotchan"
break
elif [ "$string" != "" ]
then
printf "$stringn"
printf "Working for 10 seconds ...n"
sleep 10
else
sleep 3
fi
done
Help text:
$ ./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 <program name> [parameters]
Example: ./wrapper .program
Monitoring program
:
$ ./wrapper ./program
zenity
info message window:
Dialogue in the xterm
window:
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
'Console' output in the original terminal window after finishing:
$ ./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
Monitoring cp -ip
:
$ LANG=C /path/wrapper cp -ip ubuntustudio-18.04-dvd-amd64.iso ubuntu-18.04.1-desktop-amd64.iso /tmp
zenity
info message window:
Dialogue in xterm
:
cp: overwrite '/tmp/ubuntustudio-18.04-dvd-amd64.iso'? y
cp: overwrite '/tmp/ubuntu-18.04.1-desktop-amd64.iso'? n
Monitoring sudo parted /dev/sdc
:
$ LANG=C ./wrapper sudo parted /dev/sdc
Dialogue in 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
2. Start a zenity
info message, when something is written to an xterm
window (from the monitored program or from the user).
The following shellscript can monitor the dialogue with a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a log file of
xterm
to get access to the output from and input to the program to be monitored - running a
while
loop
- testing if the log file has been modified and in that case
- starting a
zenity
info message window. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the log file has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Now there is an interactive mode, where you use the xterm
window just as you use any terminal window. Close the xterm
window to stop monitoring.
#!/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"
Save thís bash
code to a file and give it [for example] the name vialog
, make it executable and maybe move it to a directory in your path.
$ vialog
----- start vialog at 2018-12-31 14:37:41 ----------------------------
You work in the xterm
window and the dialogue is echoed to the starting window too.
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
@pomsky, I enjoy working on solutions to your problem. Please let me know if any of the edited shellscripts can do what you want, and if not, what it should do (how to improve it).
– sudodus
Dec 31 '18 at 14:25
See also this link Wake me up when a slow command line process wants my attention?
– sudodus
Jan 4 at 2:40
@pomsky, I'm glad these methods are useful for you :-) Have a look also at the fifo method using the compiled programscript
in my thread at AskUbuntu (linked in my previous comment). Please tell me which of the methods, that works best for you, so that I can focus on that method.
– sudodus
Jan 4 at 15:11
add a comment |
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file, now with an interactive mode
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
1. Start a zenity
info message, when there is input from a monitored program using a fifo.
The following shellscript can monitor the output dialogue from a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdout
anddev/stderr
. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window.
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
#!/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 <program name> [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"
You may wish to run espeak
near zenity
to get an audio message too. In that case you can remove the #
character in the beginning of that line. (There may be a lot of text from the program, so it is usually a bad idea to redirect the fifo to espeak
. It is better to redirect the fifo to cat
and have it printed in the 'console'.)
Demo
You can test some command lines with cp -i
and mv -i
and you can test with the following little shellscript program
,
#!/bin/bash
while true
do
read -p "Waiting for input. 'Stop' to Quit " string
if [ "${string:0:4}" == "Stop" ]
then
printf "$string. Gotchan"
break
elif [ "$string" != "" ]
then
printf "$stringn"
printf "Working for 10 seconds ...n"
sleep 10
else
sleep 3
fi
done
Help text:
$ ./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 <program name> [parameters]
Example: ./wrapper .program
Monitoring program
:
$ ./wrapper ./program
zenity
info message window:
Dialogue in the xterm
window:
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
'Console' output in the original terminal window after finishing:
$ ./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
Monitoring cp -ip
:
$ LANG=C /path/wrapper cp -ip ubuntustudio-18.04-dvd-amd64.iso ubuntu-18.04.1-desktop-amd64.iso /tmp
zenity
info message window:
Dialogue in xterm
:
cp: overwrite '/tmp/ubuntustudio-18.04-dvd-amd64.iso'? y
cp: overwrite '/tmp/ubuntu-18.04.1-desktop-amd64.iso'? n
Monitoring sudo parted /dev/sdc
:
$ LANG=C ./wrapper sudo parted /dev/sdc
Dialogue in 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
2. Start a zenity
info message, when something is written to an xterm
window (from the monitored program or from the user).
The following shellscript can monitor the dialogue with a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a log file of
xterm
to get access to the output from and input to the program to be monitored - running a
while
loop
- testing if the log file has been modified and in that case
- starting a
zenity
info message window. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the log file has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Now there is an interactive mode, where you use the xterm
window just as you use any terminal window. Close the xterm
window to stop monitoring.
#!/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"
Save thís bash
code to a file and give it [for example] the name vialog
, make it executable and maybe move it to a directory in your path.
$ vialog
----- start vialog at 2018-12-31 14:37:41 ----------------------------
You work in the xterm
window and the dialogue is echoed to the starting window too.
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
@pomsky, I enjoy working on solutions to your problem. Please let me know if any of the edited shellscripts can do what you want, and if not, what it should do (how to improve it).
– sudodus
Dec 31 '18 at 14:25
See also this link Wake me up when a slow command line process wants my attention?
– sudodus
Jan 4 at 2:40
@pomsky, I'm glad these methods are useful for you :-) Have a look also at the fifo method using the compiled programscript
in my thread at AskUbuntu (linked in my previous comment). Please tell me which of the methods, that works best for you, so that I can focus on that method.
– sudodus
Jan 4 at 15:11
add a comment |
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file, now with an interactive mode
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
1. Start a zenity
info message, when there is input from a monitored program using a fifo.
The following shellscript can monitor the output dialogue from a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdout
anddev/stderr
. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window.
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
#!/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 <program name> [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"
You may wish to run espeak
near zenity
to get an audio message too. In that case you can remove the #
character in the beginning of that line. (There may be a lot of text from the program, so it is usually a bad idea to redirect the fifo to espeak
. It is better to redirect the fifo to cat
and have it printed in the 'console'.)
Demo
You can test some command lines with cp -i
and mv -i
and you can test with the following little shellscript program
,
#!/bin/bash
while true
do
read -p "Waiting for input. 'Stop' to Quit " string
if [ "${string:0:4}" == "Stop" ]
then
printf "$string. Gotchan"
break
elif [ "$string" != "" ]
then
printf "$stringn"
printf "Working for 10 seconds ...n"
sleep 10
else
sleep 3
fi
done
Help text:
$ ./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 <program name> [parameters]
Example: ./wrapper .program
Monitoring program
:
$ ./wrapper ./program
zenity
info message window:
Dialogue in the xterm
window:
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
'Console' output in the original terminal window after finishing:
$ ./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
Monitoring cp -ip
:
$ LANG=C /path/wrapper cp -ip ubuntustudio-18.04-dvd-amd64.iso ubuntu-18.04.1-desktop-amd64.iso /tmp
zenity
info message window:
Dialogue in xterm
:
cp: overwrite '/tmp/ubuntustudio-18.04-dvd-amd64.iso'? y
cp: overwrite '/tmp/ubuntu-18.04.1-desktop-amd64.iso'? n
Monitoring sudo parted /dev/sdc
:
$ LANG=C ./wrapper sudo parted /dev/sdc
Dialogue in 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
2. Start a zenity
info message, when something is written to an xterm
window (from the monitored program or from the user).
The following shellscript can monitor the dialogue with a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a log file of
xterm
to get access to the output from and input to the program to be monitored - running a
while
loop
- testing if the log file has been modified and in that case
- starting a
zenity
info message window. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the log file has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Now there is an interactive mode, where you use the xterm
window just as you use any terminal window. Close the xterm
window to stop monitoring.
#!/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"
Save thís bash
code to a file and give it [for example] the name vialog
, make it executable and maybe move it to a directory in your path.
$ vialog
----- start vialog at 2018-12-31 14:37:41 ----------------------------
You work in the xterm
window and the dialogue is echoed to the starting window too.
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
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file, now with an interactive mode
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
1. Start a zenity
info message, when there is input from a monitored program using a fifo.
The following shellscript can monitor the output dialogue from a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdout
anddev/stderr
. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window.
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
#!/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 <program name> [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"
You may wish to run espeak
near zenity
to get an audio message too. In that case you can remove the #
character in the beginning of that line. (There may be a lot of text from the program, so it is usually a bad idea to redirect the fifo to espeak
. It is better to redirect the fifo to cat
and have it printed in the 'console'.)
Demo
You can test some command lines with cp -i
and mv -i
and you can test with the following little shellscript program
,
#!/bin/bash
while true
do
read -p "Waiting for input. 'Stop' to Quit " string
if [ "${string:0:4}" == "Stop" ]
then
printf "$string. Gotchan"
break
elif [ "$string" != "" ]
then
printf "$stringn"
printf "Working for 10 seconds ...n"
sleep 10
else
sleep 3
fi
done
Help text:
$ ./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 <program name> [parameters]
Example: ./wrapper .program
Monitoring program
:
$ ./wrapper ./program
zenity
info message window:
Dialogue in the xterm
window:
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
'Console' output in the original terminal window after finishing:
$ ./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
Monitoring cp -ip
:
$ LANG=C /path/wrapper cp -ip ubuntustudio-18.04-dvd-amd64.iso ubuntu-18.04.1-desktop-amd64.iso /tmp
zenity
info message window:
Dialogue in xterm
:
cp: overwrite '/tmp/ubuntustudio-18.04-dvd-amd64.iso'? y
cp: overwrite '/tmp/ubuntu-18.04.1-desktop-amd64.iso'? n
Monitoring sudo parted /dev/sdc
:
$ LANG=C ./wrapper sudo parted /dev/sdc
Dialogue in 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
2. Start a zenity
info message, when something is written to an xterm
window (from the monitored program or from the user).
The following shellscript can monitor the dialogue with a program and send an alert.
- assuming a graphical desktop environment
- start a wrapper shellscript in a terminal window, which is used like a 'console' for
wrapper
- starting the program to be monitored in an
xterm
window
running the dialogue in thexterm
window (that is where you write your input)- using a log file of
xterm
to get access to the output from and input to the program to be monitored - running a
while
loop
- testing if the log file has been modified and in that case
- starting a
zenity
info message window. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the log file has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Now there is an interactive mode, where you use the xterm
window just as you use any terminal window. Close the xterm
window to stop monitoring.
#!/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"
Save thís bash
code to a file and give it [for example] the name vialog
, make it executable and maybe move it to a directory in your path.
$ vialog
----- start vialog at 2018-12-31 14:37:41 ----------------------------
You work in the xterm
window and the dialogue is echoed to the starting window too.
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
edited Dec 31 '18 at 14:11
answered Dec 28 '18 at 5:57
sudodussudodus
1,14616
1,14616
@pomsky, I enjoy working on solutions to your problem. Please let me know if any of the edited shellscripts can do what you want, and if not, what it should do (how to improve it).
– sudodus
Dec 31 '18 at 14:25
See also this link Wake me up when a slow command line process wants my attention?
– sudodus
Jan 4 at 2:40
@pomsky, I'm glad these methods are useful for you :-) Have a look also at the fifo method using the compiled programscript
in my thread at AskUbuntu (linked in my previous comment). Please tell me which of the methods, that works best for you, so that I can focus on that method.
– sudodus
Jan 4 at 15:11
add a comment |
@pomsky, I enjoy working on solutions to your problem. Please let me know if any of the edited shellscripts can do what you want, and if not, what it should do (how to improve it).
– sudodus
Dec 31 '18 at 14:25
See also this link Wake me up when a slow command line process wants my attention?
– sudodus
Jan 4 at 2:40
@pomsky, I'm glad these methods are useful for you :-) Have a look also at the fifo method using the compiled programscript
in my thread at AskUbuntu (linked in my previous comment). Please tell me which of the methods, that works best for you, so that I can focus on that method.
– sudodus
Jan 4 at 15:11
@pomsky, I enjoy working on solutions to your problem. Please let me know if any of the edited shellscripts can do what you want, and if not, what it should do (how to improve it).
– sudodus
Dec 31 '18 at 14:25
@pomsky, I enjoy working on solutions to your problem. Please let me know if any of the edited shellscripts can do what you want, and if not, what it should do (how to improve it).
– sudodus
Dec 31 '18 at 14:25
See also this link Wake me up when a slow command line process wants my attention?
– sudodus
Jan 4 at 2:40
See also this link Wake me up when a slow command line process wants my attention?
– sudodus
Jan 4 at 2:40
@pomsky, I'm glad these methods are useful for you :-) Have a look also at the fifo method using the compiled program
script
in my thread at AskUbuntu (linked in my previous comment). Please tell me which of the methods, that works best for you, so that I can focus on that method.– sudodus
Jan 4 at 15:11
@pomsky, I'm glad these methods are useful for you :-) Have a look also at the fifo method using the compiled program
script
in my thread at AskUbuntu (linked in my previous comment). Please tell me which of the methods, that works best for you, so that I can focus on that method.– sudodus
Jan 4 at 15:11
add a comment |
Invitation to feedback
Instead of adding another shellscript to my already existing answer, I think it is better with a second answer. I will listen to feedback and focus on the preferred script/method and try to merge what is preferred into one answer (unless there are reasons to keep them all (for different purposes).
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
This answer focuses on a second alternative using a fifo.
Start a zenity
info message, when there is input from a monitored program using a fifo.
1.1 Using xterm
, monitoring standard output and standard error via a fifo
This wrapper
method has the
advantage, that no direct input will trigger the alert. This works well with many programs, for examplecp -i
andsudo
.
disadvantage, that
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
sftp
will lose the prompt, and the user cannot know, when the program is ready for a new task. - some programs echo the input (there is indirect input), and this will trigger the alert, which may cause a lot of alerts in a shellscript, that does not take that into account. Example:
ssh
.
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
1.2 Using the compiled program script
and its log file via a fifo
The following shellscript can monitor the output dialogue from a program and send an alert. It needs espeak
and script
(script
need not be installed in Ubuntu and Debian).
sudo apt update
sudo apt install espeak
- assuming a graphical desktop environment
- start a shellscript in a terminal window, let us call it
viafifo
. - starting the program to be monitored 'in
viafifo
'
running the dialogue in the terminal window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdin
,/dev/stdout
anddev/stderr
. The main task in the shellscript is the line with the programscript
, that is monitoring the activity in the terminal window and writing to the fifo. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window and a correspoding spoken message withespeak
. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Type exit
to leave script
and viafifo
. After that you can get a log file with the whole dialogue.
viafifo
is tested with
Ubuntu 18.04.1 LTS. <--- You find the bash code ofviafifo
in this link.
Debian 9.6.0, 'Stretch'. See the following screenshots and printout oftime viafifo
andviafifo.log
.
Demo example
Screenshots
time viafifo
user@debian:~$ time viafifo
----- Start viafifo ------------------------------------------------------------
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
----- End viafifo --------------------------------------------------------------
See 'viafifo.log'
viafifo used 8 seconds plus a few (5-10) seconds for preparing and finishing
real 0m13.295s
user 0m0.104s
sys 0m0.012s
viafifo.log
user@debian:~$ cat viafifo.log
Script started on Sat 05 Jan 2019 07:57:45 PM UTC
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
viafifo used 8 seconds
user@debian:~$
add a comment |
Invitation to feedback
Instead of adding another shellscript to my already existing answer, I think it is better with a second answer. I will listen to feedback and focus on the preferred script/method and try to merge what is preferred into one answer (unless there are reasons to keep them all (for different purposes).
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
This answer focuses on a second alternative using a fifo.
Start a zenity
info message, when there is input from a monitored program using a fifo.
1.1 Using xterm
, monitoring standard output and standard error via a fifo
This wrapper
method has the
advantage, that no direct input will trigger the alert. This works well with many programs, for examplecp -i
andsudo
.
disadvantage, that
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
sftp
will lose the prompt, and the user cannot know, when the program is ready for a new task. - some programs echo the input (there is indirect input), and this will trigger the alert, which may cause a lot of alerts in a shellscript, that does not take that into account. Example:
ssh
.
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
1.2 Using the compiled program script
and its log file via a fifo
The following shellscript can monitor the output dialogue from a program and send an alert. It needs espeak
and script
(script
need not be installed in Ubuntu and Debian).
sudo apt update
sudo apt install espeak
- assuming a graphical desktop environment
- start a shellscript in a terminal window, let us call it
viafifo
. - starting the program to be monitored 'in
viafifo
'
running the dialogue in the terminal window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdin
,/dev/stdout
anddev/stderr
. The main task in the shellscript is the line with the programscript
, that is monitoring the activity in the terminal window and writing to the fifo. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window and a correspoding spoken message withespeak
. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Type exit
to leave script
and viafifo
. After that you can get a log file with the whole dialogue.
viafifo
is tested with
Ubuntu 18.04.1 LTS. <--- You find the bash code ofviafifo
in this link.
Debian 9.6.0, 'Stretch'. See the following screenshots and printout oftime viafifo
andviafifo.log
.
Demo example
Screenshots
time viafifo
user@debian:~$ time viafifo
----- Start viafifo ------------------------------------------------------------
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
----- End viafifo --------------------------------------------------------------
See 'viafifo.log'
viafifo used 8 seconds plus a few (5-10) seconds for preparing and finishing
real 0m13.295s
user 0m0.104s
sys 0m0.012s
viafifo.log
user@debian:~$ cat viafifo.log
Script started on Sat 05 Jan 2019 07:57:45 PM UTC
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
viafifo used 8 seconds
user@debian:~$
add a comment |
Invitation to feedback
Instead of adding another shellscript to my already existing answer, I think it is better with a second answer. I will listen to feedback and focus on the preferred script/method and try to merge what is preferred into one answer (unless there are reasons to keep them all (for different purposes).
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
This answer focuses on a second alternative using a fifo.
Start a zenity
info message, when there is input from a monitored program using a fifo.
1.1 Using xterm
, monitoring standard output and standard error via a fifo
This wrapper
method has the
advantage, that no direct input will trigger the alert. This works well with many programs, for examplecp -i
andsudo
.
disadvantage, that
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
sftp
will lose the prompt, and the user cannot know, when the program is ready for a new task. - some programs echo the input (there is indirect input), and this will trigger the alert, which may cause a lot of alerts in a shellscript, that does not take that into account. Example:
ssh
.
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
1.2 Using the compiled program script
and its log file via a fifo
The following shellscript can monitor the output dialogue from a program and send an alert. It needs espeak
and script
(script
need not be installed in Ubuntu and Debian).
sudo apt update
sudo apt install espeak
- assuming a graphical desktop environment
- start a shellscript in a terminal window, let us call it
viafifo
. - starting the program to be monitored 'in
viafifo
'
running the dialogue in the terminal window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdin
,/dev/stdout
anddev/stderr
. The main task in the shellscript is the line with the programscript
, that is monitoring the activity in the terminal window and writing to the fifo. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window and a correspoding spoken message withespeak
. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Type exit
to leave script
and viafifo
. After that you can get a log file with the whole dialogue.
viafifo
is tested with
Ubuntu 18.04.1 LTS. <--- You find the bash code ofviafifo
in this link.
Debian 9.6.0, 'Stretch'. See the following screenshots and printout oftime viafifo
andviafifo.log
.
Demo example
Screenshots
time viafifo
user@debian:~$ time viafifo
----- Start viafifo ------------------------------------------------------------
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
----- End viafifo --------------------------------------------------------------
See 'viafifo.log'
viafifo used 8 seconds plus a few (5-10) seconds for preparing and finishing
real 0m13.295s
user 0m0.104s
sys 0m0.012s
viafifo.log
user@debian:~$ cat viafifo.log
Script started on Sat 05 Jan 2019 07:57:45 PM UTC
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
viafifo used 8 seconds
user@debian:~$
Invitation to feedback
Instead of adding another shellscript to my already existing answer, I think it is better with a second answer. I will listen to feedback and focus on the preferred script/method and try to merge what is preferred into one answer (unless there are reasons to keep them all (for different purposes).
Monitoring the dialogue of a program and send an alert
You can monitor the activity of
- a fifo or
- an
xterm
log file
and let it start a zenity
info message, when there is input from the monitored program. If you wish, you can also install espeak
and let it send an audio message.
This answer focuses on a second alternative using a fifo.
Start a zenity
info message, when there is input from a monitored program using a fifo.
1.1 Using xterm
, monitoring standard output and standard error via a fifo
This wrapper
method has the
advantage, that no direct input will trigger the alert. This works well with many programs, for examplecp -i
andsudo
.
disadvantage, that
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
sftp
will lose the prompt, and the user cannot know, when the program is ready for a new task. - some programs echo the input (there is indirect input), and this will trigger the alert, which may cause a lot of alerts in a shellscript, that does not take that into account. Example:
ssh
.
- some programs will be disabled, because they use not only standard output and standard error for writing its output. Example:
1.2 Using the compiled program script
and its log file via a fifo
The following shellscript can monitor the output dialogue from a program and send an alert. It needs espeak
and script
(script
need not be installed in Ubuntu and Debian).
sudo apt update
sudo apt install espeak
- assuming a graphical desktop environment
- start a shellscript in a terminal window, let us call it
viafifo
. - starting the program to be monitored 'in
viafifo
'
running the dialogue in the terminal window (that is where you write your input)- using a fifo to get access to the output of the program to be monitored,
/dev/stdin
,/dev/stdout
anddev/stderr
. The main task in the shellscript is the line with the programscript
, that is monitoring the activity in the terminal window and writing to the fifo. - running a
while
loop
- testing if the fifo has been modified and in that case
- starting a
zenity
info message window and a correspoding spoken message withespeak
. - short delays are allowed during typing the input (8 seconds; you can edit the script file to change the delay time).
- starting a
- testing if the fifo has been modified and in that case
You are expected to close the zenity
window (can work with 'Enter') to get back to the xterm
window, where you write your input.
Type exit
to leave script
and viafifo
. After that you can get a log file with the whole dialogue.
viafifo
is tested with
Ubuntu 18.04.1 LTS. <--- You find the bash code ofviafifo
in this link.
Debian 9.6.0, 'Stretch'. See the following screenshots and printout oftime viafifo
andviafifo.log
.
Demo example
Screenshots
time viafifo
user@debian:~$ time viafifo
----- Start viafifo ------------------------------------------------------------
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
----- End viafifo --------------------------------------------------------------
See 'viafifo.log'
viafifo used 8 seconds plus a few (5-10) seconds for preparing and finishing
real 0m13.295s
user 0m0.104s
sys 0m0.012s
viafifo.log
user@debian:~$ cat viafifo.log
Script started on Sat 05 Jan 2019 07:57:45 PM UTC
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
viafifo used 8 seconds
user@debian:~$
answered yesterday
sudodussudodus
1,14616
1,14616
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f491121%2fsend-a-notification-or-alert-when-bash-asks-for-input-from-user%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Why not send the alert just before the
read
command?– RudiC
Dec 27 '18 at 14:06
@RudiC Could you please expand your comment (to an answer perhaps, I'm not good at bash scripting)? In case there's a confusion, I'm not not planning to create an automated reply to the prompt. I just want it to remind me of forgotten (minimised/in different workspace) Terminal window while running commands with lengthy output which may ask for user-input (e.g.
apt update && apt upgrade
).– pomsky
Dec 27 '18 at 16:18
Sounds like you DON'T have access to the scripts / commands, so CAN'T modify them, and want to be informed whenever any waits inside for a user interaction?
– RudiC
Dec 27 '18 at 16:29
@RudiC Exactly! Is that impossible to achieve?
– pomsky
Dec 27 '18 at 16:31
Can't tell from the top of my head. No simple approach...
– RudiC
Dec 27 '18 at 16:41