Saya ingin tahu apa perbedaan antara program-program itu; dimulai dengan systemd ketika diaktifkan melalui systemctl, vs yang dimulai melalui /etc/rc.local
atau melalui CLI.
Misalnya, saya baru-baru ini menggunakan shairport-sync untuk raspberry pi. Awalnya, saya mengatur shairport-sync untuk memulai melalui sudo systemctl enabled shairport-sync.
Belakangan saya menggunakan fungsi dalam shairport-sync
untuk menjalankan skrip sebelum dan memposting ke perangkat yang terhubung.
Yang mengejutkan saya, skrip ketika dijalankan oleh shairport-sync
tidak kill
arecord
atau aplay
Namun, ketika saya menjalankan skrip melalui terminal, skrip dieksekusi dan membunuh arecord
dan aplay
.
Untuk lebih membingungkan diri saya sendiri, saya membunuh shairport-sync
dan memulainya melalui terminal untuk melihat output dari apa yang terjadi. Ketika saya melakukannya, skrip berfungsi seperti yang saya harapkan ketika perangkat terhubung dan mematikan arecord
dan aplay
. Jadi, sebagai perbaikan saya menonaktifkan shairport-sync
di sysmtectl
dan atur agar berjalan di /etc/rc.local
sebagai perbaikan cepat. Setelah reboot
itu berfungsi seperti yang saya harapkan.
Ini membuat saya percaya bahwa ada beberapa perbedaan antara program yang dijalankan sebagai bagian dari systemd
dan program yang berjalan saat dimulai melalui /etc/rc.local
atau CLI.
Mengapa ini terjadi? Apakah ini karena level lari yang berbeda? Beberapa sihir hitam?
Skrip yang dijalankan saat perangkat terhubung ke shairport-sync
adalah sebagai berikut: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
Berikut adalah skrip fade: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
Skrip yang dijalankan saat perangkat terputus ke shairport-sync
adalah sebagai berikut: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
Saya menemukan kesalahan berikut di /var/log/syslog
hanya ketika shairport-sync awalnya dijalankan sebagai bagian dari systemd
. Saat shairport-sync
dijalankan dari CLI atau /etc/rc.local
tidak ada kesalahan.
Jan 24 00:38:45 raspberrypi shairport-sync[617]: sudo: no tty present and no askpass program specified
Harap dicatat, bahwa satu-satunya perbedaan adalah bagaimana shairport-sync
awalnya dimulai, ketika perangkat menghubungkan atau memutuskan shairport-sync
terus berjalan.
Jawaban yang Diterima:
Variasi dari “Mengapa hal-hal berperilaku berbeda di bawah systemd?” adalah pertanyaan yang sering diajukan.
Setiap kali sesuatu berjalan dari CLI dan bukan dari systemd, ada beberapa kategori kemungkinan yang luas untuk menjelaskan perbedaan.
- Variabel lingkungan yang berbeda .
systemd
mendokumentasikan variabel lingkungan yang dilewatinya diman systemd.exec
di bagian Variabel lingkungan dalam proses yang muncul. Jika Anda ingin memeriksa sendiri perbedaannya, Anda dapat menggunakansystemd-run /path/to/binary
, itu akan menjalankan aplikasi Anda dalam lingkup sementara, karena akan dijalankan oleh layanan systemd. Anda akan mendapatkan output seperti:Running as unit: run-u160.service
. Anda kemudian dapatjournalctl -u run-u160.service
untuk meninjau keluaran. Ubah aplikasi Anda untuk membuang variabel lingkungan yang diterimanya dan bandingkan CLI run dengan systemd run. Jika aplikasi tidak mudah dimodifikasi, Anda cukup menggunakansystemd-run env
untuk melihat variabel lingkungan yang akan dilewatkan dan meninjau log jurnal yang dihasilkan untuknya. Jika Anda mencoba memulai aplikasi GUI X11,DISPLAY
variabel lingkungan perlu diatur. Dalam hal ini, pertimbangkan untuk menggunakan fitur "autostart" lingkungan desktop Anda alih-alihsystemd
. - Pembatasan sumber daya . Lihat
man systemd.resource-control
untuk nilai konfigurasi yang dapat membatasi konsumsi sumber daya. Gunakansystemctl show your-unit-unit.service
untuk memeriksa nilai konfigurasi lengkap yang memengaruhi layanan yang Anda coba mulai. - Cangkang non-interaktif .
bash
. Anda Lingkungan CLI adalah shell login interaktif . Ini memiliki file sumber seperti.bashrc
systemd
. itu sudah tidak. Selain mengatur variabel lingkungan, skrip ini dapat melakukan sejumlah hal lain, seperti menghubungkan agen SSH sehingga tindakan SSH tidak memerlukan login. Lihat juga Perbedaan antara Shell Login dan Shell Non-Login? - Tidak ada TTY . Sesi interaktif Anda terhubung ke TTY yang beberapa program seperti
sudo
danssh
harapkan saat meminta kata sandi. Lihat juga sudo:tidak ada tty yang ada dan tidak ada program askpass yang ditentukan - Jalur Relatif vs. Absolut . Biner relatif bekerja di shell, tetapi seperti yang didokumentasikan dalam
man systemd.service
, argumen pertama untukExecStart=
harus berupa jalur absolut ke biner. - Sintaks baris perintah terbatas . Shell CLI mendukung banyak metakarakter, sedangkan
systemd
memiliki sintaks baris perintah yang sangat terbatas. Bergantung pada kebutuhan Anda, Anda mungkin dapat mereplikasi sintaks Shell dengansystemd
dengan menjalankan perintah Anda secara eksplisit melalui shell:ExecStart=/bin/bash -c '/my/bash $(syntax) >/goes-here.txt'
Ini adalah fitur yang sistem menjalankan kode Anda di lingkungan yang konsisten dengan kontrol sumber daya. Ini membantu dengan hasil yang stabil dan dapat direproduksi dalam jangka panjang tanpa membebani perangkat keras.
Terkait:Apa yang ditunjukkan oleh proses STAT ini?