GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan Antara Program Starter Systemd Dan Terminal?

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.

  1. Variabel lingkungan yang berbeda . systemd mendokumentasikan variabel lingkungan yang dilewatinya di man systemd.exec di bagian Variabel lingkungan dalam proses yang muncul. Jika Anda ingin memeriksa sendiri perbedaannya, Anda dapat menggunakan systemd-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 dapat journalctl -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 menggunakan systemd-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-alih systemd .
  2. Pembatasan sumber daya . Lihat man systemd.resource-control untuk nilai konfigurasi yang dapat membatasi konsumsi sumber daya. Gunakan systemctl show your-unit-unit.service untuk memeriksa nilai konfigurasi lengkap yang memengaruhi layanan yang Anda coba mulai.
  3. 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?
  4. Tidak ada TTY . Sesi interaktif Anda terhubung ke TTY yang beberapa program seperti sudo dan ssh harapkan saat meminta kata sandi. Lihat juga sudo:tidak ada tty yang ada dan tidak ada program askpass yang ditentukan
  5. Jalur Relatif vs. Absolut . Biner relatif bekerja di shell, tetapi seperti yang didokumentasikan dalam man systemd.service , argumen pertama untuk ExecStart= harus berupa jalur absolut ke biner.
  6. 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 dengan systemd 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?
Linux
  1. Perbedaan Tepat Antara A 'terminal', A 'shell', A 'tty' Dan A 'konsol'?

  2. Perbedaan Antara Shell Login dan Shell Non-login?

  3. Perbedaan Antara 2>&-, 2>/dev/null, |&, &>/dev/null Dan>/dev/null 2>&1?

  1. Apa Perbedaan Antara Sudo Su – Dan Sudo Su —?

  2. Perbedaan Antara Eot dan Eof?

  3. Perbedaan Antara [0-9], [[:digit:]] Dan D?

  1. Perbedaan Antara Aplikasi Gtk Dan Qt?

  2. Perbedaan Antara Perpipaan Dan Ekspansi Perintah?

  3. Perbedaan Antara Snat dan Masquerade?