Запуск Rhythmbox через crontab

Я уже устал от этой проблемы, потому что к каждой версии 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) *
**************************

Я вижу сообщение об ошибке здесь, но я не знаю, как от этого избавиться.

Любая помощь будет оценена.

Редактировать: Чтобы сделать еще один шаг глубже: у меня есть два интересных вопроса:

  1. Почему каждая версия ведет себя по-разному с ее crontab?
  2. Извините за этот сардонический вопрос, но по какой причине он не рассматривается как напечатанная команда пользователя? Очевидно, что нужно добавить инструкцию 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. Почему каждая версия ведет себя по-разному с ее crontab?
  2. Извините за этот сардонический вопрос, но по какой причине он не рассматривается как напечатанная команда пользователя? Очевидно, что нужно добавить инструкцию 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 это сработало ... Так что все еще расследую ...

2
задан 16 June 2014 в 10:15

3 ответа

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-клиента.

0
ответ дан 16 June 2014 в 10:15

Попытайтесь экспортировать переменные перед сценарием запуска:

50 6 * *  export XAUTHORITY && export DISPLAY=:0 && /scripts/alert.sh #mo
...

remeber для проверки, который DISPLAY подключен к пользователю путем ввода:

w
0
ответ дан 16 June 2014 в 10:15

Теперь я выбрал совершенно другой способ решить эту проблему:

сценарий теперь ожидает с файлом 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

спасибо за все Ваши ответы.

0
ответ дан 16 June 2014 в 10:15

Другие вопросы по тегам:

Похожие вопросы: