Cara memulai ulang layanan secara otomatis pada kegagalan di Linux

23

Pada Windows, Anda dapat mengatur apa yang harus terjadi jika / ketika suatu layanan gagal. Apakah ada cara standar untuk mencapai hal yang sama di Linux (khususnya CentOS)?

Sebagian besar pertanyaan saya adalah: bagaimana Anda menangani soket yang dibiarkan terbuka - misalnya di TIME_WAIT, FIN_WAIT1, dll.

Saat ini jika layanan yang saya kembangkan macet, saya harus menunggu soketnya untuk menghapus atau mengubah porta pendengaran sebelum saya dapat me-restart secara manual.

Terima kasih atas bantuan Anda.

Pryo
sumber

Jawaban:

26

monitadalah cara yang bagus untuk memantau dan memulai kembali layanan ketika mereka gagal - dan Anda mungkin akan menggunakan ini untuk layanan penting lainnya (seperti Apache). Ada artikel bagus tentang nixCraft yang merinci cara menggunakan ini untuk layanan secara khusus, meskipun monititu sendiri memiliki banyak fungsi lebih dari ini.

Sedangkan untuk aspek soket, @galraen menjawab tempat ini.

Andrew M.
sumber
Sayang saya harus memutuskan yang merupakan satu jawaban. Saya seharusnya mengajukan dua pertanyaan terpisah. @gelraen jawaban Anda baru saja mengakhiri minggu-minggu saya mencari solusi. Terima kasih Anda begitu banyak! @Redmumba terima kasih, Monit memang terlihat bagus!
Pryo
Siapa pun Anda memutuskan untuk menandai yang benar, pasti upvote jawaban @ gelraen ini. Tempatnya tepat, dan sangat informatif.
Andrew M.
19

Hanya menjawab bagian restart layanan. Saya menemukan Monit juga, tetapi pada CentOS 7 systemd mengurus semua itu untuk Anda. Anda hanya perlu menambahkan dua baris ini ke file .service (jika belum ada di sana):

Restart=always
RestartSec=3

Lihat https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ untuk referensi.

Jika Anda ingin membuat layanan systemd kustom, cukup mudah untuk menulis file layanan Anda sendiri. Lihat contoh di bawah ini, untuk server http khusus.

Mulai editor dengan file layanan baru:

vim /etc/systemd/system/httpd.service

Dan tambahkan konten berikut, yang dapat Anda edit sesuai kebutuhan:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Saya ingin memulai secara otomatis saat boot:

systemctl enable httpd

Beri tahu systemd tentang perubahan dan mulai layanan:

systemctl daemon-reload
systemctl start httpd

Dan sekarang Anda dapat melihat statusnya:

systemctl status httpd

Untuk referensi, lihat https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/

Nagev
sumber
Ya, tepatnya, systemdmanajer layanan standar di sebagian besar distribusi populer, dapat melakukannya untuk Anda.
Rolf
13

Anda dapat memanggil setsockopt(2)soket mendengarkan SO_REUSEADDR, sehingga Anda dapat melakukannya bind(2)lagi tanpa menunggu berakhirnya semua koneksi. Kemungkinan lain: jatuhkan koneksi dari kernel. FreeBSD punya tcpdropperintah untuk ini, tidak tahu tentang Linux.

gelraen
sumber
4

Jika distro linux Anda menggunakan Upstart alih-alih SysV init, maka respawnkata kunci melakukannya.

http://upstart.ubuntu.com/cookbook/#respawn

JeffG
sumber
Terima kasih, sepertinya ini masalahnya, tapi sayangnya saya terjebak dengan SysV init.
Pryo