Waktu berubah dan begitu juga praktik terbaik.
Cara terbaik saat ini untuk melakukannya adalah menjalankan systemctl edit myservice
, yang akan membuat file override untuk Anda atau membiarkan Anda mengedit yang sudah ada.
Dalam instalasi normal ini akan membuat direktori /etc/systemd/system/myservice.service.d
, dan di dalam direktori itu membuat file yang namanya berakhir dengan .conf
(biasanya, override.conf
), dan dalam file ini Anda dapat menambah atau menimpa bagian mana pun dari unit yang dikirimkan oleh distribusi.
Misalnya, dalam file /etc/systemd/system/myservice.service.d/myenv.conf
:
[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"
Perhatikan juga bahwa jika direktori ada dan kosong, layanan Anda akan dinonaktifkan! Jika Anda tidak bermaksud memasukkan sesuatu ke dalam direktori, pastikan itu tidak ada.
Untuk referensi, cara lama adalah:
Cara yang disarankan untuk melakukan ini adalah membuat file /etc/sysconfig/myservice
yang berisi variabel Anda, dan kemudian memuatnya EnvironmentFile
.
Untuk detail selengkapnya, lihat dokumentasi Fedora tentang cara menulis skrip systemd .
sysconfig
jalurnya khusus untuk Fedora tetapi pertanyaannya adalah tentang Arch Linux. Jawaban paluh lebih menarik menurut saya/etc/sysconfig
khusus untuk Fedora. AFAIR Arch Linux mendorong untuk memiliki file konfigurasi di suatu tempat paket khusus daripada di/etc
lokasi khusus Fedora. Seperti/etc/myservice.conf
, meskipun menggunakan file tambahan sepertinya tidak tepat di sini.DJANGO_SETTINGS_MODULE=project.settings
, satu per baris.Jawabannya tergantung pada apakah variabel seharusnya konstan (yaitu, tidak seharusnya dimodifikasi oleh pengguna mendapatkan unit) atau variabel (seharusnya ditetapkan oleh pengguna).
Karena ini adalah unit lokal Anda, batasnya cukup buram dan bagaimanapun cara kerjanya. Namun, jika Anda mulai mendistribusikannya dan akan berakhir
/usr/lib/systemd/system
, ini akan menjadi penting.Nilai konstan
Jika nilainya tidak perlu diubah per instance, cara yang disukai adalah menempatkannya
Environment=
langsung di file unit:Keuntungannya adalah bahwa variabel disimpan dalam satu file dengan unit. Oleh karena itu, file unit lebih mudah untuk dipindahkan antar sistem.
Nilai variabel
Namun, solusi di atas tidak berfungsi dengan baik ketika sysadmin seharusnya mengubah nilai variabel lingkungan secara lokal. Lebih khusus lagi, nilai baru perlu ditetapkan setiap kali file unit diperbarui.
Untuk kasus ini, file tambahan harus digunakan. Bagaimana - biasanya tergantung pada kebijakan distribusi.
Salah satu solusi yang sangat menarik adalah dengan menggunakan
/etc/systemd/system/myservice.service.d
direktori. Tidak seperti solusi lain, direktori ini didukung oleh systemd sendiri dan karenanya tidak ada jalur distribusi khusus.Dalam hal ini, Anda menempatkan file seperti
/etc/systemd/system/myservice.service.d/local.conf
itu menambahkan bagian-bagian yang hilang dari file unit:Setelah itu, systemd menggabungkan kedua file ketika memulai layanan (ingat untuk
systemctl daemon-reload
setelah mengubah salah satu dari mereka). Dan karena jalur ini digunakan langsung oleh systemd, Anda tidak menggunakannyaEnvironmentFile=
untuk ini.Jika nilainya seharusnya diubah hanya pada beberapa sistem yang terpengaruh, Anda dapat menggabungkan kedua solusi, memberikan default langsung di unit dan override lokal di file lain.
sumber
systemctl daemon-reload
adalah perintah untuk memuat ulang systemdEnvironmentFile=
Lebih baik bila nilainya rahasia seperti kata sandi. Lihat jawaban saya untuk detailnya.http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= - Anda memiliki dua opsi (satu sudah ditunjukkan oleh Michael):
dan
sumber
Jawaban oleh Michael dan Michał sangat membantu dan menjawab pertanyaan awal tentang cara mengatur variabel lingkungan untuk layanan systemd. Namun, satu penggunaan umum untuk variabel lingkungan adalah untuk mengkonfigurasi data sensitif seperti kata sandi di tempat yang tidak akan secara tidak sengaja mendapatkan komitmen untuk mengontrol sumber dengan kode aplikasi Anda.
Jika itu sebabnya Anda ingin meneruskan variabel lingkungan ke layanan Anda, jangan gunakan
Environment=
dalam file konfigurasi unit. GunakanEnvironmentFile=
dan arahkan ke file konfigurasi lain yang hanya dapat dibaca oleh akun layanan (dan pengguna dengan akses root).Detail file konfigurasi unit dapat dilihat oleh setiap pengguna dengan perintah ini:
Saya menaruh file konfigurasi
/etc/my_service/my_service.conf
dan menaruh rahasia saya di sana:Kemudian dalam file unit layanan saya, saya menggunakan
EnvironmentFile=
:Saya memeriksa bahwa
ps auxe
tidak dapat melihat variabel lingkungan itu, dan pengguna lain tidak memiliki akses ke/proc/*/environ
. Periksa sistem Anda sendiri, tentu saja.sumber
Michael memberikan satu solusi bersih tetapi saya ingin mendapatkan variabel env yang diperbarui dari skrip. Sayangnya menjalankan perintah bash tidak dimungkinkan dalam file unit systemd. Untungnya Anda dapat memicu bash di dalam ExecStart:
http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service§=5
Contoh dalam kasus kami adalah:
sumber
/bin/bash -a -c 'source /etc/sysconfig/whatever && exec whatever-program'
. The-a
memastikan lingkungan diekspor ke sub-proses (kecuali jika Anda ingin awalan semua variabelwhatever
denganexport
)ExecStart=/usr/bin/env ENV=script /bin/myforegroundcmd
solusi yang sedikit lebih baik dalam hal ini.