Iniciando o Rhythmbox via crontab

2
Estou ficando cansado desse problema agora, porque todas as versões do Ubuntu precisam ser tratadas de outra maneira, mas no 14.04 eu não sei mais o que fazer.

Meu problema: Meu PC está começando automaticamente todos os dias para atuar como meu alerta, porque um crontab inicia um script escolhendo uma música para tocar, inicia o Rhythmbox, adiciona o arquivo ou a lista escolhida para reproduzir fila e reproduzir.

O problema agora é que os scripts funcionam perfeitamente quando eu estou rodando a partir de um terminal, mas iniciado pelo crontab O Rhythmbox não está começando em grande parte.

Meu 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

O script /script/copy_loop.sh é outro script que funciona perfeitamente (mas não precisa iniciar nenhum programa ...)

script de alerta:     #! / 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 '/$'

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

Basicamente, o script liga os monitores (funciona perfeitamente) ajusta o volume (funciona perfeitamente) escolhe uma música e a adiciona à Block-List (funciona perfeitamente) e inicia o rhythmbox (meh ... se funcionasse o add to playqueue e as coisas funcionariam também ...)

Em distribuições antigas (12.10 até 13.10), o Rhythmbox estava começando (adicionando DISPLAY=:0.0 sudo -u julian ou iniciando via rhythmbox-client --no-present ), mas agora todas essas coisas não funcionam mais.

O arquivo de log gerado ao iniciar o script a partir do terminal:

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

O Rhythmbox começa e toca

iniciado por 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) *
**************************

Eu vejo a mensagem de erro aqui, mas não sei como me livrar dela.

Qualquer ajuda seria apreciada.

Editar: Para ir um passo mais profundo: Há duas questões interessantes para mim:

  1. Por que todas as versões se comportam de maneira diferente com seu crontab?
  2. Desculpe esta pergunta sarcástica, mas qual é a razão pela qual ela não é tratada como um comando digitado pelo usuário? É óbvio que é necessário adicionar a instrução DISPLAY =: 0.0, mas não é óbvio adicionar o arquivo xauthority, além disso, não funciona de forma alguma.

Se o rhythmbox começar, então existem duas possibilidades:  1. Ele é executado em uma instância própria, então rhythmbox-client não o vê.  2. Ele é executado em uma instância encapsulada de lightdm / unity, portanto as teclas de atalho no teclado não estão funcionando e, se fechadas, a música é reproduzida, mas é necessário matá-lo com killall rhythmbox , iniciando o Rhythmbox via unidade em qualquer maneira (acesso rápido no painel de áudio também), cria uma segunda instância.

Eu estou apenas supondo agora, mas eu acho que os dois últimos pontos acontecem porque o crontab está fazendo o seu trabalho não exatamente no nome do usuário que está configurado.

Qualquer ajuda seria muito apreciada.

Editar 2014-06-16: Para trazer mais informações: Parece que nem é possível iniciar qualquer interface gráfica em 14.04:

11 8 * * * gnome-terminal
11 8 * * * DISPLAY=:0.0 gnome-terminal

Nenhuma das opções acima está funcionando. Tenho certeza que em 13.04 e 13.10 isso funcionou ... Então ainda investigando ...

    
por wolfjuli 28.05.2014 / 08:01

3 respostas

0

Agora eu escolhi uma maneira completamente diferente de resolver esse problema:

O script agora espera com um fifo-file até que um comando do crontab se aproxime e então comece a trabalhar. Por causa disso, é possível iniciar o script na inicialização e fazê-lo funcionar quando o crontab diz para fazer isso. Agora, o gerenciador de exibição inicia o script e não o crontab, que agora se parece com:

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

Sinto muito, mas a postagem do script é dificilmente possível, porque ele foi dividido em vários arquivos para poder reutilizar algumas funções. Basicamente, parece assim:

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

Obrigado por todas as suas respostas.

    
por wolfjuli 11.09.2014 / 18:56
2

O rhythmbox-client requer que o dbus se comunique com o rhythmbox. Você precisa definir a variável de ambiente DBUS_SESSION_BUS_ADDRESS para o rhythmbox-client. O valor pode ser obtido no ambiente com um script como este.

touch $HOME/Xdbus
chmod 600 $HOME/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/Xdbus

Execute este script depois de efetuar o login. Em seguida, no seu script alert.sh, você poderá obter $ HOME / Xdbus antes de executar o rhythmbox-client.

    
por Tim Krause 03.08.2014 / 18:38
0

Tente exportar variáveis antes do script de lançamento:

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

Lembre-se de verificar se o DISPLAY está conectado ao usuário digitando:

w
    
por girardengo 16.06.2014 / 08:55