Мне любопытно, какова эта разница между программами; запускается с 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.localCLI.
Почему это происходит? Это из-за разных уровней запуска? Немного темной магии?
Сценарий, который запускается при подключении устройства, 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