我现在已经厌倦了这个问题,因为每个版本的 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) *
**************************
我在这里看到了错误消息,但我不知道如何消除它。
任何帮助,将不胜感激。
编辑: 更深入地讲:对我来说有两个有趣的问题:
- 为什么每个版本的 crontab 行为都不同?
- 抱歉,这个问题有点讽刺,但为什么它不被视为用户输入的命令呢?很明显,必须添加 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
感谢您的所有回答。