![从挂起恢复后以用户身份运行脚本](https://linux22.com/image/204152/%E4%BB%8E%E6%8C%82%E8%B5%B7%E6%81%A2%E5%A4%8D%E5%90%8E%E4%BB%A5%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC.png)
每次我的计算机从挂起状态恢复时(我经常这样做),音频都会变得有点混乱。我在计算机上使用 EasyEffects EQ,它在启动时运行以应用均衡器。然而,当我的计算机从睡眠状态恢复时,默认音频设备会变得有点混乱。默认设置为 EasyEffects EQ,但音频会消失仅有的到 EasyEffects,因为这是默认的音频接收器。
通常,设置为默认的设备是我的普通模拟接收器。当我使用 pavucontrol 来解决此问题时,如果我将模拟接收器设置为默认值,则音频仅通过它,没有情商,但如果我将默认值设置为 EasyEffects EQ,效果很好。虽然它之前是默认设置,但只有在将我的模拟接收器设置为默认设置,然后将 EQ 设置为默认设置后,它才起作用。
我正在尝试使用 systemd 制作一个脚本来解决这个问题,它的作用是:使用 pactl 将我的模拟接收器设置为默认值,然后将我的 EQ 接收器设置为默认值。这样做的问题是,使服务从睡眠状态恢复后运行的目标仅适用于普通的 systemd 服务,而不适用于“--user”systemd 服务。我该如何解决?如果我尝试将其作为“用户”systemd 服务运行,它可以工作,但从睡眠状态恢复后不会自动启动。如果我将它作为普通的 systemd 服务运行,它就不起作用,因为即使我在 systemd 服务中指定“用户”和“环境”,“sudo pactl”也不起作用。
有没有其他方法可以让它在挂起后运行?或者也许让普通(根)systemd 服务运行该特定命令我的用户没有任何root权限?
从挂起恢复后运行的脚本:
#! /usr/bin/sh
pactl set-default-sink alsa_output.pci-0000_09_00.3.analog-stereo
pactl set-default-source alsa_input.pci-0000_09_00.3.analog-stereo
sleep 20
pactl set-default-sink easyeffects_sink
pactl set-default-source easyeffects_source
答案1
/usr/lib/systemd/system-sleep
在;下创建一个脚本名称并不重要,但它必须由 root 拥有并具有可执行权限。- Systemd 将调用相同的脚本前和后暂停,将第一个参数作为“pre”或“post”传递以指示哪个。
- 在将以 root 身份运行的脚本中,您可以使用
sudo
(或su
,取决于您的偏好)以另一个用户身份启动第二个脚本
例如
sudo touch /usr/lib/systemd/system-sleep/custom-suspend.sh;
sudo chmod 744 /usr/lib/systemd/system-sleep/custom-suspend.sh;
示例脚本:
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin
if [[ "${1}" == "post" ]]; then
#AFTER resume
# version 1
sudo -u someuser -i /path/to/script2.sh
# alternative version
# su - someuser -c /path/to/script2.sh
fi
系统信息来源: https://blog.christophersmart.com/2016/05/11/running-scripts-before-and-after-suspend-with-systemd/
答案2
在上面答案的帮助下,我设法让它发挥作用!阅读本文后,我在 /lib/systemd/system-sleep/easyeffects 中创建了一个脚本https://github.com/wwmm/easyeffects/issues/1304并使用那里提到的脚本。它不起作用,所以我用本主题中提供的信息对其进行了修改,并且它起作用了!以下是脚本。第一个是 GitHub 问题中的,最后一个是对我有用的
# easyeffects - systemd suspend/resume hook
case $1 in
pre) pkill easyeffects ;;
post) easyeffects --gapplication-service ;;
esac
#!/bin/sh
# easyeffects - systemd suspend/resume hook
case $1 in
pre) pkill easyeffects ;;
post) sudo -u USER-NAME DISPLAY=:0 XDG_RUNTIME_DIR=/run/user/1000 easyeffects --gapplication-service ;;
esac