Online video hd

Смотреть гиг видео

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

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

stetzen 09.02.2009 21:54

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

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



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



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



1
echo '#!/bin/bash' > alarm





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



1
chmod +x alarm





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



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



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





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



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





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



1
export DISPLAY=:0.0





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



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



1
2
3
user=`whoami`

pids=`pgrep -u $user gnome-session`





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



1
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
3
export DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDR

banshee --play





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



 1
2
3
4
5
6
7
8
9
10
11
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
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/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 -
Похожие Поделиться

zb 09.02.2009 23:10 #
+ 2 -
я упрощу твою технологию!
#!/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


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

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

#!/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 каждые пять секунд наращивается громкость. Соответственно, у меня написан целый столбик
sleep 5s >>/dev/null
mpc volume +10 >>/dev/null
sleep 5s >>/dev/null

Хотелось бы это как-то загнать в цикл, сделать код красивее. К сожалению, я еще не освоил скриптописание достаточно хорошо =(
zb 10.02.2009 02:20 #
+ 1 -
т.е. ты хочешь плавно поднимать громкость ?
#!/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

Iliander 10.02.2009 02:32 #
+ 0 -
for ((a=1;a<100;a++));do
mpc volume +1 &>/dev/null
sleep 0.2
done

Да, это то, что было нужно. Благодарю.
Кстати, не поможешь немного "для себя" разобраться в этом коде?
Я так понимаю, что "a" присваивается значение единица, идёт проверка "a" и если "a" меньше заданного значения (это значение можно считать как количество повторов цикла), то к значению "a" добавляется единица и выполняется код. Я правильно понял?
В этом коде мне непонятно только одно - "a++". Сможешь пояснить это? Почему именно такой вид записи?
zb 10.02.2009 02:49 #
+ 1 -
ну a++ это добавить к a еденичку как в C или perl, цикл, ну я так обчно пишу числовые циклы, чтобы не переключать мозг хотя-бы в этом, вообще двойные круглые скобки в баш - это числовые операции. не написано a=a+1 потому что a++ короче.
Iliander 10.02.2009 02:56 #
+ 0 -
Благодарю, исчерпывающий ответ =)
...Помню, что где-то читал про подобный вид записей, но никак не мог вспомнить где. Точно, скорее всего это был перл.
zb 10.02.2009 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.
mironov_orig 01.08.2011 11:33 #
+ 0 -
Не тот блог

В хорошем качестве hd видео

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


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

Online video HD

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

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

Full HD video online

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

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

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