Forking dalam skrip systemd

10

Saya ingin layanan systemd menangani forking (file saya tidak menangani forking dengan sendirinya. Jadi saya mengandalkan systemd untuk menangani itu)

File .service saya:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Pertanyaan

Apakah Type=forkingcukup menentukan untuk apa yang ingin saya capai? Atau mirip dengan mengharapkan forking di pemula yang benar-benar memberitahu pemula (jika saya mengerti dengan benar, tidak yakin saya lakukan, saya baru menulis skrip init) bahwa layanan saya akan menangani forking / daemonizing.

Alonisser
sumber

Jawaban:

16

systemd memiliki dokumentasi yang sangat baik. Lihat halaman pada file layanan :

Jika diatur ke forking, diharapkan proses yang dikonfigurasikan dengan ExecStart = akan memanggil fork () sebagai bagian dari start-up-nya. Proses induk diharapkan untuk keluar ketika start-up selesai dan semua saluran komunikasi diatur. Anak itu terus berjalan sebagai proses daemon utama. Ini adalah perilaku daemon tradisional UNIX. Jika pengaturan ini digunakan, disarankan untuk juga menggunakan opsi PIDFile =, sehingga systemd dapat mengidentifikasi proses utama daemon. systemd akan melanjutkan dengan memulai unit tindak lanjut segera setelah proses induk keluar.

Jadi, menggunakan itu typehanya akan memberitahu systemd untuk menunggu sampai swampkembali dan kemudian menganggapnya masih berjalan: membuat itu terjadi tetap menjadi tanggung jawab Anda ...

jasonwryan
sumber
5
Jika skrip tidak melakukan forking, itu bisa berupa oneshot(skrip berjalan pendek biasa) atau simple(layanan berjalan lama yang tidak fork + keluar).
Pavel Šimerda
4
Apakah Anda mempertimbangkan skrip (Bash?) Untuk melakukan proses lain saat latar menggunakan ampersand &?
Felipe Alvarez
5
@FelipeAlvarez ya, operator ampersand di bash setara dengan fork dan exec.
Thayne
1

Jika Anda ingin systemd menangani forking, maka Anda harus menggunakan mis Type=simpleatau Type=notify. Maka systemd akan melakukan forking untuk Anda.

Jika Anda dapat memodifikasi swampexecutable, maka itu Type=notifyadalah solusi terbaik. Yang dapat dieksekusi kemudian harus memberitahu systemd ketika berhasil diinisialisasi. Ini berarti bahwa systemctl start swampakan menunggu rawa untuk menginisialisasi ketika dipanggil dari baris perintah, dan mencetak pesan kesalahan saat menginisialisasi ke baris perintah, yang biasanya Anda inginkan.

Untuk contoh executable yang ditulis menggunakan Type = notify, lihat shellscript berikut:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
pengguna3049102
sumber