Вопрос или проблема
Я хотел бы отключить мой динамик (на несколько секунд) после выхода из спящего режима, чтобы избежать раздражающих уведомлений.
У меня есть следующий скрипт в /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
, однако сам звук не отключается. Причины могут быть следующие:
- Окружение: Когда скрипт выполняется systemd, оно может не иметь того же окружения, что и ваш пользовательский сеанс, включая права доступа и переменные окружения.
- Права доступа: Скрипт может выполняться от имени системного пользователя, что может препятствовать корректному выполнению команды
amixer
. - Состояние звуковой системы: Возможен сценарий, при котором другой процесс или сервис переключает состояние звука сразу после выполнения вашего скрипта.
Решение
-
Убедитесь в правильности конструкции условия:
Ваше условие проверки состояния звука имеет небольшую ошибку. Вместоif [ amixer get Master | grep "\[on\]" ]
должно быть:if amixer get Master | grep -q "\[on\]"
-
Установите переменные окружения:
Конкретно настройте переменные окружения, чтобы убедиться, чтоamixer
имеет необходимый контекст. Добавьте следующую строку в начало вашего скрипта:export DISPLAY=:0 export XDG_RUNTIME_DIR=/run/user/$(id -u)
-
Используйте
nohup
илиsetsid
:
Если проблема связана с тем, что другой процесс переключает состояние звука, вы можете попробовать взятьamixer
под контроль, запустив его в отдельной сессии. Добавьте перед командойamixer
:(sleep 1; amixer set Master mute) &
-
Добавьте задержку:
Ваша скрипт может потребовать небольшой таймаут перед выполнением команды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
Заключение
С помощью предложенных решений вы сможете более эффективно управлять состоянием звуковой системы после выхода из режима сна. Не забывайте тестировать каждое изменение, чтобы убедиться в его эффективности. Если после всех попыток проблема сохраняется, стоит обратить внимание на другие приложения или настройки, которые могут влиять на уровень звука в вашей системе.