while [ STAT=`xscreensaver-command -watch` ]; do
echo "TEST"
done
(Bash) Можно ли работать с не завершающимися программами из под Bash
Здравствуйте Хакеры! Заранее благодарен за внимание к этой теме!
(Если не забуду, то потом то же ещё буду рассыпаться в благодарностях...)
Ну в теме уже сказано какой вопрос. Поэтому: попытался я написать скрипт для реагирования на событие скринсайвера и использовал для этого xscreensaver-command -watch. Эта прога не возвращается те. не завершается (и при наступлении события хранителя экрана она печатает строку текста) и вроде бы поэтому мне никак не удаётся её использовать в скрипте, хотя ошибок оболочка не выдаёт. Может есть всё таки способ взаимодействия с такими не возвращающимися утилитками из скрипта оболочки? Я пробовал вот так:
Код:
и так
Код:
while [ 0 ]; do
if [ "BLANK" == `xscreensaver-command -watch|cut -d" " -f1` ]; then
echo "TEST"
fi
done
if [ "BLANK" == `xscreensaver-command -watch|cut -d" " -f1` ]; then
echo "TEST"
fi
done
Но строка TEST так и не выводиться никогда.
[highlight=bash]#!/bin/sh
xscreensaver-command -watch | while read line; do
case "$line" in
BLANK*) echo "BLANK";;
UNBLANK*) echo "UNBLANK";;
*) echo "OTHER";;
esac
done[/highlight]
посмотрите еще как фоном запускать процесс =), да и там у нас в прикрепленном топике вроде была литература по скриптингу.
Прежде чем тестить на xscreensaver, надо бы проверить запущен ли он, а то я вот минут 5 убил на этот пример, пока не понял, что он просто не запущен :D
Я очень благодарен этому Форуму за оказаную мне возможность получить необходимую мне помощь и содействие в разрешении возникших технических вопросов. Благодарности так же отправляются всем кто проявил интерес к теме а в особенности благодарности направляются пользователю с ником Odissey! Odissey и сказал ответ на вопрос который я задал и который работает в том виде в котором я его получил на этом форуме. Спасибо Odissey!
Вот ещё скрипт который получился в результате на данный момент. Возможно идеи которые в нём используются окажутся кому то полезными. Скрипт реагирует на событие xscreensaver и заглушив звук вызывает системный скрипт для помещения машины в режим Standby или Suspend-to-RAM:
Код:
#!/bin/bash
#bash 3.1
#xss-standby.sh
#We need super-user privileges for running
if [ `id -u` -ne 0 ]; then
echo "Run this script as super-user!"
exit -1
fi
#Try to find runnig XSS... for future using.
ps ax|grep xscreensaver 1> /dev/null 2> /dev/null
if [ "$?" -eq 0 ]; then
XSS="yes"
fi
#initial variables
typeset -i VOL=0
typeset -i PERC=0
#function to move volume down
voldownf () {
BUFF=`amixer scontents|awk 'FNR == 7 {print $5}' 2> /dev/null `
VOL=${BUFF:1:3}
unset BUFF
VOLDOWN="$VOL"
for i in {1..11}; do
if [ "$VOLDOWN" -gt 10 ]; then
let "VOLDOWN = VOLDOWN - 10"
else
VOLDOWN=0
fi
amixer -q -c 0 sset Master "$VOLDOWN""%" 2> /dev/null
sleep 0.20
done
unset VOLDOWN
}
#function to restore volume. Prev. it needed function voldownf call!
volupf () {
if [ "$VOL" -ne 0 ]; then
while [ "$PERC" -ne "$VOL" ]; do
let "PERC = PERC + 10"
amixer -q -c 0 sset Master "$PERC""%" 2> /dev/null
sleep 0.4
done
fi
}
#function for suspending. Distro depended.
standbyf () {
voldownf
/usr/sbin/standby -n #Local suspend script
volupf
}
#function that use xscreensaver-command -watch for reacting on an XSS
#event (LOCK), and then mute volume and call system's suspend script
watchf () {
xscreensaver-command -watch 2> /dev/null |while read STAT; do
case "$STAT" in
BLANK*) : ;;
UNBLANK*) : ;;
LOCK*) standbyf ;;
esac
done
}
#Script entry point
watchf
#bash 3.1
#xss-standby.sh
#We need super-user privileges for running
if [ `id -u` -ne 0 ]; then
echo "Run this script as super-user!"
exit -1
fi
#Try to find runnig XSS... for future using.
ps ax|grep xscreensaver 1> /dev/null 2> /dev/null
if [ "$?" -eq 0 ]; then
XSS="yes"
fi
#initial variables
typeset -i VOL=0
typeset -i PERC=0
#function to move volume down
voldownf () {
BUFF=`amixer scontents|awk 'FNR == 7 {print $5}' 2> /dev/null `
VOL=${BUFF:1:3}
unset BUFF
VOLDOWN="$VOL"
for i in {1..11}; do
if [ "$VOLDOWN" -gt 10 ]; then
let "VOLDOWN = VOLDOWN - 10"
else
VOLDOWN=0
fi
amixer -q -c 0 sset Master "$VOLDOWN""%" 2> /dev/null
sleep 0.20
done
unset VOLDOWN
}
#function to restore volume. Prev. it needed function voldownf call!
volupf () {
if [ "$VOL" -ne 0 ]; then
while [ "$PERC" -ne "$VOL" ]; do
let "PERC = PERC + 10"
amixer -q -c 0 sset Master "$PERC""%" 2> /dev/null
sleep 0.4
done
fi
}
#function for suspending. Distro depended.
standbyf () {
voldownf
/usr/sbin/standby -n #Local suspend script
volupf
}
#function that use xscreensaver-command -watch for reacting on an XSS
#event (LOCK), and then mute volume and call system's suspend script
watchf () {
xscreensaver-command -watch 2> /dev/null |while read STAT; do
case "$STAT" in
BLANK*) : ;;
UNBLANK*) : ;;
LOCK*) standbyf ;;
esac
done
}
#Script entry point
watchf