protokol kesiapan tidak cocok
Seperti yang ditunjukkan Wieland, Type
layanan ini penting. Pengaturan itu menunjukkan apa protokol sistem kesiapan dan mengharapkan layanan untuk berbicara. Suatu simple
layanan diasumsikan segera siap. Sebuah forking
layanan diambil untuk siap setelah proses awal garpu anak dan kemudian keluar. Sebuah dbus
layanan diambil untuk siap ketika server muncul di Desktop Bus. Dan seterusnya.
Jika Anda tidak mendapatkan protokol kesiapan yang dinyatakan dalam unit layanan untuk cocok dengan apa yang dilakukan layanan, maka semuanya akan serba salah. Ketidakcocokan protokol kesiapan menyebabkan layanan tidak dimulai dengan benar, atau (lebih sering) didiagnosis oleh sistemd sebagai gagal. Ketika suatu layanan dianggap gagal untuk memulai systemd memastikan bahwa setiap proses tambahan yatim piatu dari layanan yang mungkin dibiarkan berjalan sebagai bagian dari kegagalan (dari sudut pandangnya) terbunuh untuk membawa layanan dengan benar kembali ke yang tidak aktif. negara.
Anda melakukan ini dengan tepat.
Pertama-tama, hal-hal sederhana: sh -c
tidak cocok Type=simple
atau Type=forking
.
Dalam simple
protokol, proses awal diambil sebagai proses layanan. Tetapi pada kenyataannya sh -c
pembungkus menjalankan program layanan yang sebenarnya sebagai proses anak . Jadi MAINPID
salah dan ExecReload
berhenti bekerja, untuk pemula. Saat menggunakan Type=simple
, seseorang harus menggunakan sh -c 'exec …'
atau tidak menggunakan sh -c
di tempat pertama. Yang terakhir lebih sering merupakan jalan yang benar daripada yang dipikirkan beberapa orang.
sh -c
juga tidak cocok Type=forking
. Protokol kesiapan untuk suatu forking
layanan cukup spesifik. Proses awal harus memotong seorang anak, dan kemudian keluar. systemd menerapkan batas waktu untuk protokol ini. Jika proses awal tidak bercabang dalam waktu yang ditentukan, itu gagal untuk siap. Jika proses awal tidak keluar dalam waktu yang ditentukan, itu juga merupakan kegagalan.
horor yang tidak perlu itu ossec-control
Yang membawa kita ke hal-hal kompleks: ossec-control
naskah itu.
Ternyata itu adalah rc
skrip System 5 yang memotong antara 4 dan 10 proses, yang pada gilirannya mereka garpu dan keluar juga. Ini adalah salah satu rc
skrip System 5 yang berupaya mengelola seluruh rangkaian proses server dalam satu skrip tunggal, dengan for
loop, kondisi balapan, arbitrary sleep
untuk mencoba menghindarinya, mode kegagalan yang dapat mencekik sistem dalam keadaan setengah-mulai, dan semua kengerian lain yang membuat orang menemukan hal-hal seperti AIX System Resource Controller dan daemontools dua dekade lalu. Dan jangan lupa skrip shell tersembunyi dalam direktori biner yang ditulis ulang dengan cepat, untuk mengimplementasikan idiosyncratic enable
dan disable
kata kerja.
Jadi ketika Anda /bin/sh -c '/var/ossec/bin/ossec-control start'
yang terjadi adalah:
- systemd melakukan apa yang diharapkan sebagai proses layanan.
- Itu shell, yang bercabang
ossec-control
.
- Itu pada gilirannya bercabang antara 4 dan 10 cucu.
- Cucu-cucu semuanya bercabang dan keluar secara bergantian.
- Cicit buyut semuanya bercabang dan keluar secara paralel.
ossec-control
keluar.
- Shell pertama keluar.
- Proses layanan adalah besar-besar- cucu, tetapi karena cara ini pertandingan bekerja baik dalam
forking
maupun para simple
protokol kesiapan, systemd menganggap layanan secara keseluruhan telah gagal dan menutup ke mundur.
Tak satu pun dari kengerian ini benar-benar diperlukan di bawah systemd sama sekali. Tidak satu pun.
unit layanan template systemd
Sebagai gantinya, seseorang menulis unit template yang sangat sederhana :
[Satuan]
Deskripsi = Server OSSEC HIDS% i
Setelah = network.target
[Layanan]
Ketik = sederhana
ExecStartPre = / usr / bin / env / var / ossec / bin /% p-% i -t
ExecStart = / usr / bin / env / var / ossec / bin /% p-% i -f
[Install]
WantedBy = multi-user.target
Simpan ini sebagai /etc/systemd/system/ossec@.service
.
Berbagai layanan aktual adalah contoh dari template ini, dinamai:
ossec@dbd.service
ossec@agentlessd.service
ossec@csyslogd.service
ossec@execd.service
ossec@agentd.service
ossec@logcollector.service
ossec@syscheckd.service
ossec@maild.service
ossec@analysisd.service
ossec@remoted.service
ossec@monitord.service
Kemudian aktifkan dan nonaktifkan fungsi datang langsung dari sistem manajemen layanan (dengan RedHat bug 752774 diperbaiki), tanpa perlu skrip shell tersembunyi.
systemctl mengaktifkan ossec @ dbd ossec @ agentlessd ossec @ csyslogd ossec @ maild ossec @ execd ossec @ analysisd ossec @ logcollector ossec @ dibuat-buat ossec @ syscheckd ossec @ monitord
Selain itu, systemd mengetahui, dan melacak, setiap layanan aktual secara langsung. Itu dapat menyaring log mereka dengan journalctl -u
. Ia dapat mengetahui kapan suatu layanan individual gagal. Ia tahu layanan apa yang seharusnya diaktifkan dan dijalankan.
Omong-omong: Type=simple
dan -f
pilihannya ada di sini seperti halnya dalam banyak kasus lainnya. Sangat sedikit layanan di alam yang benar - benar memberi sinyal kesiapan mereka karena exit
, dan ini di sini juga tidak seperti itu. Tapi itulah yang dimaksud dengan forking
tipenya. Layanan di alam liar hanya bercabang-cabang dan keluar karena beberapa anggapan yang salah diterima bahwa itulah yang seharusnya dilakukan para demon. Sebenarnya tidak. Belum sejak tahun 1990-an. Sudah waktunya untuk mengejar ketinggalan.
Bacaan lebih lanjut