OS
信息:
uname -a
Linux debian 5.10.0-18-amd64 #1 SMP Debian 5.10.140-1 (2022-09-02) x86_64 GNU/Linux
我想在重启时播放音乐。
sudo crontab -e
@reboot /usr/bin/sleep 200;/usr/bin/mplayer /home/debian/welcome.mp3
没有音乐播放,检查 cron 日志看看发生了什么:
sudo journalctl -u cron | grep -e "root" |grep -e mplayer -A 3
Oct 17 20:07:46 debian CRON[633]: (root) CMD (/usr/bin/sleep 200;/usr/bin/mplayer /home/debian/welcome.mp3)
Oct 17 20:11:07 debian CRON[593]: pam_unix(cron:session): session closed for user root
crontab中的cmd从10月17日20:07:46开始,在10月17日20:11:07关闭会话,将近200秒!
import datetime
start = datetime.datetime(2022, 10, 17, 20, 7, 46)
end = datetime.datetime(2022, 10, 17, 20, 11, 7)
end-start
datetime.timedelta(seconds=201)
意思是/usr/bin/sleep 200
执行了,但/usr/bin/mplayer /home/debian/welcome.mp3
从未启动,为什么?
没有/usr/bin/sleep 200
在crontab中,/usr/bin/mplayer /home/debian/welcome.mp3
只剩下最后7秒!这是一首5分钟长的音乐!
Oct 17 20:04:50 debian CRON[632]: (root) CMD (/usr/bin/mplayer /home/debian/welcome.mp3)
Oct 17 20:04:57 debian CRON[590]: pam_unix(cron:session): session closed for user root
更新以使用普通用户创建 cron,相同的日志:
Oct 17 21:37:26 debian CRON[638]: (debian) CMD (/usr/bin/sleep 200;/usr/bin/mplayer /home/debian/welcome.mp3)
Oct 17 21:40:48 debian CRON[593]: pam_unix(cron:session): session closed for user debian
同样的动作,从开始到结束,持续了202秒,差不多200秒了。添加 mplayer 日志的更新。
Oct 17 22:25:11 debian CRON[646]: (debian) CMD (/usr/bin/sleep 200;/usr/bin/mplayer /home/debian/welcome.mp3 2>/tmp/mplayer.reboot.log)
Oct 17 22:28:33 debian CRON[593]: pam_unix(cron:session): session closed for user debian
cat /tmp/mplayer.reboot.log
do_connect: could not connect to socket
connect: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
AO: [pulse] Init failed: Connection refused
Failed to initialize audio driver 'pulse'
[AO_ALSA] alsa-lib: pcm_hw.c:1715:(snd_pcm_hw_open) open '/dev/snd/pcmC0D0p' failed (-2): No such file or directory
[AO_ALSA] alsa-lib: pcm_dmix.c:1075:(snd_pcm_dmix_open) unable to open slave
[AO_ALSA] Playback open error: No such file or directory
Failed to initialize audio driver 'alsa'
[AO SDL] Unable to open audio: No available audio device
Failed to initialize audio driver 'sdl:aalib'
Could not open/initialize audio device -> no sound.
检查文件:
file /home/debian/welcome.mp3
/home/debian/welcome.mp3: Audio file with ID3 version 2.4.0, contains:MPEG ADTS, layer III, v1, 64 kbps, 48 kHz, Stereo
播放硬件设备:
aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: Generic [HD-Audio Generic], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: Generic [HD-Audio Generic], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Generic_1 [HD-Audio Generic], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 2: Generic_1 [HD-Audio Generic], device 1: ALC662 rev3 Digital [ALC662 rev3 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
答案1
出了什么问题
按照Debian的默认设置,普通用户有使用音频设备的权限仅当本地登录时。从 crontab 执行的命令不是登录会话的一部分,因此 cron 作业不会自动获得使用音频设备的权限。
@reboot
这是默认情况下以普通用户身份运行的 cron 作业无法播放音频的主要原因,即使您使用完全非交互式播放器实用程序也是如此。
第二个原因是大多数音频应用程序都配置为使用 PulseAudio,例如,它允许在播放音频时将音频输出从一个声音芯片切换到另一个声音芯片。但 PulseAudio 是一个用户会话服务:当没有人登录时它不会运行。因此您mplayer
将退回到普通的 ALSA,然后会遇到没有权限的情况,如上所述。
另外,由于通常 PulseAudio 用于输出选择,在这种情况下,您必须以 ALSA 特定的方式指定输出,因为不会涉及 PulseAudio。
目前,您mplayer
默认尝试使用第一个 ALSA 声卡的第一个播放设备 ( /dev/snd/pcmC0D0p
),该设备似乎在您的系统上不存在:您实际的第一个 ALSA 播放设备似乎是/dev/snd/pcmC0D3p
,它是与您的 HDMI 0 显示器关联的音频输出接口,而不是主板的模拟音频输出,后者是/dev/snd/pcmC1D0p
.如果您没有连接到 HDMI 0 的显示器,或者它不支持音频输出,这也会导致尝试使用该设备立即失败。这也许可以解释为什么您尝试以 root 身份播放音频也会失败。
怎么修
文档base-passwd
文件/usr/share/doc/base-passwd/users-and-groups.txt.gz
说:
声音的
该组可在本地使用,以授予一组用户对音频设备的访问权限。
因此,既然您希望debian
用户能够使用音频设备随时,不仅仅是在本地登录时,您应该将用户添加到audio
组中:
sudo usermod -a -G audio debian
这应该允许您使用普通用户的 crontab 来执行此任务,因此您不需要使用 root 的 crontab 来执行此任务。 (如果您出于某种原因需要使音乐静音,您还可以在登录后像自己一样杀死音频播放器,而无需使用 sudo!)
然后你需要在你的 crontabbedmplayer
命令中添加一些选项(如果你真的想要使用视频播放器播放音频):
@reboot /usr/bin/sleep 200;/usr/bin/mplayer -noconsolecontrols -ao alsa:device=hw=2.0 /home/debian/welcome.mp3
对于 crontab 使用,我会考虑使用一些更轻量级的音频播放器,例如mpg321
:
@reboot usr/bin/sleep 200;/usr/bin/mpg321 -q -o alsa -a hw:2,0 /home/debian/welcome.mp3
如果您想消除该sleep 200
部分,您可以添加排序依赖项cron.service
:
sudo systemctl edit cron.service
...然后输入以下行并保存文件:
[Unit]
After=alsa-restore.service
这将添加一个覆盖文件/etc/systemd/system/cron.service.d/override.conf
,其中包含您键入的行。这些行将确保crond
仅在alsa-restore.service
执行(“oneshot”服务)后启动,这意味着所有声音驱动程序均已加载并且系统默认音频混合器级别已设置。现在crond
,在音频子系统准备就绪之前,应该不可能启动。
答案2
你有两个问题。首先,你不应该使用利克,正如您的日志清楚所示:
do_connect: could not connect to socket
connect: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
要纠正此问题,请创建文件(和目录,如果尚不存在)$HOME/.mplayer/config与线
lirc=no
第二个问题是,如果你还没有登录到你的图形会话(X11,大概适合你,但我也使用 Wayland),那么你的 mplayer 就不可能工作:如果你还没有初始化你的程序,它如何打开它的控制台?图形环境?
另一方面,在我看来,希望在(图形!)登录时播放音乐比在启动时播放音乐更有意义。因此我的建议是您在中创建一个自动启动脚本$HOME/.config/自动启动(适用于我的 KDE,可能根据您的 DE 有所不同),内容
[Desktop Entry]
Type=Application
Name=mpl
Exec=bash -c 'sleep 3 && /usr/bin/mplayer -noconsolecontrols "/home/mario/Videos/Two Steps From Hell - Heart of Courage.m4a" 2>/tmp/mplayer.reboot.log'
Terminal=false
Icon=mplayer
Comment=Just show indicator
Categories=Utility;Application;
上面唯一需要注意的是选项-无控制台控件,即运行所必需的播放器在后台。这在 Ubuntu 22.04 KDE 常规安装上运行得很好。
。