Ketika Anda memulai layanan secara manual dari baris perintah (tanpa menggunakan nohup
perintah awalan atau &
akhiran untuk menjalankannya di latar belakang, atau dengan kata lain, jalankan perintah yang akan Anda letakkan di ExecStart=
baris .service
file), apa yang terjadi?
a) Jika layanan mulai dan terus berjalan, dan prompt tidak kembali sampai Anda menekan Control-C atau menghentikan layanan dengan cara lain: maka itu Type = simple
adalah pilihan yang tepat.
b) Jika prompt kembali tetapi layanan tetap berjalan di latar belakang (yaitu layanan mengubah sendiri dengan sendirinya), maka itu Type = forking
adalah pilihan yang tepat.
c) Jika layanan melakukan tugasnya dan kembali ke prompt tanpa membiarkan apa pun berjalan (yaitu layanan hanya menyesuaikan beberapa pengaturan kernel, mengirimkan perintah ke sesuatu yang lain atau melakukan sesuatu yang serupa), maka Type = oneshot
mungkin itu adalah pilihan yang tepat. Dalam hal ini, ExecStart
layanan mungkin adalah perintah untuk "mengatur" sesuatu, dan ExecStop
akan menjadi perintah yang sesuai untuk "membatalkan" itu. Jenis ini biasanya menguntungkan RemainAfterExit=true
, jadi systemd akan melacak "keadaan" layanan ini sesuai dengan apakah hal itu baru-baru ini "diatur" atau "tidak disetel".
Nilai- Type
nilai lain adalah kasus khusus. Misalnya, jika layanan menggunakan koneksi D-Bus, maka Type = dbus
mungkin merupakan pilihan terbaik. Itu membuat systemd
sadar akan fakta, dan kemudian systemd akan melacak layanan ini (dan apa pun yang bergantung padanya) dengan kehadiran layanan ini di D-Bus.
Untuk menggunakannya Type = notify
, proses tersebut harus dapat terhubung ke soket Unix yang ditentukan dalam variabel lingkungan $NOTIFY_SOCKET
dan melaporkan statusnya dengan menulis pesan ke soket itu setiap kali diperlukan. Selain itu, file layanan harus menentukan NotifyAccess
opsi untuk memberikan akses ke soket pemberitahuan yang sesuai.
Ada utilitas baris perintah systemd-notify
dan fungsi pustaka C yang sd_notify(3)
dapat Anda gunakan untuk mengirim pesan-pesan ini, tetapi jika tidak ada yang cocok dengan kebutuhan Anda, Anda bisa mengimplementasikan pengirim pesan Anda sendiri. Pesan yang diperlukan sangat sederhana, dan terlihat seperti penugasan variabel shell: misalnya, untuk memberi tahu bahwa layanan telah berhasil menyelesaikan startup dan siap untuk melayani permintaan masuk apa pun, layanan harus mengirim string yang setara dengan output printf "READY=1\n"
ke soket. Lihat man 3 sd_notify
untuk detail lebih lanjut tentang pesan yang dikenali.
Catatan: banyak aplikasi layanan yang dirancang untuk dibawa-bawa ke banyak sistem gaya Unix mungkin berlaku sebagai b) secara default, tetapi dapat dibuat berfungsi seperti a) dengan menambahkan opsi (biasanya digambarkan sebagai "jangan bercabang", "tetap berjalan di latar depan "," jangan daemonisasi "atau serupa). Dalam hal itu, jika opsi tidak memiliki efek samping lain, maka menambahkan opsi dan menggunakan perilaku tipe a) akan lebih disukai systemd
.
apache
, tipe apa yang harus digunakan?apachectl start
sebagai root, mungkin? Coba lakukan itu, dan lihat apa yang terjadi. Kemudian pilih a), b) atau c) dari jawaban saya. Saya berani bertaruh bahwa prompt akan kembali dan Apache tetap berjalan, jadi b) akan menjadi jawabannya.Type=notify
?Type=notify
ditambahkan.