Řešení 1:
Pouze odpověď na část restartu služby. Narazil jsem také na Monit, ale na CentOS 7 se o to vše postará systemd za vás. Tyto dva řádky stačí přidat do souboru .service (pokud tam již nejsou):
Restart=always
RestartSec=3
Viz https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ pro reference.
Pokud chcete vytvořit vlastní službu systemd, je docela jednoduché napsat svůj vlastní soubor služby. Viz příklad níže pro vlastní http server.
Spusťte editor s novým souborem služby:
vim /etc/systemd/system/httpd.service
A přidejte následující obsah, který můžete upravit podle potřeby:
[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
Chci, aby se automaticky spustil při bootování:
systemctl enable httpd
Informujte systemd o změnách a spusťte službu:
systemctl daemon-reload
systemctl start httpd
A nyní můžete vidět stav:
systemctl status httpd
Pro referenci viz https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/
Řešení 2:
monit
je skvělý způsob, jak sledovat a restartovat služby, když selžou – a pravděpodobně to nakonec použijete pro další základní služby (jako je Apache). Na nixCraftu je pěkný článek, který podrobně popisuje, jak to použít pro konkrétní služby, ačkoli monit
sám má mnohem více funkcí nad rámec tohoto.
Pokud jde o aspekt zásuvky, @galraen odpověděl na toto místo.
Řešení 3:
Můžete zavolat na číslo setsockopt(2)
pro poslechovou zásuvku s SO_REUSEADDR
, takže budete moci bind(2)
znovu bez čekání na vypršení platnosti všech připojení. Další možnost:zrušit připojení z jádra. FreeBSD má tcpdrop
příkaz pro toto, nevím o Linuxu.
Řešení 4:
Pokud vaše linuxová distribuce používá Upstart místo SysV init, pak respawn
klíčové slovo to dělá.
http://upstart.ubuntu.com/cookbook/#respawn