当我忘记在关闭笔记本电脑之前停止视频,然后在公共场合打开笔记本电脑时却播放声音时,我感到很烦人。
我尝试将以下脚本添加到/lib/systemd/system-sleep
:
#!/bin/bash
amixer -q -D pulse sset Master mute
echo 2 >> /home/user/test
该脚本似乎是在暂停时调用的,因为新行被附加到文件中test
(两次,这可能表明该脚本也在恢复时运行 - 有人可以证实这个假设吗?)。
音响系统要么自动重新启动,要么是其他问题。但是amixer
,手动执行命令时,可以正常工作。
有任何想法吗?
答案1
您可以通过创建服务在暂停之前将声音静音systemd
。
首先,确保您的脚本是可执行的:
chmod u+x /path/to/your/script.sh
然后,通过运行以下命令创建
systemd
运行脚本的服务:sudo nano /etc/systemd/system/mute_before_sleep.service
在
nano
窗口中输入以下内容:[Unit] Description=Mute sound before suspend Before=suspend.target [Service] ExecStart=/path/to/your/script.sh User=<your_username> Environment=DISPLAY=:0 [Install] WantedBy=suspend.target
输入
ExecStart=
您的脚本路径并输入User=
您的用户名。nano
按Ctrl+O然后按Ctrl+保存并关闭X。最后启用服务:
sudo systemctl enable mute_before_sleep.service
答案2
TL;DR:执行环境不同,因此 amixer 命令返回错误
该脚本似乎在暂停时被调用,因为新行被附加到“测试”文件
是的,它可以运行,但是我已经测试了你的脚本并且amixer
命令返回一个错误(已用 审查sudo journalctl -b -u systemd-suspend.service
):
Jan 04 18:46:49 administrator-PC systemd-sleep[12969]: ALSA lib control.c:1373:(snd_ctl_open_noupdate) Invalid CTL pulse
Jan 04 18:46:49 administrator-PC systemd-sleep[12969]: amixer: Mixer attach pulse error: No such file or directory
问题似乎是-D pulse
部分原因。但更简单的命令amixer -q set Master mute
有效。恢复后,我的笔记本电脑音量已静音,错误不再出现。
两次 - 这可能表明脚本也在恢复时运行 - 有人可以证实这个假设吗?
是的,脚本运行两次 - 一次在挂起时,一次在恢复时;脚本每次运行时带有两个位置参数systemd-sleep(8)和Arch Wiki 文章我使用的完整脚本如下所示(请注意,调用echo
和的部分date
并不是特别相关并且仅用于调试;它们可以安全地从脚本中删除):
#!/bin/sh
# this will go into journalctl log
echo SUSPEND SCRIPT STARTED
case $1/$2 in
pre/*) amixer -q set Master mute; { echo Suspending; date >> /suspend_log.txt;} ;;
post/*) { echo "Waking up from $2..."; date;} >> /suspend_log.txt ;;
*) echo foobar;;
esac
至于为什么原始 amixer 命令在手动运行时有效,可能是因为当 systemd 运行脚本时,DISPLAY
环境中没有变量。相比之下,当您使用 GUI 终端仿真器时,变量存在,因此原始命令有效。原始命令可以通过以下方式调整以使用环境变量
DISPLAY=:0 amixer -q -D pulse sset Master mute
但我仍然建议使用amixer -q set Master mute
与环境无关的命令。