J'essaie de créer un script pour couper le volume du système. Ce script est déclenché à la fermeture ou à la fermeture de session. Cela évite d’entendre très fort le carillon de démarrage au prochain démarrage de la machine.
À l'aide des instructions fournies dans ce message , j'ai créé un RunAtLoad
agent de lancement qui appelle le script présenté ci-dessous:
#!/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
L'idée est que le script est appelé et mis en veille jusqu'à ce qu'il reçoive l'un des signaux piégés. La onLogout
fonction est alors appelée pour couper le volume.
Actuellement, il ne fonctionne pas comme prévu. Le volume reste inchangé lorsque je me déconnecte puis me reconnecte. Toutefois, j'ai constaté que, si je décharge manuellement l'agent de lancement qui lance le script (à l'aide d'un launchctl unload
appel), il fonctionne parfaitement. Le volume du système est immédiatement coupé.
Au début, je pensais que le script ne recevait peut-être pas les signaux piégés lorsque je me déconnectais. Mais après avoir ajouté du code de débogage à la onLogout
fonction, comme indiqué ci-dessous, j’ai éliminé cela comme cause possible.
onLogout ()
{
printf "Before mute\n" >> ~/Desktop/log.txt
osascript -e "set volume output volume 0"
printf "After mute\n" >> ~/Desktop/log.txt
exit
}
Lorsque j'ai effectué une déconnexion et une nouvelle connexion, il y avait un "log.txt"
fichier sur le bureau avec les deux lignes de débogage Before mute
et After mute
présentes.
Et je ne crois pas que la raison en soit que l’ osascript
appel pour la mise en sourdine échoue lorsqu’une déconnexion est effectuée. En raison de la set -o errexit
ligne dans le script, si une partie du script échoue, il doit alors en arrêter l'exécution et quitter immédiatement. Cela signifie que si l'opération de mise en sourdine échoue, je ne devrais pas voir la After muting
ligne dans mon fichier journal. En effet, lorsque j'ai testé cela en remplaçant la osascript
ligne par un élément dont l'échec était garanti, le journal contenait uniquement la Before muting
ligne attendue.
Je n'arrive pas à expliquer ce qui se passe. Il onLogout
est clair que la fonction est appelée correctement, comme expliqué ci-dessus, mais pour une raison quelconque, l' osascript
appel ne semble être exécuté que lorsque je décharge manuellement en utilisant launchctl
. Lorsque je me déconnecte manuellement, il l'ignore en quelque sorte.
Toute aide serait grandement appréciée.