从挂起恢复后以用户身份运行脚本

从挂起恢复后以用户身份运行脚本

每次我的计算机从挂起状态恢复时(我经常这样做),音频都会变得有点混乱。我在计算机上使用 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

  1. /usr/lib/systemd/system-sleep在;下创建一个脚本名称并不重要,但它必须由 root 拥有并具有可执行权限。
  2. Systemd 将调用相同的脚本暂停,将第一个参数作为“pre”或“post”传递以指示哪个。
  3. 在将以 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

相关内容