Je suis curieux de savoir quelle est cette différence entre les programmes qui le sont; démarré avec systemd lorsqu'il est activé via systemctl, par rapport à ceux démarrés via /etc/rc.local
ou via la CLI.
Par exemple, j'utilisais récemment shairport-sync pour le raspberry pi. Initialement, j'ai défini shairport-sync pour démarrer au moyen de sudo systemctl activé shairport-sync.
Plus tard sur la route, j'ai utilisé une fonctionnalité à l'intérieur shairport-sync
pour exécuter des scripts avant et poster sur les appareils se connectant.
À ma grande surprise, les scripts lorsqu'elles sont exécutées par shairport-sync
ne pas kill
arecord
ouaplay
Cependant, lorsque j'exécutais le script via un terminal, le script était exécuté et tué arecord
et aplay
.
Pour m'embrouiller davantage, je l'ai tué shairport-sync
et démarré via le terminal pour voir la sortie de ce qui se passait. Quand je l'ai fait, les scripts ont fonctionné comme je m'y attendais lorsque l'appareil s'est connecté et tué arecord
et aplay
. Donc, comme j'ai désactivé fix shairport-sync
dans sysmtectl
et mis à fonctionner en /etc/rc.local
tant que solution rapide. Après reboot
ça a fonctionné comme je m'y attendais.
Cela m'amène à croire qu'il existe une certaine différence entre un programme exécuté séparément systemd
et un programme qui s'exécute lorsqu'il est démarré via /etc/rc.local
ou l'interface CLI.
Pourquoi cela arrive-t-il? Est-ce à cause de différents niveaux d'exécution? De la magie noire?
Le script exécuté lorsqu'un périphérique se connecte à shairport-sync
est le suivant:shairportstart.sh
#!/bin/sh
/usr/bin/sudo /bin/pkill arecord
if [ $(date +%H) -ge "18" -o $(date +%H) -le "7" ]; then
/usr/bin/amixer set Speaker 40%
else
/usr/bin/amixer set Speaker 100%
fi
/home/pi/shScripts/shairportfade.sh&
exit 0
Voici le script de fondu: shairportfade.sh
#!/bin/sh
/usr/bin/amixer set Speaker 30-
for (( i=0; i<30; i++))
do
/usr/bin/amixer set Speaker 1+
done
exit 0
Le script exécuté lorsqu'un périphérique se déconnecte de shairport-sync
est le suivant:shairportend.sh
#!/bin/sh
/usr/bin/amixer set Speaker 70%
/usr/bin/arecord -D plughw:1 -f dat | /usr/bin/aplay -D plughw:1 -f dat&
exit 0
J'ai trouvé l'erreur suivante dans le /var/log/syslog
seul lorsque shairport-sync a été initialement exécuté en tant que séparé systemd
. Quand a shairport-sync
été exécuté à partir de la CLI ou /etc/rc.local
il n'y avait aucune erreur présente.
Jan 24 00:38:45 raspberrypi shairport-sync[617]: sudo: no tty present and no askpass program specified
Veuillez noter que la seule différence réside shairport-sync
dans le démarrage initial, lorsque les appareils se connectent ou se déconnectent shairport-sync
continuent de fonctionner.
/home/pi/shScripts/shairportfade.sh
?
rc.local
ps ... awk ... grep ...
truc pourrait être remplacé par un plus simplepkill