How to Automatically Restart Failed Services on Linux Without Systemd

While systemd has become the dominant init system for many modern Linux distributions, some systems still rely on older init systems like SysVinit and Upstart. For administrators managing these non-systemd environments, ensuring services automatically restart after failures is crucial for maintaining system stability and uptime. This article explores effective methods to configure automatic service restarts on Linux systems using SysVinit, Upstart, and alternative approaches.

Configuring Automatic Restarts with SysVinit

SysVinit, the traditional init system used in older versions of Debian, CentOS, and other distributions, doesn’t have built-in functionality for automatic service restarts. However, we can achieve this using the Monit utility.

Setting Up Monit for Service Monitoring

Monit is a versatile tool that can monitor services and automatically restart them upon failure.

Step 1: Install Monit on your system:

# Debian/Ubuntu
sudo apt update && sudo apt install monit

# CentOS/RHEL
sudo yum install monit

Step 2: Configure Monit to monitor a specific service:

Edit the Monit configuration file:

sudo nano /etc/monit/monitrc

Add a service definition for the service you want to monitor. For example, to monitor Apache:

check process apache2 with pidfile /var/run/apache2/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program = "/etc/init.d/apache2 stop"
    if failed port 80 protocol http then restart
    if 5 restarts within 5 cycles then timeout

This configuration tells Monit to:

  • Check the Apache process using its PID file
  • Use the init script to start and stop the service
  • Restart Apache if it fails to respond on port 80
  • Stop attempting restarts if it fails 5 times within 5 check cycles

Step 3: Enable and start Monit:

sudo systemctl enable monit
sudo systemctl start monit

Verify Monit’s status:

sudo monit status

Implementing Automatic Restarts with Upstart

Upstart, used in older Ubuntu versions and some other distributions, offers built-in respawn functionality for automatic service restarts.

Creating an Upstart Job for Automatic Restarts

Step 1: Create an Upstart job configuration file:

sudo nano /etc/init/myservice.conf

Step 2: Add the following content to the file:

description "My Service"
author "Your Name"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 10 5

exec /path/to/your/service

This configuration:

  • Starts the service on runlevels 2, 3, 4, and 5
  • Enables automatic respawn
  • Limits respawns to 10 attempts within 5 seconds
  • Specifies the command to start your service

Step 3: Start and manage the service:

sudo start myservice
sudo stop myservice
sudo status myservice

Using Cron for Periodic Service Checks

For systems where neither Monit nor Upstart is available, you can use cron jobs to periodically check and restart services.

Step 1: Create a shell script to check and restart the service:

sudo nano /usr/local/bin/check_service.sh

Add the following content:

#!/bin/bash
SERVICE_NAME="your_service"
if ! pgrep -x "$SERVICE_NAME" > /dev/null
then
    /etc/init.d/$SERVICE_NAME start
fi

Step 2: Make the script executable:

sudo chmod +x /usr/local/bin/check_service.sh

Step 3: Add a cron job to run the script:

sudo crontab -e

Add this line to check the service every 5 minutes:

*/5 * * * * /usr/local/bin/check_service.sh

While these methods provide reliable ways to automatically restart services on non-systemd systems, they each have their own strengths and limitations. Monit offers comprehensive monitoring and restart capabilities but requires additional setup. Upstart provides native respawn functionality but is limited to systems using this init system. Cron-based solutions are universally applicable but lack real-time responsiveness. Choose the method that best fits your system’s architecture and your specific needs for service reliability.