Tôi tò mò không biết sự khác biệt này là gì giữa các chương trình; bắt đầu với systemd khi được kích hoạt thông qua systemctl, so với những cái được bắt đầu bằng phương tiện /etc/rc.local
hoặc thông qua CLI.
Ví dụ, gần đây tôi đã sử dụng shairport-sync cho raspberry pi. Ban đầu, tôi đặt shairport-sync để bắt đầu bằng sudo systemctl kích hoạt shairport-sync.
Sau này, tôi đã sử dụng một chức năng bên trong shairport-sync
để chạy các tập lệnh trước và đăng lên các thiết bị kết nối.
Thật ngạc nhiên, các tập lệnh khi được thực thi bởi shairport-sync
không kill
arecord
hoặcaplay
Tuy nhiên, khi tôi chạy tập lệnh qua terminal, tập lệnh được thực thi và bị giết arecord
và aplay
.
Để làm tôi bối rối hơn nữa, tôi đã giết shairport-sync
và khởi động nó qua thiết bị đầu cuối để xem kết quả của những gì đang xảy ra. Khi tôi làm như vậy, các kịch bản hoạt động như tôi mong đợi khi thiết bị kết nối và bị giết arecord
và aplay
. Vì vậy, như một sửa chữa tôi bị vô hiệu hóa shairport-sync
trong sysmtectl
và đặt để nó chạy trong /etc/rc.local
sửa chữa gấp gáp. Sau khi reboot
nó hoạt động như tôi mong đợi.
Điều này khiến tôi tin rằng có một số khác biệt giữa chương trình chạy ngoài systemd
và chương trình chạy khi bắt đầu thông qua /etc/rc.local
hoặc CLI.
Lý do tại sao điều này xảy ra? Đây có phải là do mức độ chạy khác nhau? Một số ma thuật đen tối?
Kịch bản được chạy khi thiết bị kết nối shairport-sync
như sau: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
Đây là kịch bản mờ dần: 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
Tập lệnh được chạy khi thiết bị ngắt kết nối shairport-sync
như sau: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
Tôi chỉ tìm thấy lỗi sau /var/log/syslog
khi đồng bộ hóa shairport ban đầu chạy ngoài systemd
. Khi shairport-sync
được chạy từ CLI hoặc /etc/rc.local
không có lỗi.
Jan 24 00:38:45 raspberrypi shairport-sync[617]: sudo: no tty present and no askpass program specified
Xin lưu ý rằng sự khác biệt duy nhất là cách shairport-sync
khởi động ban đầu, khi các thiết bị kết nối hoặc ngắt kết nối shairport-sync
tiếp tục chạy.
/home/pi/shScripts/shairportfade.sh
?
rc.local
ps ... awk ... grep ...
những thứ có thể được thay thế bằng một đơn giản hơnpkill