LINUX.ORG.RU

bash - можно так делать или нет?


0

0

Приобрел remote control, но lirc не работает с IR датчиком. USB модель IR507. Поэтому сделал на perl скрипт который обрабатывает соотвествующие event-файл, все работает хорошо! Захотелось автоматизировать запуск скрипта при старте mplayer, xmms, amarok. На perl не разкурил как правильно при помощи системного: ps aux | grep ... считать данные в скрипт, поэтому на bash сделал следующий скрипт. Сообственно вопрос: нормально ли если скрипт работае в цикл накручивая PID через sleep. Моет есть лучшее решение? Спасибо!

#! /bin/sh

pid_mplayer=0 pid_xmms=0 pid_amarok=0

while true do sleep 3

if ps aux | grep "mplayer" | grep -v "grep" | grep -q -v "plirc.pl" then if [[ "$pid_mplayer" -eq 0 ]] then # rxvt -geometry 70x17+0+0 -e plirc.pl mode=mplayer & plirc.pl mode=mplayer > /dev/null & pid_mplayer=$! fi if [[ "$pid_mplayer" -ne 0 ]] then continue fi else if [[ "$pid_mplayer" -ne 0 ]] then kill $pid_mplayer pid_mplayer=0 fi fi

if ps aux | grep "xmms" | grep -v "grep" | grep -q -v "plirc.pl" then if [[ "$pid_xmms" -eq 0 ]] then # rxvt -geometry 70x17+0+0 -e plirc.pl xmms & plirc.pl mode=xmms > /dev/null & pid_xmms=$! fi if [[ "$pid_xmms" -ne 0 ]] then continue fi else if [[ "$pid_xmms" -ne 0 ]] then kill $pid_xmms pid_xmms=0 fi fi

if ps aux | grep "amarokapp" | grep -v "grep" | grep -q -v "plirc.pl" then if [[ "$pid_amarok" -eq 0 ]] then # rxvt -geometry 70x17+0+0 -e plirc.pl amarok & plirc.pl mode=amarok > /dev/null & pid_amarok=$! fi if [[ "$pid_amarok" -ne 0 ]] then continue fi else if [[ "$pid_amarok" -ne 0 ]] then kill $pid_amarok pid_amarok=0 fi fi

done

anonymous

Извиняюсь!


#! /bin/sh


pid_mplayer=0
pid_xmms=0
pid_amarok=0

while true
do
sleep 3

if ps aux | grep "mplayer" | grep -v "grep" | grep -q -v "plirc.pl"
then
if [[ "$pid_mplayer" -eq 0 ]]
then
# rxvt -geometry 70x17+0+0 -e plirc.pl mode=mplayer &
plirc.pl mode=mplayer > /dev/null &
pid_mplayer=$!
fi
if [[ "$pid_mplayer" -ne 0 ]]
then
continue
fi
else
if [[ "$pid_mplayer" -ne 0 ]]
then
kill $pid_mplayer
pid_mplayer=0
fi
fi

if ps aux | grep "xmms" | grep -v "grep" | grep -q -v "plirc.pl"
then
if [[ "$pid_xmms" -eq 0 ]]
then
# rxvt -geometry 70x17+0+0 -e plirc.pl xmms &
plirc.pl mode=xmms > /dev/null &
pid_xmms=$!
fi
if [[ "$pid_xmms" -ne 0 ]]
then
continue
fi
else
if [[ "$pid_xmms" -ne 0 ]]
then
kill $pid_xmms
pid_xmms=0
fi
fi

if ps aux | grep "amarokapp" | grep -v "grep" | grep -q -v "plirc.pl"
then
if [[ "$pid_amarok" -eq 0 ]]
then
# rxvt -geometry 70x17+0+0 -e plirc.pl amarok &
plirc.pl mode=amarok > /dev/null &
pid_amarok=$!
fi
if [[ "$pid_amarok" -ne 0 ]]
then
continue
fi
else
if [[ "$pid_amarok" -ne 0 ]]
then
kill $pid_amarok
pid_amarok=0
fi
fi

done

anonymous
()
Ответ на: комментарий от anonymous

форматирование и так и так ужасное...

по скрипту: не воткнул в логику, нафига континью? если процесс не запущен, то есть идем по элсу, то ты его убиваешь(спрашивается нафига убивать процесс если он не запущен)? поясни сначала словесно алгоритм, иначе не понятно что и как делаешь.

fura13 ★★★
()
Ответ на: комментарий от fura13

Извиняюсь еще раз!

#! /bin/sh


pid_mplayer=0
pid_xmms=0
pid_amarok=0

while true
do
 sleep 3

 if ps aux | grep "mplayer" | grep -v "grep" | grep -q -v "plirc.pl"
  then
   if [[ "$pid_mplayer" -eq 0 ]]
    then
#     rxvt -geometry 70x17+0+0 -e plirc.pl mode=mplayer &
     plirc.pl mode=mplayer > /dev/null &
     pid_mplayer=$!
   fi     
   if [[ "$pid_mplayer" -ne 0 ]]
    then    
     continue 
   fi
 else
   if [[ "$pid_mplayer" -ne 0 ]]
    then
     kill $pid_mplayer
     pid_mplayer=0
   fi
 fi

 if ps aux | grep "xmms" | grep -v "grep" | grep -q -v "plirc.pl"
  then
   if [[ "$pid_xmms" -eq 0 ]]
    then 
#     rxvt -geometry 70x17+0+0 -e plirc.pl xmms &
      plirc.pl mode=xmms > /dev/null &
     pid_xmms=$!
   fi     
   if [[ "$pid_xmms" -ne 0 ]]
    then    
     continue 
   fi
 else
   if [[ "$pid_xmms" -ne 0 ]]
    then
     kill $pid_xmms
     pid_xmms=0
   fi
 fi

 if ps aux | grep "amarokapp" | grep -v "grep" | grep -q -v "plirc.pl"
  then
   if [[ "$pid_amarok" -eq 0 ]]
    then 
#     rxvt -geometry 70x17+0+0 -e plirc.pl amarok &
      plirc.pl mode=amarok > /dev/null &
     pid_amarok=$!
   fi     
   if [[ "$pid_amarok" -ne 0 ]]
    then    
     continue 
   fi
 else
   if [[ "$pid_amarok" -ne 0 ]]
    then
     kill $pid_amarok
     pid_amarok=0
   fi
 fi

done

anonymous
()
Ответ на: комментарий от fura13

А continue затем, что если скрипт один раз запущен то больше не запускать! Все работает хорошо! Но постоянный вызов sleep???

anonymous
()
Ответ на: комментарий от anonymous

Ну если все работает хорошо и комп не грузится - то все ок.

anonymous
()
Ответ на: комментарий от andron01

> откуда берешь event?

просто открываю скриптом /proc/bus/input/devices нахожу имя моего устройства затем файл который ему сответствует типа /dev/input/event3.
Oткрываю его и читаю команды с пульта + небольшие преобразования кода в вид удобный для анализа и все.
Mplayer управляется через пайпы, amarok через dcomp, xmms через командную строку.

anonymous
()
Ответ на: комментарий от anonymous

Раз у тебя есть /dev/input/event3 значит и lirc должен работать.
Запусти его с таким параметрами

lircd -H dev/input -d /dev/input/event3

Тогда lirc будет брать event-ы из /dev/input/event3.

Также нужно чтобы lirc был собран с опцией --with-driver=any, например:

./configure --with-driver=any

или как там это делается в твоем дистрибутиве. Тогда он будет поддерживать event девайсы.
У меня в gentoo в файле /etc/make.conf есть такая строчка:

LIRC_OPTS="--with-driver=any"

Дальше нужно где то раздобыть или сделать самому файл /etc/lircd.conf.
В этом файле прописываются соответсвия между кодами клавиш и их названиями. Здесь много готовых файлов http://lirc.sourceforge.net/remotes/ , может там и твой есть. Если нет то придется делать самому, по моему он делается с помощью тулзы irrecord.

Дальше в домашнем каталоге создаешь файл .lircrc с настройками для нужных программ. Также есть полезная тулза irexec.

andron01
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.