Apakah ada cara untuk secara dinamis menetapkan variabel lingkungan dalam file unit layanan systemd?
Kami memiliki mesin yang memiliki 4 GPU, dan kami ingin menambah beberapa instance layanan tertentu per GPU. Misalnya:
- gpu_service @ 1: 1.service
- gpu_service @ 2: 1.service
- gpu_service @ 3: 1.service
- gpu_service @ 4: 1.service
- gpu_service @ 1: 2.service
- gpu_service @ 2: 2.service
- gpu_service @ 3: 2.service
- gpu_service @ 4: 2.service
- ad mual
Jadi 1: 1, 2: 1, dll. Secara efektif adalah% i dalam file unit layanan.
Agar layanan dapat mengikat GPU tertentu, layanan yang dapat dieksekusi memeriksa variabel lingkungan tertentu, misalnya:
USE_GPU=4
Apakah ada cara saya dapat mengambil% i di dalam file unit layanan dan menjalankannya melalui beberapa fungsi (shell) untuk mendapatkan nomor GPU, dan kemudian saya dapat mengatur variabel lingkungan USE_GPU sesuai?
Yang paling penting, saya tidak ingin repot menulis banyak /etc/systemd/system/gpu_service@x:y.service/local.conf
file hanya supaya saya dapat memutar lebih banyak instance.
bash -c
untuk memulai program dari file unit? Teleponexec
? Ini seperti menggunakan forklift di atas forklift (mungkin dengan forklift lain di atas) karena forklift pertama memiliki masalah sebenarnya forklifting.Tidak dibangun di jalan. Anda perlu melakukan hal-hal ini sebelum layanan Anda dimulai. Salah satu caranya adalah dengan meletakkannya di file lingkungan.
sumber
Sepertinya Anda memang dapat mengatur variabel lingkungan di dalam file unit systemd ...
Per saran dari komentator, inilah solusinya:
Teks yang dikutip diambil dari URL berikut: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
sumber
Environment=ABC=%i
tidak mengatur env itu. variabel "hingga keseluruhan% i". Saya kira Anda bisa membuat pembungkus untuk menanggalkan "hal-hal di luar kutipan" yang tidak Anda inginkan, dan itu disebut executable nyata. Tetapi jika Anda membuat pembungkus, Anda bahkan bisa lewat%i
sebagai argumen untuk itu ex:ExecStart=my_wrapper %i
Ini jelek dan tidak sesuai dengan yang Anda minta, juga tidak memungkinkan untuk memulai otomatis, tetapi untuk pengikut dimungkinkan untuk melakukan sesuatu menggunakan lingkungan systemctl :
Hanya mencoba daftar semua cara yang mungkin :)
sumber