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 RunAtLoadagent 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 onLogoutfonction 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 unloadappel), 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 onLogoutfonction, 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 muteet After muteprésentes.
Et je ne crois pas que la raison en soit que l’ osascriptappel pour la mise en sourdine échoue lorsqu’une déconnexion est effectuée. En raison de la set -o errexitligne 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 mutingligne dans mon fichier journal. En effet, lorsque j'ai testé cela en remplaçant la osascriptligne par un élément dont l'échec était garanti, le journal contenait uniquement la Before mutingligne attendue.
Je n'arrive pas à expliquer ce qui se passe. Il onLogoutest clair que la fonction est appelée correctement, comme expliqué ci-dessus, mais pour une raison quelconque, l' osascriptappel 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.