Отключить звук динамика из скрипта возобновления systemd

Вопрос или проблема

Я хотел бы отключить мой динамик (на несколько секунд) после выхода из спящего режима, чтобы избежать раздражающих уведомлений.
У меня есть следующий скрипт в /lib/systemd/system-sleep/muteonresume

#!/bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin

case "$1" in
    pre)
            #код выполняется ПЕРЕД переходом в спящий режим/гибернацию/приостановку
            touch /tmp/testpre;
    ;;
    post)
        #код выполняется ПОСЛЕ выхода из спящего режима
        if [ amixer get Master | grep "\[on\]" ]
        then
            # уже отключен
            echo "уже отключен" > /tmp/testpost;
        else
            amixer set Master mute;
            echo "я отключил звук" > /tmp/testpost;
        fi
    ;;
esac

exit 0

Скрипт выполняется как ожидалось, и записывает “я отключил звук” в журнал /tmp/testpost. Однако динамик не отключен. Запуск amixer set Master mute отдельно работает как ожидается, как от моего имени, так и от имени root. Но по какой-то причине это не работает из этого скрипта. (Если только какой-то другой процесс не восстанавливает громкость после этого, чего я не знаю.)

Кто-нибудь знает, почему?

.

Ответ или решение

Как отключить звук динамиков в скрипте systemd после возобновления работы

Вопрос об отключении звука динамиков после выхода из режима сна — это распространенная проблема для пользователей, стремящихся минимизировать нежелательные уведомления и звуки. Вы уже написали скрипт muteonresume, который срабатывает после выхода из режима сна, однако встречаете трудности с выполнением команды amixer set Master mute. Давайте разберем возможные причины и предложим решения.

Проблема

Ваш скрипт записывает информацию о том, что выполнена команда отключения звука, в файл /tmp/testpost, однако сам звук не отключается. Причины могут быть следующие:

  1. Окружение: Когда скрипт выполняется systemd, оно может не иметь того же окружения, что и ваш пользовательский сеанс, включая права доступа и переменные окружения.
  2. Права доступа: Скрипт может выполняться от имени системного пользователя, что может препятствовать корректному выполнению команды amixer.
  3. Состояние звуковой системы: Возможен сценарий, при котором другой процесс или сервис переключает состояние звука сразу после выполнения вашего скрипта.

Решение

  1. Убедитесь в правильности конструкции условия:
    Ваше условие проверки состояния звука имеет небольшую ошибку. Вместо if [ amixer get Master | grep "\[on\]" ] должно быть:

    if amixer get Master | grep -q "\[on\]"
  2. Установите переменные окружения:
    Конкретно настройте переменные окружения, чтобы убедиться, что amixer имеет необходимый контекст. Добавьте следующую строку в начало вашего скрипта:

    export DISPLAY=:0
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
  3. Используйте nohup или setsid:
    Если проблема связана с тем, что другой процесс переключает состояние звука, вы можете попробовать взять amixer под контроль, запустив его в отдельной сессии. Добавьте перед командой amixer:

    (sleep 1; amixer set Master mute) &
  4. Добавьте задержку:
    Ваша скрипт может потребовать небольшой таймаут перед выполнением команды amixer. Например,

    sleep 1
    amixer set Master mute

Обновленный скрипт

Вот как может выглядеть обновленный скрипт, учитывающий указанные рекомендации:

#!/bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export DISPLAY=:0
export XDG_RUNTIME_DIR=/run/user/$(id -u)

case "$1" in
    pre)
        # Код выполнения перед переходом в спящий режим
        touch /tmp/testpre
    ;;
    post)
        # Код выполнения после выхода из режима сна
        if amixer get Master | grep -q "\[on\]"
        then
            # Динамик уже отключен
            echo "already muted" > /tmp/testpost
        else
            sleep 1
            amixer set Master mute
            echo "I muted now" > /tmp/testpost
        fi
    ;;
esac

exit 0

Заключение

С помощью предложенных решений вы сможете более эффективно управлять состоянием звуковой системы после выхода из режима сна. Не забывайте тестировать каждое изменение, чтобы убедиться в его эффективности. Если после всех попыток проблема сохраняется, стоит обратить внимание на другие приложения или настройки, которые могут влиять на уровень звука в вашей системе.

Оцените материал
Добавить комментарий

Капча загружается...