Видео ролики бесплатно онлайн

Смотреть казахский видео

Официальный сайт sosamba138 24/7/365

Смотреть видео бесплатно

WeLinux.ru

09.02.09 21:54stetzen

0byteBanshee, cron и будильник

Долгое время в качастве будильника пользовался небольшой программиной alarm-clock, пока с очередным апдейтом она не отвалилась напрочь. Поскольку просыпаться как-то все-таки надо, я решил наконец-то освоить силу cron'а.

Для начала, я не собираюсь ипользовать cron в чистом виде, есть замечательная программа gnome-schedule, которая позволит настроить расписание с помощью графического интерфейса. Значительно более проблематичной вещью для меня стал сам скрипт будильника.

Создадим где-нибудь файл alarm со стандартным заголовком скрипта:

echo '#!/bin/bash' > alarm


И сделаем его исполняемым:

chmod +x alarm


Это - наш будущий скрипт. Теперь начнем с ним собственно разбираться.

Самый простой способ - это воспользоваться mplayer:

mplayer -ao pulse '/home/stetzen/Music/J-rock/CODE GEASS Ending 1.mp3'


Это будет весьма эффективно в качестве будильника, так как Вам придется набирать killall mplayer, чтобы его вырубить. Попробуем запустить mplayer в каом-нибудь графическом терминале, чтобы он был более интерактивен:

xterm -e "mplayer -ao pulse '/home/stetzen/Music/J-rock/CODE GEASS Ending 1.mp3'"


И вот тут нас ждет первый подводный камень: необходимо указать, на каком дисплее запускать xterm. Для этого нужно определить переменную DISPLAY. В нашем случае будем пускать xterm на дисплее :0.0, и код будет выглядеть так:

export DISPLAY=:0.0


Отлично. Но душа просит чего-то более изящного, с возможностью поменять утреннюю мелодию. Лично я использую плеер banshee, который снимается с паузы командой banshee --play (для Вашего плеера такая команда наверняка тоже есть), так что было бы логично использовать именно этот функционал. И тут второй подводный камень, посерьезнее. Сообщение плееру отдается через шину системных сообщений dbus, которую тоже нужно указать. Однако имя шины меняется при каждом лодине, то есть его надо найти его для данной сессии. Итак.

Для начала, найдем все номер процесса gnome-session (dbus привязан к gnome-session):

1
2
user=`whoami`
pids=`pgrep -u $user gnome-session`


Данные об имени сессии dbus хранятся в файле /proc/$pid/environ ($pid - номер процесса gnome-session), так что их можно получить. Нижеприведенная строка получает из соответствующего файла строку, содержащую DBUS_SESSION_BUS_ADDRESS, после чего убирает из нее текст "DBUS_SESSION_BUS_ADDRESS=". В сухом остатке - имя сессии.

DBUS_SESSION_BUS_ADDR=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pids/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`


Теперь осталось только определить переменную DBUS_SESSION_BUS_ADDRESS и запустить музыку:

1
2
export DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDR
banshee --play


А что если с вечера Вы забыли запустить banshee? В таком случае есть смысл воспользоваться mplayer. Проверим, запущен ли banshee, и если нет - запустим mplayer:

1
2
3
4
5
6
        if ps aux | grep -v grep | grep banshee > /dev/null
        then
             (код включения banshee)
        else
             (код запуска mplayer)
        fi


Небольшое пояснение: команда ps aux | grep banshee вернет не только процесс banshee, но и процесс grep, так что его нужно отсеять опцией -v.

И, если Вам еще не надоело, окончательный код скрипта:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

if ps aux | grep -v grep | grep banshee > /dev/null
then
     user=`whoami`
     pids=`pgrep -u $user gnome-session`
     # find DBUS session bus for this session
     DBUS_SESSION_BUS_ADDR=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pids/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
     # use it
     export DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDR
     banshee --play
else
     export DISPLAY=:0.0
     xterm -e "mplayer -ao pulse '/home/stetzen/Music/J-rock/CODE GEASS Ending 1.mp3'"
fi
 
+3
zb09.02.09 23:10# +1
я упрощу твою технологию!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
#we don't need the grep -v, because we use short command name
#also I have used "while" loop instead of "if"
ps -U `whoami`  o pid,user,comm |grep banshee |
 tail -1|
  while read bpid user bcomm
do
     # find DBUS session bus for this session
     # we don't need grep gnome-session, just because not anybody uses gnome
     # we also have that variable at banshee's environment, if we dont, then banshee will not play:)
     # using eval, should be carefull, so I added ^ and = to be sure that we'll setup correct variable; to be more secure I suggest to add single quotes about variable's value - i'm to lazy to do it.        
     eval "export $(grep -z '^DBUS_SESSION_BUS_ADDRESS=' /proc/$bpid/environ)"
     # run banshee, give it 5 seconds for react, or kill it
     # check if really playing :)
     timeout 5 banshee --play &&
     timeout 5 banshee --query-current-state |grep -q 'playing' && exit 1

     #the above exit 1 will be used by "exit 0" after loop exit, it need to signal main loop that command complete success and we was inside the loop
     exit 0 #banshee unexpectedly failed to play
done || exit 0
     export DISPLAY=:0.0
#if we was unable to start mplayer with X we'll have to start it noninteractive
     xterm -e "mplayer -ao pulse '/home/stetzen/Music/J-rock/CODE GEASS Ending 1.mp3'" &>/dev/null || mplayer -ao pulse '/home/stetzen/Music/J-rock/CODE GEASS Ending 1.mp3' &>/dev/null
 


и кое где улучшу
Username09.02.09 23:56# +0
вот честно скажи;)
ну скопировал ведь откуда-то)
предлагаю устраивать впредь миниконкурсы на самые лаконичные скрипты
zb09.02.09 23:59# +2
сам написал, и с комментами естественно моими, мне просто непонравился ряд идеолгических багов в исходном скрипте.

ps: А ты по английски не понимаешь чтоли ? там же related to source скрипт все коменты да и куски начального варианта...
zb10.02.09 00:09# +0
лаконичность здесь не главное, главное в деле просыпания надежность, я вот думаю что надо бы mplayerу еще одно условие на ошибку выдать и вставить подкрутку микшера, а так-же можно определить микрофоном повышение амплитуды в конце чтобы в случае чего использовать sip для дозвона телефоном.
Username10.02.09 00:12# +0
хм) просто читать не стал. Ну это похвально, сам люблю английский)
А про лаконичность - это в принципе идея, не к этому примеру вообще.
Чем лаконичнее код, тем изящнее.
Username10.02.09 00:14# +0
да, английский хорош)
Username10.02.09 00:17# +0
погоди, а где мы убиваем неработающий банши?
zb10.02.09 00:19# +1
таймаут убивает процесс им же запущеный сигналом SIGKILL если он не вышел за 5 секунд, определенный ранее не убиваем естественно, фиг знает чего он не отвечает - мож потом очухается
Username10.02.09 00:42# +0
хм. хитро. +1
Iliander10.02.09 01:57# +0
гм... Я для этих целей использую mpd + mpc. В принципе меня всё устраивает, но я надеюсь на небольшую помощь =) Linux-guru, помогите скрипт написать =)
Вот мой нынешний скрипт:

1
2
3
4
5
6
7
8
#!/bin/bash
mpc clear >>/dev/null
mpc load "сектор_газа" >>/dev/null
mpc volume 20 >>/dev/null
mpc play 72 >>/dev/null
sleep 5s >>/dev/null
mpc volume +10 >>/dev/null
sleep 5s >>/dev/null

...и т.д...
Всё просто: сначала идёт очистка текущего плейлиста, потом загружается мой плейлист, далее устанавливается громкость в 20%, запускается проигрывание и через sleep каждые пять секунд наращивается громкость. Соответственно, у меня написан целый столбик
1
2
3
sleep 5s >>/dev/null
mpc volume +10 >>/dev/null
sleep 5s >>/dev/null

Хотелось бы это как-то загнать в цикл, сделать код красивее. К сожалению, я еще не освоил скриптописание достаточно хорошо =(
zb10.02.09 02:20# +1
т.е. ты хочешь плавно поднимать громкость ?
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
mpc clear &>/dev/null
mpc load "сектор_газа" &>/dev/null
mpc volume 0 &>/dev/null
mpc play 72 &>/dev/null
for ((a=1;a<100;a++));do
 mpc volume +1 &>/dev/null
sleep 0.2
done
 

Iliander10.02.09 02:32# +0
1
2
3
4
for ((a=1;a<100;a++));do
 mpc volume +1 &>/dev/null
sleep 0.2
done

Да, это то, что было нужно. Благодарю.
Кстати, не поможешь немного "для себя" разобраться в этом коде?
Я так понимаю, что "a" присваивается значение единица, идёт проверка "a" и если "a" меньше заданного значения (это значение можно считать как количество повторов цикла), то к значению "a" добавляется единица и выполняется код. Я правильно понял?
В этом коде мне непонятно только одно - "a++". Сможешь пояснить это? Почему именно такой вид записи?
zb10.02.09 02:49# +1
ну a++ это добавить к a еденичку как в C или perl, цикл, ну я так обчно пишу числовые циклы, чтобы не переключать мозг хотя-бы в этом, вообще двойные круглые скобки в баш - это числовые операции. не написано a=a+1 потому что a++ короче.
Iliander10.02.09 02:56# +0
Благодарю, исчерпывающий ответ =)
...Помню, что где-то читал про подобный вид записей, но никак не мог вспомнить где. Точно, скорее всего это был перл.
zb10.02.09 02:45# +1
вообще раз речь зашла про будильники - я когда был студентом просыпался под что-то подобное:
while :;do play -n synth 1 sin 1k:3k sin 4k:1k sin 8k:1k sin 3k:8k sin 0:1k ;play -n synth 2 sin 3k:1k sin 1k:4k sin 1k:8k sin 8k:3ksin 16k:0k   ;done

правда в реализации на pcspeaker коммандой beep.

Top блогов (все)
Топ пользователей Топ блогов
Топ пользователей Топ блогов
Top пользователей (все)
Топ пользователей Топ блогов
В сети: HellTommy, exelens

Новенькие: playpauseandstop, softzilla, sandul, predator, wisecapt
welinux.ru
Идея сайта exelens; Движок 0byte, разработчик nvbn; Дизайн - Astramak

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн