Sudahkah proses SystemD menelurkan N?


13

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 numprocsdirinci 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?


1
Apakah Anda mencoba membuat beberapa instance dari unit yang sama? Jika demikian, Anda mungkin ingin melihat 0pointer.de/blog/projects/ineses.html
Munir

Jawaban:


31

Apa yang disebutkan Munir adalah persis bagaimana Anda melakukan ini. Pada dasarnya Anda membuat servicefile, 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/test@.service. Bit yang penting adalah @simbol.

Isinya mungkin terlihat seperti:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

Kemudian mulai dengan systemctl start test@1.service, systemctl start test@2.service.
Proses yang diluncurkan akan terlihat seperti:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

Perhatikan bahwa %Idapatkan diganti dengan apa pun yang Anda masukkan setelah @ketika Anda memulainya.

Anda dapat memulai semua 30 dengan sedikit shell-fu:

systemctl start test@{1..30}.service

Anda juga dapat memungkinkan mereka pada boot seperti layanan normal: systemctl enable test@1.service.

 

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}.serviceuntuk mengelola semuanya. Agak berat. Anda bisa membuat target baru untuk layanan Anda.

Buat /etc/systemd/system/test.targetdengan:

[Install]
WantedBy=multi-user.target

Kemudian sesuaikan /etc/systemd/system/test@.servicesehingga terlihat seperti:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

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 kelola systemctl 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.targetdan systemctl 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.


Terima kasih atas jawaban terinci ini, saya mencari ini selama beberapa hari.
arnolem

1
Apakah Anda tahu jika itu akan memulai kembali proses yang gagal?
bastian

@bastian: Anda bisa menggunakan Restart=on-failure. Baca systemd.servicehalaman manual untuk lebih lanjut.
siride

1

Berikut adalah contoh saya menggunakan skrip python yang berjalan di virtualenv:

/etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

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 my-worker@2.service

Periksa status: sudo systemctl status my-worker@1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.