Мне любопытно, какова эта разница между программами; запускается с systemd при включении через systemctl, против тех, которые запускаются с помощью /etc/rc.local
или через CLI.
Например, недавно я использовал shairport-sync для Raspberry Pi. Изначально я установил запуск shairport-sync с помощью sudo systemctl с включенным shairport-sync.
Позже я использовал функциональность shairport-sync
для запуска сценариев и публикации сообщений для подключения к устройствам.
К моему удивлению, сценарии , когда выполняется shairport-sync
не kill
arecord
илиaplay
Тем не менее, когда я запускаю скрипт через терминал, скрипт выполняется и убивается arecord
и aplay
.
Чтобы еще больше запутать себя, я убил shairport-sync
и запустил его через терминал, чтобы увидеть вывод происходящего. Когда я это сделал, скрипты работали так, как я ожидал, когда устройство подключалось и отключалось arecord
и aplay
. Так что , как исправить я отключил shairport-sync
в sysmtectl
и установить его для работы в /etc/rc.local
качестве быстрого решения. После того, как reboot
он функционировал, как я ожидал.
Это наводит меня на мысль, что есть некоторая разница между программой, запускаемой отдельно, systemd
и программой, которая запускается при запуске через /etc/rc.local
CLI.
Почему это происходит? Это из-за разных уровней запуска? Немного темной магии?
Сценарий, который запускается при подключении устройства, shairport-sync
выглядит следующим образом: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
Вот сценарий исчезновения: 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
Сценарий, который запускается при отключении устройства, shairport-sync
выглядит следующим образом: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
Я обнаружил следующую ошибку /var/log/syslog
только в том случае, если shairport-sync изначально запускался отдельно systemd
. Когда shairport-sync
запускался из CLI или /etc/rc.local
ошибок не было.
Jan 24 00:38:45 raspberrypi shairport-sync[617]: sudo: no tty present and no askpass program specified
Обратите внимание, что единственная разница заключается в том, как shairport-sync
изначально запускается, когда устройства подключаются или отключаются, shairport-sync
продолжает работать.
/home/pi/shScripts/shairportfade.sh
?
rc.local
ps ... awk ... grep ...
материал может быть заменен более простымpkill