mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
d4c0dd57f2
sources/tech/20190806 Bash Script to Automatically Start a Services When it Goes Down on Linux.md
546 lines
11 KiB
Markdown
546 lines
11 KiB
Markdown
[#]: collector: (lujun9972)
|
||
[#]: translator: ( )
|
||
[#]: reviewer: ( )
|
||
[#]: publisher: ( )
|
||
[#]: url: ( )
|
||
[#]: subject: (Bash Script to Automatically Start a Services When it Goes Down on Linux)
|
||
[#]: via: (https://www.2daygeek.com/linux-bash-script-auto-restart-services-when-down/)
|
||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||
|
||
Bash Script to Automatically Start a Services When it Goes Down on Linux
|
||
======
|
||
|
||
There are many open source monitoring tools are currently available in market to monitor Linux systems performance.
|
||
|
||
Those are send an email alert when the system reaches the specified threshold limit for CPU, Memory, and Disk space or any service is down.
|
||
|
||
But, it doesn’t have an intelligence to auto start the services, if it crash/goes down.
|
||
|
||
There are various reasons for the process to crash, which you can investigate and fix the issue but it may take a while.
|
||
|
||
If you don’t want to make your service down for a while and if you would like to bring them up immediately whenever it goes down?
|
||
|
||
If so, what to do in this situation? How to mitigate this?
|
||
|
||
We can write our own bash script to start a service whenever it goes down. Writing a shell script is not a big deal and you have to understand few things to achieve this.
|
||
|
||
Once you familiar on this, you can write your own shell script to automate the day to day activities, which will save lots of time.
|
||
|
||
We had added many useful shell scripts in the past. If you want to check those, navigate to the below link.
|
||
|
||
* **[How to automate day to day activities using shell scripts?][1]**
|
||
|
||
|
||
|
||
I have added totally six shell scripts for this usage and you can choose which one is suitable for you.
|
||
|
||
I had applied different commands and methodology in each shell script.
|
||
|
||
**`Note:`**` ` You need to change the email id instead of ours.
|
||
|
||
### 1) How to Automatically Start a Service When it Goes Down on SysVinit Linux System?
|
||
|
||
Use the following bash script, if you would like to start a single service in SysVinit Linux System.
|
||
|
||
I have added **`httpd`**` ` service in this script but you can add the service, which you want to monitor.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor.sh
|
||
|
||
#!/bin/bash
|
||
|
||
serv=httpd
|
||
|
||
sstat=stopped
|
||
|
||
service $serv status | grep -i 'running\|stopped' | awk '{print $3}' | while read output;
|
||
|
||
do
|
||
|
||
echo $output
|
||
|
||
if [ "$output" == "$sstat" ]; then
|
||
|
||
service $serv start
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
else
|
||
|
||
echo "$serv service is running"
|
||
|
||
fi
|
||
|
||
done
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor.sh
|
||
```
|
||
|
||
Alternatively, you can use the following script.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-1.sh
|
||
|
||
#!/bin/bash
|
||
|
||
serv=httpd
|
||
|
||
sstat=$(pidof $serv | wc -l )
|
||
|
||
if [ $sstat -gt 0 ]
|
||
|
||
then
|
||
|
||
echo "$serv is running fine!!!"
|
||
|
||
else
|
||
|
||
echo "$serv is down/dead"
|
||
|
||
service $serv start
|
||
|
||
echo "$serv service is UP now!!!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
fi
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-1.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-1.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-1.sh
|
||
```
|
||
|
||
### 2) How to Automatically Start a Service When it Goes Down on systemd Linux System?
|
||
|
||
Use the following bash script, if you would like to start a single service in systemd Linux System.
|
||
|
||
I have added **`httpd`**` ` service in this script but you can add the service, which you want to monitor.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-2.sh
|
||
|
||
#!/bin/bash
|
||
|
||
serv=httpd
|
||
|
||
sstat=dead
|
||
|
||
systemctl status $serv | grep -i 'running\|dead' | awk '{print $3}' | sed 's/[()]//g' | while read output;
|
||
|
||
do
|
||
|
||
echo $output
|
||
|
||
if [ "$output" == "$sstat" ]; then
|
||
|
||
systemctl start $serv
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
else
|
||
|
||
echo "$serv service is running"
|
||
|
||
fi
|
||
|
||
done
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-2.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-2.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-2.sh
|
||
```
|
||
|
||
Alternatively, you can use the following script.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-3.sh
|
||
|
||
#!/bin/bash
|
||
|
||
serv=httpd
|
||
|
||
sstat=$(pidof $serv | wc -l )
|
||
|
||
if [ $sstat -gt 0 ]
|
||
|
||
then
|
||
|
||
echo "$serv is running fine!!!"
|
||
|
||
else
|
||
|
||
echo "$serv is down/dead"
|
||
|
||
systemctl start $serv
|
||
|
||
echo "$serv service is UP now!!!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
fi
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-3.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-3.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-3.sh
|
||
```
|
||
|
||
### 3) How to Automatically Start Multiple Services When it Goes Down on SysVinit Linux System?
|
||
|
||
Use the following bash script, if you would like to start multiple service in SysVinit Linux System.
|
||
|
||
I have added **`httpd`**` ` and **`rsyslog`**` ` services in this script but you can add the service, which you want to monitor.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-4.sh
|
||
|
||
#!/bin/bash
|
||
|
||
sstat=stopped
|
||
|
||
for serv in httpd rsyslog
|
||
|
||
do
|
||
|
||
service $serv status | grep -i 'running\|stopped' | awk '{print $3}' | while read output;
|
||
|
||
do
|
||
|
||
echo $output
|
||
|
||
if [ "$output" == "$sstat" ]; then
|
||
|
||
service $serv start
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
else
|
||
|
||
echo "$serv service is running"
|
||
|
||
fi
|
||
|
||
done
|
||
done
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-4.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-4.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-4.sh
|
||
```
|
||
|
||
Alternatively, you can use the following script.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-5.sh
|
||
|
||
#!/bin/bash
|
||
|
||
for serv in rsyslog httpd
|
||
|
||
do
|
||
|
||
sstat=$(pgrep $serv | wc -l )
|
||
|
||
if [ $sstat -gt 0 ]
|
||
|
||
then
|
||
|
||
echo "$serv is running!!!"
|
||
|
||
else
|
||
|
||
echo "$serv is down/dead"
|
||
|
||
service $serv start
|
||
|
||
echo "$serv serv is UP now!!!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
fi
|
||
|
||
done
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-5.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-5.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-5.sh
|
||
```
|
||
|
||
### 4) How to Automatically Start Multiple Service When it Goes Down on systemd Linux System?
|
||
|
||
Use the following bash script, if you would like to start multiple services in systemd Linux System.
|
||
|
||
I have added **`httpd`**` ` and **`rsyslog`**` ` services in this script but you can add the service, which you want to monitor.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-6.sh
|
||
|
||
#!/bin/bash
|
||
|
||
sstat=dead
|
||
|
||
for serv in httpd rsyslog
|
||
|
||
do
|
||
|
||
systemctl status $serv | grep -i 'running\|dead' | awk '{print $3}' | sed 's/[()]//g' | while read output;
|
||
|
||
do
|
||
|
||
echo $output
|
||
|
||
if [ "$output" == "$sstat" ]; then
|
||
|
||
systemctl start $serv
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
else
|
||
|
||
echo "$serv service is running"
|
||
|
||
fi
|
||
|
||
done
|
||
|
||
done
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-6.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-6.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-6.sh
|
||
```
|
||
|
||
Alternatively, you can use the following script.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-7.sh
|
||
|
||
#!/bin/bash
|
||
|
||
for serv in rsyslog httpd
|
||
|
||
do
|
||
|
||
sstat=$(pgrep $serv | wc -l )
|
||
|
||
if [ $sstat -gt 0 ]
|
||
|
||
then
|
||
|
||
echo "$serv is running!!!"
|
||
|
||
else
|
||
|
||
echo "$serv is down/dead"
|
||
|
||
systemctl start $serv
|
||
|
||
echo "$serv serv is UP now!!!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
fi
|
||
|
||
done
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-7.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-7.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-7.sh
|
||
```
|
||
|
||
### 5) How to Automatically Start a Service When it Goes Down on systemd and SysVinit Linux System?
|
||
|
||
Use the following bash script, if you would like to start a service in systemd and SysVinit Linux System.
|
||
|
||
I have added **`httpd`**` ` service in this script but you can add the service, which you want to monitor.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-8.sh
|
||
|
||
#!/bin/bash
|
||
|
||
smanager=$(ps -p1 | grep "init\|systemd" | awk '{print $4}')
|
||
|
||
serv=httpd
|
||
|
||
if (( $(pidof $serv | wc -l) > 0 ))
|
||
|
||
then
|
||
|
||
echo "$serv is running!!!"
|
||
|
||
elif [ "$smanager" == "init" ]
|
||
|
||
then
|
||
|
||
service $serv start
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
else
|
||
|
||
systemctl start $serv
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
fi
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-8.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-8.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-8.sh
|
||
```
|
||
|
||
### 6) How to Automatically Start Multiple Services When it Goes Down on systemd and SysVinit Linux System?
|
||
|
||
Use the following bash script, if you would like to start multiple services in systemd and SysVinit Linux System.
|
||
|
||
I have added **`httpd`**` ` and **`rsyslog`**` ` services in this script but you can add the service, which you want to monitor.
|
||
|
||
```
|
||
# vi /opt/scripts/service-monitor-9.sh
|
||
|
||
#!/bin/bash
|
||
|
||
smanager=$(ps -p1 | grep "init\|systemd" | awk '{print $4}')
|
||
|
||
for serv in rsyslog httpd
|
||
|
||
do
|
||
|
||
if (( $(pgrep $serv | wc -l) > 0 ))
|
||
|
||
then
|
||
|
||
echo "$serv is running!!!"
|
||
|
||
elif [ "$smanager" == "init" ]
|
||
|
||
then
|
||
|
||
service $serv start
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
else
|
||
|
||
systemctl start $serv
|
||
|
||
echo "$serv service is UP now.!" | mail -s "$serv service is DOWN and restarted now On $(hostname)" [email protected]
|
||
|
||
fi
|
||
|
||
done
|
||
```
|
||
|
||
Set an executable permission to **`service-monitor-9.sh`**` ` file.
|
||
|
||
```
|
||
$ chmod +x /opt/scripts/service-monitor-9.sh
|
||
```
|
||
|
||
Finally add a cronjob to automate this. It will run every 5 minutes.
|
||
|
||
```
|
||
# crontab -e
|
||
|
||
*/5 * * * * /bin/bash /opt/scripts/service-monitor-9.sh
|
||
```
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
via: https://www.2daygeek.com/linux-bash-script-auto-restart-services-when-down/
|
||
|
||
作者:[Magesh Maruthamuthu][a]
|
||
选题:[lujun9972][b]
|
||
译者:[译者ID](https://github.com/译者ID)
|
||
校对:[校对者ID](https://github.com/校对者ID)
|
||
|
||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||
|
||
[a]: https://www.2daygeek.com/author/magesh/
|
||
[b]: https://github.com/lujun9972
|
||
[1]: https://www.2daygeek.com/category/shell-script/
|