Saya ingin tahu apa perbedaan antara program yang ada; dimulai dengan systemd ketika diaktifkan melalui systemctl, vs yang dimulai dengan /etc/rc.local
atau melalui CLI.
Sebagai contoh, saya baru-baru ini menggunakan shairport-sync untuk pi raspberry. Awalnya, saya mengatur shairport-sync untuk memulai dengan cara sudo systemctl mengaktifkan shairport-sync.
Kemudian di jalan saya menggunakan fungsi di dalam shairport-sync
untuk menjalankan skrip sebelum dan mengirim ke perangkat yang terhubung.
Yang mengejutkan saya, skrip ketika dieksekusi oleh shairport-sync
tidak kill
arecord
atauaplay
Namun, ketika saya akan menjalankan skrip melalui terminal skrip dieksekusi dan dibunuh arecord
dan aplay
.
Untuk lebih membingungkan diri saya, saya membunuh shairport-sync
dan memulainya melalui terminal untuk melihat hasil dari apa yang terjadi. Ketika saya melakukannya skrip berfungsi seperti yang saya harapkan ketika perangkat terhubung dan membunuh arecord
dan aplay
. Jadi, sebagai memperbaiki saya dinonaktifkan shairport-sync
di sysmtectl
dan mengaturnya untuk berjalan dalam /etc/rc.local
sebagai perbaikan cepat. Setelah reboot
itu berfungsi seperti yang saya harapkan.
Hal ini membuat saya percaya bahwa ada beberapa perbedaan antara program yang dijalankan sebagai bagian dari systemd
dan program yang berjalan ketika dimulai melalui /etc/rc.local
atau CLI.
Mengapa ini terjadi? Apakah ini karena level run yang berbeda? Beberapa sihir gelap?
Skrip yang dijalankan saat perangkat terhubung 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 ini 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 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 terpisah systemd
. Kapan shairport-sync
dijalankan dari CLI atau /etc/rc.local
tidak ada kesalahan hadir.
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 terhubung atau terputus shairport-sync
terus berjalan.
sumber
ps ... awk ... grep ...
hal mungkin diganti dengan sederhanapkill
/home/pi/shScripts/shairportfade.sh
?rc.local
Jawaban:
Variasi "Mengapa segala sesuatu berperilaku berbeda di bawah systemd?" adalah pertanyaan yang sering diajukan.
Setiap kali sesuatu berjalan dari CLI dan bukan dari systemd, ada beberapa kategori luas kemungkinan untuk menjelaskan perbedaan.
systemd
mendokumentasikan variabel lingkungan yang dilewatinya diman systemd.exec
bagian variabel Lingkungan dalam proses spawned . Jika Anda ingin memeriksa sendiri perbedaannya, Anda dapat menggunakannyasystemd-run /path/to/binary
, itu akan menjalankan aplikasi Anda dalam cakupan sementara, karena akan dijalankan oleh layanan systemd. Anda akan mendapatkan output seperti:Running as unit: run-u160.service
. Anda kemudianjournalctl -u run-u160.service
dapat meninjau output. Ubah aplikasi Anda untuk membuang variabel lingkungan yang diterimanya dan membandingkan menjalankan CLI ke menjalankan systemd. Jika aplikasi tidak mudah dimodifikasi, Anda bisa menggunakansystemd-run env
untuk melihat variabel lingkungan yang akan diteruskan dan meninjau jurnal yang dihasilkan untuk itu. Jika Anda mencoba memulai aplikasi GUI X11,DISPLAY
variabel lingkungan perlu diatur. Dalam hal itu, pertimbangkan untuk menggunakan fitur "autostart" lingkungan desktop Andasystemd
.man systemd.resource-control
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.bash
Lingkungan CLI Anda adalah shell login interaktif . Ini memiliki file sumber seperti.bashrc
itusystemd
belum. 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?sudo
danssh
diharapkan beberapa program saat meminta kata sandi. Lihat juga sudo: tidak ada tty yang ada dan tidak ada program askpass yang ditentukanman systemd.service
, argumen pertamaExecStart=
harus menjadi path absolut ke biner.systemd
memiliki sintaks baris perintah yang sangat terbatas . Bergantung pada kebutuhan Anda, Anda mungkin bisa meniru sintaksis Shell dengansystemd
secara eksplisit menjalankan perintah Anda melalui shell:ExecStart=/bin/bash -c '/my/bash $(syntax) >/goes-here.txt'
Ini adalah fitur yang sistem menjalankan kode Anda dalam lingkungan yang konsisten dengan kontrol sumber daya. Ini membantu dengan hasil yang stabil dan dapat direproduksi dalam jangka panjang tanpa membebani perangkat keras.
sumber
sudo
skrip shell lebih baik dijalankansudo shairportstart.sh
dari terminal, karena systemd menjalankan skrip sebagai root, tidak perlu sudo sebagai root./usr/bin/echo "mypassword" | /usr/bin/sudo /bin/pkill arecord
. Kemudian hari ini, saya akan mencoba menghapus perintahsudo
danecho
untuk membunuh perintah saya dan melihat apakah itu menghasilkan hasil yang sama. Dugaan saya adalah itu akan berfungsi, karena tampaknya kesalahan itu disebabkan oleh tidak ada kata sandi yang dikirim dengansudo
perintah. Terima kasih atas bantuannya dalam memahami mengapa ada perbedaan antarasystemd
dan CLI