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.localhoặ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-synckhông kill arecordhoặ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 arecordvà aplay.
Để làm tôi bối rối hơn nữa, tôi đã giết shairport-syncvà 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 arecordvà aplay. Vì vậy, như một sửa chữa tôi bị vô hiệu hóa shairport-synctrong sysmtectlvà đặt để nó chạy trong /etc/rc.localsửa chữa gấp gáp. Sau khi rebootnó 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 systemdvà chương trình chạy khi bắt đầu thông qua /etc/rc.localhoặ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-syncnhư 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-syncnhư 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/syslogkhi đồng bộ hóa shairport ban đầu chạy ngoài systemd. Khi shairport-syncđược chạy từ CLI hoặc /etc/rc.localkhô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-synckhởi động ban đầu, khi các thiết bị kết nối hoặc ngắt kết nối shairport-synctiế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