我有 2 台服务器:1 台主服务器和 1 台从服务器,并且有一个脚本每 1 分钟在从服务器上运行一次以检查主服务器的可用性。
它应该一直运行:
* * * * * /data/BackupServer/StatusCheck.bash >> /data/BackupServer/Output.log 2>&1
后台:Master负责使用crontab在后台运行脚本。
我想要的是:
- 如果主服务器不可用,那么从服务器应该将这些职责添加到其 crontab 中以接管主服务器。
- 如果主服务器再次可用,则从服务器应该
rm
这些 crontab 配置并将其职责再次移交给主服务器(如果有)。
我拥有的是:
#!/bin/bash
check=$(curl -s -w "%{http_code}\n" -L "master" -o /dev/null)
if [[ $check == 200 || $check == 403 ]]
then
# Service is online
echo "Service is online, slave is handing over the tasks to master if any"
exit 0
else
# Service is offline or not working correctly
echo "Service is offline or not working correctly, slave is taking over master now"
exit 1
fi
我需要的是:
当服务器不可用时,从服务器应该手动启动主服务器 crontab 中正在运行的一些脚本。但是,这里我没有将它们添加到 crontab 中,而是要求脚本仅在服务器不可用时运行。
有人能建议我如何在 bash 中自动完成这个过程吗?我没有要求别人为我编写完整的代码,因为我不熟悉这些概念,需要一些帮助。
例如我可以做以下事情吗?
#!/bin/bash
check=$(curl -s -w "%{http_code}\n" -L "master" -o /dev/null)
if [[ $check == 200 || $check == 403 ]]
then
# Service is online
echo "Service is online, slave is handing over the tasks to master if any"
exit 0
else
# Service is offline or not working correctly
echo "Service is offline or not working correctly, slave is taking over master now"
/manoj/scripts/location.plx > /manoj/logs/location/sync.log 2>&1
/manoj/scripts/report.py > /manoj/logs/dashboard/dashboard.log 2>&1
/etc/profile; /manoj/scripts/Space.py > /manoj/logs/dashboard/Consumption.log 2>&1
exit 1
fi
答案1
不要做crontab
操纵。
在主服务器和从服务器上运行脚本。在从服务器上,使用以下命令启动每个脚本:
check=$(curl -s -w "%{http_code}\n" -L "master" -o /dev/null)
if [[ $check == 200 || $check == 403 ]]
then
# master not available; do stuff
else
# master is available, do nothing
exit 0
fi
如果主服务器可用,则从服务器上的脚本将在测试后退出。
答案2
我希望两台机器上运行相同的脚本以减少维护。假设/etc/hosts
主服务器上的文件包含名称“master”,则两台机器可以有相同的脚本,如下所示:
#!/bin/bash
function DoJobs () {
/manoj/scripts/location.plx > /manoj/logs/location/sync.log 2>&1
/manoj/scripts/report.py > /manoj/logs/dashboard/dashboard.log 2>&1
/etc/profile; /manoj/scripts/Space.py > /manoj/logs/dashboard/Consumption.log 2>&1
}
# If master server run jobs and exit
if grep -q "Master" /etc/hosts ; then
DoJobs
exit 0
fi
# Not the master server so do jobs if it is down
check=$(curl -s -w "%{http_code}\n" -L "master" -o /dev/null)
if [[ $check == 200 || $check == 403 ]]
then
# Service is online
echo "Service is online, slave is handing over the tasks to master if any"
exit 0
else
# Service is offline or not working correctly
echo "Service is offline or not working correctly, slave is taking over master now"
DoJobs
exit 1
fi
现在两个服务器只需维护一个脚本。设置新作业时,只需编辑一个文件。