Cara sederhana untuk memulai kembali proses macet?

10

Saya perlu memantau beberapa proses yang berjalan di server web saya. Untuk beberapa alasan, pernis saat ini crash satu atau dua hari sekali. Saya menggunakan monit untuk me-restart pernis secara otomatis, tetapi tidak berhasil. Inilah entri monit.conf saya untuk Varnish.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

File log menunjukkan bahwa setelah pernis berhenti berjalan, percobaan ulang dimulai setelah itu semua gagal. Kemudian akhirnya monit berhenti memonitor pernis.

Adakah yang punya saran bagaimana saya bisa memperbaikinya? Atau lebih baik lagi, dapatkah Anda menyarankan cara sederhana lainnya untuk secara otomatis memantau dan memulai kembali proses yang macet? Terima kasih!

Lin
sumber
Saya tidak percaya betapa sulitnya hal-hal seperti itu di masa pra-systemd.
Fl0v0

Jawaban:

17

Saya akan mencari daemontools ( http://cr.yp.to/daemontools.html ).

Mengawasi dibangun untuk tujuan ini - untuk memulai proses dan menonton mereka, memulai kembali dengan segera jika mereka pernah berakhir.

Anda masih dapat menggunakan monit jika Anda perlu melakukan sesuatu yang lebih rumit daripada pemeriksaan "apakah masih berjalan" sederhana, dan jika proses perlu dimulai kembali, maka lakukan itu melalui pengawasan.

Ian Clelland
sumber
Saya menggunakan daemontools juga, untuk memantau proses layanan yang tidak stabil. Cukup berguna jika saya harus mengatakannya. :-)
edomaur
4

Anda juga dapat menggunakan / etc / inittab untuk memulai kembali proses mati menggunakan tindakan respawn .

Lihat bagian inittab di http://aplawrence.com/Unixart/startup.html

Shawn Chin
sumber
2

Anda dapat menggunakan skrip event handler dengan Nagios jika Anda memiliki itu untuk memulai kembali layanan.

Jika pernis membutuhkan izin root untuk memulai (skrip init.d biasanya melakukannya) ubah "/etc/init.d/varnish start" menjadi "sudo /etc/init.d/varnish start". Tapi itu mungkin tidak akan cukup karena Anda mungkin tidak ingin memberikan apa pun yang dijalankan pengguna sebagai total sudo nopasswd privilege untuk semua perintah dan memberikan sudo ke skrip shell pada dasarnya sama buruknya. Jadi, Anda perlu mencari tahu perintah mana dalam skrip init yang memerlukan sudo, berikan perintah-perintah tersebut hak istimewa sudo di file / etc / sudoers ke pengguna monit, dan akhirnya edit skrip init yang sesuai. Atau mungkin alih-alih semua pernis ini dapat dijalankan sebagai pengguna non-root?

Akhirnya, saya yakin Anda tahu ini, tetapi saya akan mengatakannya. Anda jelas melakukan banyak upaya dalam hal ini, saya harap Anda berusaha sebanyak mungkin untuk mencari tahu mengapa pernis crash dan benar-benar memperbaikinya (atau memburu para pengembang untuk mencari tahu mengapa) :-)

Pembaruan:
Ini mungkin tidak bersih, tetapi cara mudah untuk menyelesaikan ini karena root mungkin untuk mengatur skrip yang memeriksa apakah prosesnya baik-baik saja, dan jika tidak memulainya. Kemudian jalankan script itu setiap beberapa menit sebagai tugas cron.

Kyle Brandt
sumber
Awalnya saya mempertimbangkan Nagios, tetapi menginginkan sesuatu yang kecil dan sederhana untuk tujuan saya. Dan ya, saya sedang mencari masalah Varnish. Salah satu server saya telah menjalankannya stabil untuk waktu yang sangat lama, jadi itu pasti ada hubungannya dengan saya. :(
Lin
1

Metode hebat lain yang diambil dari StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Ini dapat ditambahkan ke crontab:

crontab -e

Kemudian tambahkan aturan untuk memulai skrip monitor Anda:

@reboot /usr/local/bin/myservermonitor

Atau ditambahkan sebagai skrip di /etc/init.d

Lihat jawaban StackOverflow untuk penjelasan terperinci tentang mengapa ini adalah pendekatan yang baik.

Cory Klein
sumber
0

Saya juga mencari cara paling sederhana untuk menangani masalah ini. Cara termudah yang bisa saya temukan adalah dengan menambahkan file Restart=allwaysterkait sebagai baris terakhir dari tag..service/etc/systemd/system/multi-user.target.wants/[service]

Setelah itu lakukan sudo systemctl daemon-reloaddilanjutkan dengan sudo systemctl restart service.servicememuat ulang perubahan.

Anda dapat menguji dengan memeriksa apakah layanan ini berjalan:, systemctl status processnameperiksa stempel waktu mulai. Setelah itu ps -ef | grep servicename, iklan membunuh proses dengan id yang baru ditemukan kill 1234. setelah itu lakukan systemctl status processnamelagi dan periksa apakah cap waktu mulai diperbarui.

Ini harus bekerja pada:

  • Debian 7 dan Debian 8
  • Ubuntu 15.04 dan yang lebih baru
  • CentOS 7 dan berjangka
RoDo
sumber