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


Я устал от этой проблемы сейчас, потому что каждую версию Ubuntu нужно рассматривать по-другому, но в 14.04 я не знаю, что делать дальше.

Моя проблема: Мой компьютер запускается автоматически каждый день, чтобы действовать как мое предупреждение, потому что crontab запускает скрипт, выбирающий музыку для воспроизведения, запускает Rhythmbox, добавляя выбранный файл или список, чтобы играть в очередь и играть.

Проблема в том, что скрипты прекрасно работают, когда я запускаю его с терминала, но начатый crontab Rhythmbox в основном не запускается.

Мой кронаб:

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 скрипт - это еще один скрипт, который отлично работает (но он не должен запускать программу вообще ...)

Оповещение-скрипт:     #! / Bin / Баш

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 '/$'

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 "**************************"

В основном сценарий включает мониторы (отлично работает) регулирует громкость (отлично работает) выбирает песню и добавляет ее в блок-лист (отлично работает) и запускает ритм-бокс (meh ... если бы он работал над добавлением в 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
2018-05-28 06:01


происхождения




ответы:


rhythmbox-client требует, чтобы dbus связывался с rhythmbox. Для rhythmbox-client вам необходимо установить переменную окружения DBUS_SESSION_BUS_ADDRESS. Значение может быть получено из среды с помощью скрипта, подобного этому.

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-client.


2
2017-08-03 16:38





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

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

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

w

0
2018-06-16 06:55



Теперь начинается ритмбокс, но ритмбокс-клиент «не видит» его. Он снова работает в собственном «экземпляре», но благодаря этой идее - wolfjuli


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

Скрипт теперь ждет с 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
2017-09-11 16:56