Di organisasi saya, kami memiliki sejumlah proses pekerja yang memakan antrian. Kami saat ini menggunakan SupervisorD untuk mengelolanya, tetapi ingin menggunakan SystemD jika memungkinkan untuk keuntungan tertentu di dalamnya. Saya cukup berpengalaman dengan menulis unit kustom, tetapi saya tidak segera memiliki analog di tanah SystemD untuk ini.
Dalam dokumentasi SupervisorD, parameter yang dipanggil numprocs
dirinci yang memungkinkan seseorang untuk mengatur jumlah proses yang mereka inginkan untuk memulai dengan layanan. Jika saya ingin 30 proses dimulai, itu adalah perubahan satu baris.
Apakah ada pengaturan dalam unit SystemD yang akan memungkinkan saya untuk menentukan berapa banyak dari proses ini yang ingin saya mulai?
systemd
supervisord
Naftuli Kay
sumber
sumber
Jawaban:
Apa yang disebutkan Munir adalah persis bagaimana Anda melakukan ini. Pada dasarnya Anda membuat
service
file, dan memulainya 30 kali. Sekarang mungkin tampak sedikit tidak sehat, tetapi memiliki keuntungan, seperti bisa mematikan salah satu dari mereka jika itu bertingkah buruk, dan tidak harus mematikan semuanya. Ada juga beberapa hal yang dapat Anda lakukan untuk membuat manajemen lebih mudah.Pertama, file unit. Buat file, seperti
/etc/systemd/system/[email protected]
. Bit yang penting adalah@
simbol.Isinya mungkin terlihat seperti:
Kemudian mulai dengan
systemctl start [email protected]
,systemctl start [email protected]
.Proses yang diluncurkan akan terlihat seperti:
Perhatikan bahwa
%I
dapatkan diganti dengan apa pun yang Anda masukkan setelah@
ketika Anda memulainya.Anda dapat memulai semua 30 dengan sedikit shell-fu:
Anda juga dapat memungkinkan mereka pada boot seperti layanan normal:
systemctl enable [email protected]
.Sekarang, apa yang saya maksudkan dengan hal-hal yang dapat Anda lakukan untuk membuat manajemen lebih mudah: Mungkin Anda tidak ingin harus menggunakannya
test@{1..30}.service
untuk mengelola semuanya. Agak berat. Anda bisa membuat target baru untuk layanan Anda.Buat
/etc/systemd/system/test.target
dengan:Kemudian sesuaikan
/etc/systemd/system/[email protected]
sehingga terlihat seperti:Muat ulang systemd dengan
systemctl daemon-reload
(hanya diperlukan jika Anda memodifikasi file unit, dan tidak melewatkan versi sebelumnya). Dan sekarang aktifkan semua layanan yang ingin Anda kelolasystemctl enable test@{1..30}.service
.(Jika sebelumnya Anda telah mengaktifkan layanan saat itu
WantedBy=multi-user.target
, nonaktifkan dulu untuk menghapus ketergantungan)Anda sekarang dapat melakukan
systemctl start test.target
dansystemctl stop test.target
, dan itu akan memulai / menghentikan semua 30 proses.Dan lagi, Anda dapat mengaktifkan boot seperti file satuan lainnya:
systemctl enable test.target
.sumber
Restart=on-failure
. Bacasystemd.service
halaman manual untuk lebih lanjut.Berikut adalah contoh saya menggunakan skrip python yang berjalan di virtualenv:
/etc/systemd/system/[email protected]
Nonaktifkan:
sudo systemctl enable my-worker\@{1..30}.service
Aktifkan N pekerja:
sudo systemctl enable my-worker\@{1..2}.service
Muat ulang:
sudo systemctl daemon-reload
Mulailah:
sudo systemctl start [email protected]
Periksa status:
sudo systemctl status my-worker@1
sumber