Silenciar el volumen del sistema al cerrar sesión con el agente de inicio

1

Estoy intentando crear una secuencia de comandos para silenciar el volumen del sistema que se activa al cerrar o cerrar sesión. Esto es para evitar escuchar el sonido de inicio muy fuerte la próxima vez que inicie la máquina.

Usando las instrucciones proporcionadas en esta publicación , He creado un agente de lanzamiento RunAtLoad que llama al script que se muestra a continuación:

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

IFS=$'\n\t'

onLogout ()
{
    osascript -e "set volume output volume 0"
    exit
}

trap onLogout SIGINT SIGHUP SIGTERM

while true; do
    say starting
    sleep 86400 &
    wait $!
done

La idea es que el script se llame y se ponga en reposo hasta que reciba una de las señales atrapadas, en cuyo punto se llama a la función onLogout para silenciar el volumen.

Actualmente no funciona como estaba previsto, el volumen no se modifica cuando cierro sesión y vuelvo a iniciar sesión. Sin embargo, he descubierto que si descargo manualmente el agente de inicio que inicia el script (con una llamada launchctl unload ), entonces funciona perfectamente. El volumen del sistema se silencia inmediatamente.

Inicialmente, pensé que tal vez las señales atrapadas no estaban siendo recibidas por la secuencia de comandos cuando realizaba un cierre de sesión. Pero después de agregar algún código de depuración a la función onLogout como se muestra a continuación, eliminé esto como una posible causa.

onLogout ()
{
    printf "Before mute\n" >> ~/Desktop/log.txt
    osascript -e "set volume output volume 0"
    printf "After mute\n" >> ~/Desktop/log.txt
    exit
}

Cuando realicé un cierre de sesión y volví a iniciar sesión, había un archivo "log.txt" en el escritorio con las líneas de depuración de Before mute y After mute presentes.

Y no creo que la razón sea que la llamada osascript para realizar el silenciamiento está fallando de alguna manera cuando se lleva a cabo un cierre de sesión. Debido a la línea set -o errexit en la secuencia de comandos, si alguna parte de la secuencia de comandos falla, debe detener la ejecución y salir inmediatamente. Esto significa que si la operación de anulación falla, no debería ver la línea After muting en mi archivo de registro. De hecho, cuando probé esto reemplazando la línea osascript con algo que sabía que estaba garantizado para fallar, el registro solo contenía la línea Before muting como se esperaba.

No puedo explicar lo que está pasando. Claramente, la función onLogout se está llamando correctamente como se explicó anteriormente, pero por alguna razón, la llamada osascript parece que solo se ejecuta cuando descargo manualmente usando launchctl . Cuando me desconecto manualmente, simplemente lo omite de alguna manera.

Cualquier ayuda sería muy apreciada.

    
pregunta fractal_sounds 01.11.2017 - 20:17

1 respuesta

0

En la Terminal, ejecute el siguiente comando para deshabilitar el timbre por completo hasta que se vuelva a habilitar:

sudo nvram SystemAudioVolume=%80

Si esta configuración no se conserva, intente:

sudo nvram SystemAudioVolume=%01

sudo nvram SystemAudioVolume=%00

o

sudo nvram SystemAudioVolume=" "

Para volver a habilitar el timbre:

sudo nvram -d SystemAudioVolume

Información obtenida de:

enlace

enlace

    
respondido por el IconDaemon 01.11.2017 - 20:27

Lea otras preguntas en las etiquetas