通过 crontab 启动 Rhythmbox

通过 crontab 启动 Rhythmbox

我现在已经厌倦了这个问题,因为每个版本的 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脚本是另一个运行完美的脚本(但它根本不必启动程序......)

警报脚本:#!/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 "**************************"

基本上,脚本会打开监视器(运行完美)调整音量(运行完美)选择一首歌曲并将其添加到 Block-List(运行完美)并启动 rhythmbox(嗯...如果它能运行,添加到播放队列,一切也会运行...)

在较旧的发行版(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 文件绝对不明显,而且,它无论如何都不起作用。

如果 rhythmbox 启动,则有两种可能性:1. 它在自己的实例中运行,因此rhythmbox-client看不到它。2. 它在 lightdm/unity 的封装实例中运行,因此键盘上的热键不起作用,如果关闭,音乐会继续播放,但必须将其关闭,killall rhythmbox因为以任何方式通过 unity 启动 Rhythmbox(也可以在音频面板中快速访问)都会创建第二个实例。

我现在只是猜测,但我认为,最后两点发生是因为 crontab 并不是真正以设置它的用户的名义执行其工作。

任何帮助都将非常感激。

编辑2014-06-16: 显示更多信息:似乎甚至无法在 14.04 中启动任何图形界面:

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

以上方法均无效。我确信在 13.04 和 13.10 中这种方法有效...因此仍在调查中...

答案1

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 脚本中,您可以在运行 rhythmbox-client 之前 source $HOME/Xdbus。

答案2

尝试在启动脚本之前导出变量:

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

请记住通过输入以下内容来检查哪个DISPLAY连接到了用户:

w

答案3

现在我选择了一种完全不同的方法来解决这个问题:

脚本现在使用 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

感谢您的所有回答。

相关内容