无法使用 Cron 安排音频音量更改(直接在 cron、python 等中尝试过...)

无法使用 Cron 安排音频音量更改(直接在 cron、python 等中尝试过...)

我在 Raspberry Pi 中发布了这个,但被告知它更适合一般的 Linux 或编程领域。所以我想我现在就在这里问...

我正在组装一个可以播放视频的信息亭。我正在使用带有 Raspberry Pi 桌面的 NUC。一切正常,但使用 Cron 自动化音频。我在学校工作,白天的爆炸声有点糟糕,所以我希望它根据一天中的时间进行改变。

从终端运行时,以下代码有效:

/usr/bin/amixer set Master 16384

amixer sset 'Master' 16384

所以,我把它放入 Cron 中:

15 09 * * * /usr/bin/amixer set Master 16384

43 09 * * * amixer sset 'Master' 16384

没有什么。美好的。所以我制作了一个非常简单的Python脚本来运行(是的,我意识到我把它放在一个系统文件夹中,我打算移动它,它只是在那里结束了。)

#!/usr/bin/env python3

from subprocess import call
call(["/usr/bin/amixer", "set", "Master", "65536"])

我使它可执行:

chmod +x /etc/python/sound100.py

然后我从终端调用它:

/etc/python/sound100.py

/usr/bin/python3 /etc/python/sound100.py

再说一次,它有效。耶。它进入了 Cron。两者都不:

11 10 * * * python3 /etc/python/sound100.py

也不

11 10 * * * /usr/bin/python3 /etc/python/sound100.py

甚至不

11 10 * * * /etc/python/sound100.py

什么都不起作用。

因此开始实际的故障排除。我检查系统日志。一切都在运行,但我了解到,当我作为sudo命令运行它时,它说作为 sudoer 运行时最大音量为 83。所以这意味着我无法从 from 运行它sudo crontab -e,但我开始从用户的 cron 运行它。

依然没有。因此,我尝试将其作为 sudoer 运行,但事先与用户一起运行。又什么都没有了。

请帮我。我只想自动调整音量,而无需登录 ssh,为我们每天放置 3 次的每个 NUC 提供服务,直到我退出或退休。

谢谢你!

答案1

在我收到所有帮助后,我最终找到了解决方案。这不是我真正想要的解决方案,也不是很干净,但它有效,所以我将其发布在这里。

我所理解的问题

问题的核心似乎是,无论我做什么,以通用用户身份运行 Amixer 都会提升到 Sudo 权限,而让另一个用户只是运行音频 Cronjobs 是行不通的。

这导致通过终端手动发送的每个 amixer 命令将音量调整到最大值 65536,并且通过 Cron 发送的每个命令将音量调整到最大值 88。无论我做什么,这种巨大的差异都会导致音频有效静音。

感谢这里两个人的大量帮助,我得出的结论是,这可能是因为一个人正在尝试运行 bash,另一个人正在运行 sh。但要让两人和解似乎是不可能的。

我最终放弃了并完全改变了我一起运行物理组件的方式......

所以,这是我的解决方案:

切换到 HDMI 转 AGP 适配器后,我将一个简单的 3.5 毫米公对公音频插孔从 NUC 插入电视。我使用的电视允许来自 AGP 的视频和来自 3.5mm 的音频,因此现在我可以将视频传输到电视,但需要Stereo Output在 NUC 上切换到音频才能使其正常工作。

之后我跑去amixer scontents查看sudo amixer scontents信息。Master正如我所期望的那样,显示了两个单独的值,但PCM现在显示了 255,这是以前没有的。

考虑到这一点,我将焦点从 Master 转移到 PCM,并使用以下内容更新了 Crontab:

40 06 * * 1-5 amixer sset 'PCM' 191 2> /tmp/cronVolumeLog

25 07 * * 1-5 amixer sset 'PCM' 64 2> /tmp/cronVolumeLog

40 14 * * 1-5 amixer sset 'PCM' 128 2> /tmp/cronVolumeLog

现在一切都按我预期的方式工作,尽管使用音频插孔时出现一些噼啪声和其他小问题,但我只需要处理它们。

我知道这不是问题的最诚实的答案,但这是我在经过(字面意思)几天的搜索并与愿意帮助我的人合作后发现的唯一对我有用的答案。

我希望有一天有人会看到这篇文章并比我走得更远并找到解决方案。或者快速放弃并继续他们的生活,并对愚蠢的音频插孔感到满意。

但我学到了很多东西,所以就是这样。

答案2

我现在没有地方可以测试这个,但是经常cron您所描述的类型的失败原因是环境。如果您printenv从命令行运行,并将该输出与作为作业printenv运行的输出进行比较,您可以轻松地看到这一点。cron例如:

* * * * * /path/to/printenv > /home/pi/cron_env.txt 2>&1 

您会发现两个输出有很多差异。您也许可以通过列表进行选择,并确定造成问题的环境变量 - 我记得 RPi OS 为某些音频和蓝牙功能创建了特殊组,但我无法从记忆中回忆起它们。

假设您使用的是bash输入命令的 shell,一个更简单的方法可能是调用bash -l运行以下命令crontab

15 09 * * * bash -l /usr/bin/amixer set Master 16384 
43 09 * * * bash -l /usr/bin/amixer sset 'Master' 16384

stderr而且,正如评论中所建议的,使用以下命令进行重定向来捕获文件中的任何输出始终是一个好主意amixer

15 09 * * * bash -l /usr/bin/amixer set Master 16384 2> /home/pi/cronErrorLog.txt 

答案3

随着 OP 的扩展,通过 cron 运行 amixer 是作为 sudo 用户完成的。我发现,您将拥有“耳机”或类似的设备来控制 AV 输出,而不是“主设备”。无需摆弄音量级别的原始值,只需使用百分比将音量设置为所需级别。 IE

15 09 * * * /usr/bin/amixer set Master 100\%

注意:上例中百分号被转义。

答案4

我的解决方案是

* * * * * export XDG_RUNTIME_DIR=/run/user/1000 && /usr/bin/amixer -D pulse sset Master 50\%

在我的环境中似乎需要 XDG_RUNTIME_DIR 。

相关内容