Bagaimana memonitor layanan dan memulai kembali jika berhenti di Linux


24

Sebenarnya saya tidak begitu yakin apakah saya harus menggunakan Shell Script, atau jika sudah ada beberapa cara. Tetapi pendekatan apa pun yang kami gunakan, saya ingin menjaga Layanan tetap berjalan sepanjang waktu.

Katakanlah iptablessebagai contoh. Kemudian ..

  • Setiap kali yang iptableslayanan stoppedatau (dengan kata lain) tidak berjalan, saya ingin menjadi started(atau restarted) .. secara otomatis setiap kali berhenti (atau tidak berjalan).
  • Dengan kata lain yang lebih sederhana, saya ingin menjaga Layanan tetap berjalan sepanjang waktu.

(Mungkin saya bisa memberikan frekuensi yang adil untuk memeriksa, jika melakukan pengecekan waktu-nyata adalah masalahnya. Jadi katakanlah, setiap 5 menit)

Satu-satunya cara saya bisa memikirkan, adalah dengan menggunakan Script Shell dengan Cron Tab.

  • Apakah ada solusi pintar?

Terima kasih!


Anda seharusnya tidak melakukan itu. Andaikan sebuah layanan tidak terkonfigurasi, apa yang akan dicapai oleh strategi Anda? Daftar pengambilan yang tak terbatas. Anda sebaiknya menulis skrip crontab yang alertsAnda buat tidak berfungsi.
MariusMatutiae

Saya hanya ingin tahu tentang solusi langsung, untuk pertanyaan awal. Dan juga, saya memiliki Layanan yang hanya perlu restartedkapan saja berhenti, untuk alasan apa pun. Tidak masalah dengan memulai ulang.
夏 期 劇場

1
Solusi yang Anda sarankan sendiri cukup cerdas. Jika Anda menggunakannya dengan benar (keluar segera jika layanan sudah berjalan, beri tahu Anda bahwa layanan telah berhenti sehingga Anda dapat memperbaikinya, dan seterusnya ....) itu adalah cara paling sederhana. Layanan yang berhenti secara otomatis adalah layanan yang bermasalah, jadi pada akhirnya Anda harus memperbaikinya, tetapi sebaliknya, sebagai tambalan sementara, skrip cron atau daemon super sederhana lainnya yang tidur sebagian besar waktu akan melakukan pekerjaan dengan baik. Ada beberapa alat seperti mmonit.com/monit tapi saya pikir pada akhirnya mereka semua menggunakan pendekatan yang sama

@MariusMatutiae, saya setuju dengan poin Anda, tetapi itu tergantung pada sifat layanan, dan sebagian besar manajer proses akan mundur setelah sejumlah restart yang gagal. Sangat masuk akal jika suatu proses berakhir secara alami, dan bagi kami ingin memulai kembali secara otomatis, misalnya seorang pekerja yang mengambil pekerjaan dari antrian dan berakhir setelah setiap putaran. Ini juga merupakan alat yang berguna untuk sysadmin yang menderita kode kebocoran memori yang dipesan lebih dahulu - batasi umur proses dan mulai ulang secara otomatis sebelum dapat keluar dari tangan ...
Alex Forbes

Jawaban:


25

Pembaruan Maret 2018

Jawaban ini sekarang sudah cukup lama, dan sejak itu ditulis systemd telah memenangkan perang pid1 di Linux. Dengan demikian, Anda mungkin harus membuat unit systemd , jika systemd dibangun untuk distribusi Anda (yang sebagian besar dari mereka).

Jawaban di bawah dipertahankan untuk anak cucu.


Jawaban monit di atas valid, tapi saya pikir saya akan menyebutkan beberapa alternatif:

Perlu diingat bahwa sistem operasi Anda telah menyelesaikan masalah manajemen proses. Secara tradisional, Linux telah menggunakan sysvinit, yang pada dasarnya adalah kumpulan skrip yang Anda lihat di init.d. Namun itu sangat bodoh dan tidak dapat memantau proses, skrip init.d rumit dan sedang diganti untuk alasan yang baik.

Sistem operasi yang lebih modern mulai menggantikan sysvinit, dan pelopornya adalah Pemula dan Systemd. Debian condong ke arah systemd, Ubuntu dikembangkan dan sudah cukup banyak beralih ke Upstart, dan seperti Debian Redhat / CentOS / Fedora sedang bergerak ke arah systemd. Jadi jika Anda menggunakan OS yang sudah menggantikan sysvinit saya akan merekomendasikan menggunakan apa yang ada di dalamnya. Skrip lebih mudah ditulis daripada skrip init.

Saya telah menggunakan runit dan sangat menyukainya, tetapi yang paling mudah digunakan adalah supervisor. Ini juga didokumentasikan dengan sangat baik, bekerja hampir di mana saja dan dikemas dalam semua distribusi utama.

Tapi apa pun yang Anda lakukan, tolong, tolong, jangan gunakan skrip shell. Ada begitu banyak hal yang salah dengan pendekatan itu!


bagaimana melakukannya dengan sysvinit?
horseyguy

12

iptablesadalah contoh yang buruk karena sebenarnya bukan layanan atau daemon yang berjalan, tetapi bagian dari kernel. Anda tidak dapat benar-benar "berhenti" iptables, Anda hanya bisa memberikannya konfigurasi dan "menghentikan" itu melibatkan memberikannya konfigurasi kosong. Memang saya mengalami crash sistem Linux, tetapi pengaturan port forwarding iptablesterus bekerja.

Pokoknya, utilitas yang dipanggil monitakan melakukan apa yang Anda inginkan. Jika Anda menggunakan Debian itu apt-get install monitjauh. Ini agak terlibat untuk dipelajari tetapi sangat fleksibel.


3

Kami menggunakan skrip sederhana ini untuk membuat peringatan dan memulai layanan jika tidak berjalan, Anda dapat menambahkan lebih banyak layanan juga ..

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

Poin MariusMatutiae benar tetapi kami telah melakukan skrip sederhana untuk memantau HTTPD dan layanan DNS di server saya, berjalan baik-baik saja. Ketika layanan sedang down, skrip akan memulai kembali layanan dan membuat peringatan kepada kami, Jika kami mendapatkan banyak peringatan / mail mengenai layanan ini, maka kami dapat melakukan penyelidikan.
Ranjithkumar T


0

Saya tahu ini sudah beberapa tahun sejak pertanyaan itu diajukan. tetapi dengan systemd (kebanyakan tersedia dengan centos dan REHL) Anda dapat menjalankan perintah bash ini dengan cron untuk memeriksa dan memulai kembali jika layanan sedang down.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

simpan di direktori tempat sampah Anda dan beri nama seperti monitor. Berikan izin file yang sesuai untuk itu. kemudian jalankan seperti

sudo monitor redis

jika Anda ingin memeriksa layanan redis dan memulai kembali / memulai jika diperlukan.

terakhir tambahkan ini ke pekerjaan cron Anda.

Semoga ini bisa membantu


0

Untuk menambah daftar panjang pengawasan init / svc, sebagai subdirektori ke S6 ada anak baru di blok, 66, yang menangani manajemen layanan s6 dan masuk dengan cepat, ringan, dan ramah pengguna. Ini adalah tautan ke dokumentasi resmi untuk Obarun-Linux https://web.obarun.org/software

Ini adalah FAQ tentang cara menggunakan perangkat lunak 66 ini dan memahami s6 http://sysdfree.wordpress.com/266

Karena rilis stabilnya hanya satu bug yang ditemukan terkait dengan perubahan kernel dari 4,20 -> 5,0, semua masalah lain yang dilaporkan berkaitan dengan orang yang mempelajari sesuatu yang baru. Jika manajemen layanan harus menjadi lebih sederhana dari ini, mungkin lebih baik untuk beralih ke ms-windows (Linus melarang). Untuk melihat dalam kehidupan nyata bagaimana ini bisa bekerja kita hanya perlu mengunduh live.iso Obarun dan bermain dengannya. Instal layanan dan 66-skrip mereka memungkinkan mereka, membunuhnya, melihat log mereka, menghentikan mereka dan memulainya (saat diaktifkan), banyak layanan menjadi pohon dan memiliki pohon layanan memulai dan berhenti bersama-sama, memiliki layanan tingkat pengguna secara terpisah dari sistem. Ia melakukan apa yang s6 lakukan dengan baik dan membuatnya lebih mudah bagi pengguna untuk mengeksploitasi sistem anti peluru di bawah s6.

Unduhan gambar dapat ditemukan di sini: https://web.obarun.org/index.php?id=74 md5 periksa file https://repo.obarun.org/iso/

Selain init dan manajemen layanan S6 / 66 tidak memiliki dependensi dari apa pun pada sistem. Ini adalah lapisan sistem dasar yang membuat perangkat lunak lainnya bekerja sendiri, init / svc-mgmt blind. Semua s6 dan 66 ditulis dalam C dan tidak spesifik linux, atau spesifik glibc. Server (s6 penulis) Skarnet telah berjalan selama hampir satu dekade tanpa banyak jeda pada sistem yang dibangun khusus musl. Alpine, Void, dan Adelie saat ini juga memiliki perangkat lunak s6 pada repositori mereka, Adelie menggunakannya untuk pengawasan layanan secara default. Void sekarang membawa 66 juga. Saya tidak tahu apakah dan sampai sejauh mana seseorang telah porting s6 ke xxBSD atau sistem xxIX lainnya.

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.