Я уже устал от этой проблемы, потому что к каждой версии Ubuntu нужно относиться по-своему, но в 14.04 я не знаю, что делать дальше.
Моя проблема: Мой компьютер автоматически запускается каждый день, чтобы действовать как мое оповещение, потому что crontab запускает скрипт, выбирающий музыку для воспроизведения, запускает Rhythmbox, добавляет выбранный файл или список для воспроизведения очереди и воспроизведения.
Проблема сейчас в том, что скрипты работают отлично, когда я запускаю его из терминала, но запускаемый crontab Rhythmbox в основном не запускается.
Мой crontab:
MAILTO=""
XAUTHORITY=~/.Xauthority
DISPLAY=:0.0
# m h dom mon dow command
*/10 * * * * /scripts/copy_loop.sh &
#start alert
50 6 * * 1 /scripts/alert.sh #mo
50 6 * * 2 /scripts/alert.sh #di
50 6 * * 3 /scripts/alert.sh #mi
50 6 * * 4 /scripts/alert.sh #do
50 6 * * 5 /scripts/alert.sh #fr
30 7 * * 6-7 /scripts/alert.sh #sa/so
Скрипт /script/copy_loop.sh
- это еще один скрипт, который отлично работает (но ему совсем не обязательно запускать программу ...)
alert -script: #! / bin / bash
logfile="/scripts/log/alert.log"
exec >> $logfile 2>&1
echo "***********************************"
echo "* Start ("`date +'%d.%m.%Y %H:%M'`") as `whoami` *"
echo "***********************************"
#To avoid heart-attacks ;)
amixer set Master 14
echo "Turning monitors on and waiting 5 seconds."
#Force Monitor to turn on (grafik bug!)
xset dpms force on
sleep 5
#how many days should a song be blocked?
days=25
#Create array of music
music=( "Dubstep von Hannes/1-45 The Sound of Dubstep 4 - Mix 1.mp3"
"Purity Ring's Shrines.MP3"
"XXYYXX - XXYYXX (Full Album).MP3"
"Bonobo/Days to Come Disc 1/"
"LIQUID STRANGER - BABYLON OUTCAST (DJ MIX).MP3"
"Wisdom - Beautiful Chillstep.mp3"
"Sizzlebird - Artist Mix.mp3"
"Yann Tiersen - Amelie Soundtrack.mp3"
"chillstep mix 2013 vol.3.mp3"
"Burning Snowflakes Mix.mp3"
"Parov Stelar - Daylight/"
"Parov Stelar - Coco/Disc 1/"
"Parov Stelar - Coco/Disc 2/"
"Seeed/"
"Salvation 2 Hour Best of Chillstep Mix.mp3"
"Lonely Nights Wonderful Chillstep Mix.mp3"
"Caribou - Swim (Full Album).mp3"
"Gorillaz Plastic Beach 2010/"
"Griechenland/Pendulum - Hold Your Colour/"
"Griechenland/Pendulum In Silico/"
"Pendulum - Immersion/"
"Aphex Twin - Selected Ambient Works 85-92.MP3"
"RJD2 - Deadringer (Full Album).MP3"
"SOLAR FIELDS - RANDOM FRIDAY (ALBUM) HQ.MP3"
"Deep Cuts/"
"Silent Shout/"
"Gorillaz/"
"Kosheen/(2002) resist/"
"Dub_Fx/Everythinks A Ripple/"
"Griechenland/B-Complex/"
)
for (( i=0; i < 1; i++ )); do
choose=${music[$(($RANDOM % ${#music[@]}))]}
#check if song is blocked
cat /scripts/alertBlock | grep "$choose" > /dev/null
if [[ $? == 0 ]]; then
#song is blocked
echo "$choose is blocked"
i=-1
fi
done
#write to file, so it can't be played the next given days
lines=`wc -l < /scripts/alertBlock`
#cut the last entry
tail -n $(($days - 1)) /scripts/alertBlock > /scripts/.temp
cat /scripts/.temp > /scripts/alertBlock
echo "$choose" >> /scripts/alertBlock
echo "$choose chosen and added to Block-List"
echo "waiting for Rhythmbox to start"
rhythmbox-client --no-present &
#ok=false
#while [[ $ok == false ]]; do
# rhythmbox-client --check-running
#
# if [[ $? == 0 ]]; then
# ok=true
# else
# ok=false
# fi
#done
sleep 10
echo $choose | grep '/ По сути, скрипт включает мониторы (работает отлично), регулирует громкость (работает отлично), выбирает песню и добавляет ее в черный список (работает идеально) и запускает rhythmbox (ме ... если это сработает, добавьте в playqueue и все будет работать тоже ...)
В старых дистрибутивах (с 12.10 до 13.10) Rhythmbox запускался (добавлял DISPLAY=:0.0 sudo -u julian
или запускался через rhythmbox-client --no-present
) но теперь все это больше не работает.
Лог-файл, сгенерированный при запуске скрипта с терминала:
***********************************
* Start (28.05.2014 07:56) as julian *
***********************************
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 31
Mono: Playback 14 [45%] [-25.50dB] [on]
Turning monitors on and waiting 5 seconds.
RJD2 - Deadringer (Full Album).MP3 chosen and added to Block-List
waiting for Rhythmbox to start
Musicplayer startetd. Have Fun!
**************************
* End (28.05.2014 07:56) *
**************************
Rhythmbox запускается и воспроизводит
, запущенный crontab:
***********************************
* Start (28.05.2014 06:50) as julian *
***********************************
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 31
Mono: Playback 14 [45%] [-25.50dB] [on]
Turning monitors on and waiting 5 seconds.
Purity Ring's Shrines.MP3 chosen and added to Block-List
waiting for Rhythmbox to start
(rhythmbox-client:5655): GLib-GIO-CRITICAL **: g_dbus_proxy_new_sync: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
Musicplayer startetd. Have Fun!
**************************
* End (28.05.2014 06:50) *
**************************
Я вижу сообщение об ошибке здесь, но я не знаю, как от этого избавиться.
Любая помощь будет оценена.
Редактировать: Чтобы сделать еще один шаг глубже: у меня есть два интересных вопроса:
- Почему каждая версия ведет себя по-разному с ее crontab?
- Извините за этот сардонический вопрос, но по какой причине он не рассматривается как напечатанная команда пользователя? Очевидно, что нужно добавить инструкцию DISPLAY =: 0.0, но абсолютно НЕ очевидно добавлять файл xauthority, более того, он все равно не работает.
Если запускается ритмбокс, то есть две возможности: 1. Он запускается в своем собственном экземпляре, поэтому rhythmbox-client
его не видит. 2. Он работает в инкапсулированном экземпляре lightdm / unity, поэтому горячие клавиши на клавиатуре не работают и, если она закрыта, музыка играет, но ее нужно убить с помощью killall rhythmbox
, потому что запуск Rhythmbox через единство в любом способ (быстрый доступ в аудио-панели тоже), создает второй экземпляр.
Я только догадываюсь сейчас, но я думаю, что последние два пункта происходят потому, что crontab выполняет свою работу не от имени пользователя, для которого он настроен.
Любая помощь будет очень признательна.
Редактировать 2014-06-16: Чтобы вывести больше информации: Кажется, что в 14.04 даже невозможно запустить какой-либо графический интерфейс:
11 8 * * * gnome-terminal
11 8 * * * DISPLAY=:0.0 gnome-terminal
Ничто из вышеперечисленного не работает. Я уверен, что в 13.04 и 13.10 это сработало ... Так что все еще расследую ...
if [[ $? == 0 ]]; then
cd "/home/julian/Music/$choose"
echo "Clearing queue"
rhythmbox-client --clear-queue 2>&1
# To avoid adding pictures and such crap
rhythmbox-client --enqueue *.mp3
rhythmbox-client --enqueue *.wav
rhythmbox-client --enqueue *.ogg
rhythmbox-client --enqueue *.flac
sleep 2
rhythmbox-client --play
else
rhythmbox-client --no-start --play-uri="/home/julian/Music/$choose" 2>&1
fi
echo "Music player started. Have Fun!"
echo "**************************"
echo "* End ("`date +'%d.%m.%Y %H:%M'`") *"
echo "**************************"
По сути, скрипт включает мониторы (работает отлично), регулирует громкость (работает отлично), выбирает песню и добавляет ее в черный список (работает идеально) и запускает rhythmbox (ме ... если это сработает, добавьте в playqueue и все будет работать тоже ...)
В старых дистрибутивах (с 12.10 до 13.10) Rhythmbox запускался (добавлял DISPLAY=:0.0 sudo -u julian
или запускался через rhythmbox-client --no-present
) но теперь все это больше не работает.
Лог-файл, сгенерированный при запуске скрипта с терминала:
***********************************
* Start (28.05.2014 07:56) as julian *
***********************************
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 31
Mono: Playback 14 [45%] [-25.50dB] [on]
Turning monitors on and waiting 5 seconds.
RJD2 - Deadringer (Full Album).MP3 chosen and added to Block-List
waiting for Rhythmbox to start
Musicplayer startetd. Have Fun!
**************************
* End (28.05.2014 07:56) *
**************************
Rhythmbox запускается и воспроизводит
, запущенный crontab:
***********************************
* Start (28.05.2014 06:50) as julian *
***********************************
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 31
Mono: Playback 14 [45%] [-25.50dB] [on]
Turning monitors on and waiting 5 seconds.
Purity Ring's Shrines.MP3 chosen and added to Block-List
waiting for Rhythmbox to start
(rhythmbox-client:5655): GLib-GIO-CRITICAL **: g_dbus_proxy_new_sync: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
Musicplayer startetd. Have Fun!
**************************
* End (28.05.2014 06:50) *
**************************
Я вижу сообщение об ошибке здесь, но я не знаю, как от этого избавиться.
Любая помощь будет оценена.
Редактировать: Чтобы сделать еще один шаг глубже: у меня есть два интересных вопроса:
Если запускается ритмбокс, то есть две возможности: 1. Он запускается в своем собственном экземпляре, поэтому rhythmbox-client
его не видит. 2. Он работает в инкапсулированном экземпляре lightdm / unity, поэтому горячие клавиши на клавиатуре не работают и, если она закрыта, музыка играет, но ее нужно убить с помощью killall rhythmbox
, потому что запуск Rhythmbox через единство в любом способ (быстрый доступ в аудио-панели тоже), создает второй экземпляр.
Я только догадываюсь сейчас, но я думаю, что последние два пункта происходят потому, что crontab выполняет свою работу не от имени пользователя, для которого он настроен.
Любая помощь будет очень признательна.
Редактировать 2014-06-16: Чтобы вывести больше информации: Кажется, что в 14.04 даже невозможно запустить какой-либо графический интерфейс:
11 8 * * * gnome-terminal
11 8 * * * DISPLAY=:0.0 gnome-terminal
Ничто из вышеперечисленного не работает. Я уверен, что в 13.04 и 13.10 это сработало ... Так что все еще расследую ...
rhythmbox-клиент требует, чтобы dbus связался с rhythmbox. Необходимо установить переменную среды DBUS_SESSION_BUS_ADDRESS для rhythmbox-клиента. Значение может быть получено из среды со сценарием как этот.
touch $HOME/Xdbus
chmod 600 $HOME/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/Xdbus
Выполнение этот сценарий после входа в систему. Тогда в Вашем alert.sh сценарии Вы могли получить $HOME/Xdbus перед выполнением rhythmbox-клиента.
Попытайтесь экспортировать переменные перед сценарием запуска:
50 6 * * export XAUTHORITY && export DISPLAY=:0 && /scripts/alert.sh #mo
...
remeber для проверки, который DISPLAY
подключен к пользователю путем ввода:
w
Теперь я выбрал совершенно другой способ решить эту проблему:
сценарий теперь ожидает с файлом FIFO до команды от подходов crontab, и затем начните работать. Из-за этого меня возможно запустить, сценарий на запуске и получить его работал, когда crontab говорит, чтобы сделать так. Теперь менеджер по оформлению запускает сценарий и не crontab, который теперь похож:
#start alert
50 8 * * 1 echo "start;`whoami`;'`date`'" > /scripts/alert/com_fifo #mo
30 7 * * 2 echo "start;`whoami`;'`date`'" > /scripts/alert/com_fifo #di
...
я сожалею, но регистрация сценария едва возможна, потому что это разбудило разделение в нескольких файлах, чтобы быть в состоянии снова использовать некоторые функции. В основном это похоже на это:
hellNotFrozen=true
com="/scripts/alert/com_fifo"
#clear fifo file
rm $com >/dev/null 2>&1
mkfifo $com
while [[ $hellNotFrozen ]]; do
#read fifo-file - this statement is blocking!
inp=`cat $com` #$inp now holds the text pasted into the com-file
#...do other stuff here
rhythmbox-client --enqueue "/data/Music/$chosenFolder/*"
rhythmbox-client --play
done
спасибо за все Ваши ответы.