Sono curioso di sapere quale sia questa differenza tra i programmi; iniziato con systemd quando abilitato tramite systemctl, rispetto a quelli avviati tramite /etc/rc.local
o tramite l' interfaccia della riga di comando .
Ad esempio, recentemente stavo usando shairport-sync per il raspberry pi. Inizialmente, ho impostato shairport-sync per iniziare tramite shadoport-sync abilitato sudo systemctl.
Più tardi lungo la strada ho usato una funzionalità all'interno shairport-sync
per eseguire script prima e inviare ai dispositivi di connessione.
Con mia sorpresa, gli script eseguiti da shairport-sync
non lo hanno fatto kill
arecord
oaplay
Tuttavia, quando eseguivo lo script tramite terminale, lo script veniva eseguito, ucciso arecord
e aplay
.
Per confondermi ulteriormente, l'ho ucciso shairport-sync
e avviato tramite terminale per vedere l'output di ciò che stava accadendo. Quando l'ho fatto, gli script hanno funzionato come mi aspettavo quando il dispositivo si è collegato, ucciso arecord
e aplay
. Così, come una correzione ho disabilitato shairport-sync
in sysmtectl
e impostarlo per l'esecuzione in /etc/rc.local
come una soluzione rapida. Dopo reboot
che ha funzionato come mi aspettavo.
Questo mi porta a credere che ci sia qualche differenza tra un programma eseguito a parte systemd
e un programma che viene eseguito quando avviato tramite /etc/rc.local
o l'interfaccia della riga di comando.
Perché succede? È a causa di diversi livelli di esecuzione? Qualche magia oscura?
Lo script che viene eseguito quando un dispositivo si connette shairport-sync
è il seguente: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
Ecco lo script di dissolvenza: 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
Lo script che viene eseguito quando un dispositivo si disconnette shairport-sync
è il seguente: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
Ho trovato il seguente errore nel /var/log/syslog
solo quando shairport-sync è stato inizialmente eseguito separatamente systemd
. Quando è shairport-sync
stato eseguito dalla CLI o /etc/rc.local
non erano presenti errori.
Jan 24 00:38:45 raspberrypi shairport-sync[617]: sudo: no tty present and no askpass program specified
Si noti che l'unica differenza è come shairport-sync
viene avviato inizialmente, quando i dispositivi si connettono o si disconnettono shairport-sync
continuano a funzionare.
/home/pi/shScripts/shairportfade.sh
?
rc.local
ps ... awk ... grep ...
roba potrebbe essere sostituita da una più semplicepkill