keepalived 踩坑记录

坑之一

在执行脚本的时候返回:-bash: ./nginx_check.sh: /bin/bash^M: 坏 的 解 释 器 : 没 有 那 个 文 件 或 目 录

这个问题是我们在 windows 上编写的 shell 脚本在传输到 linux 上,由于二者空格的编码格式不一致,导致 linux 在执行 shell 脚本的时候就会抛出上去上述错误;

解决方法的话就是通过正则表达式替换对应的空格与回车:

sed -i 's/\r$//' shellNmae

坑之二

在编写 keepalived 的 shell 检测脚本的时候遇到了一个坑,就是明明在外面 ps 执行返回的是 0,但是在 sehll 脚本中返回的却是 2。

nginx 停掉后通过 ps 查询对应的进程,在外面执行结果如下:

[root@localhost sbin]# ps -ef | grep -w nginx | grep -v grep | wc -l
0

但是通过 shell 脚本执行的效果如下

#!/bin/bash

A=ps -ef | grep nginx | grep -v grep | wc -l
echo a = $A
echo ps -ef | grep nginx | grep -v grep
if [ $A -eq 0 ];then
        echo ------------------- enter ---------
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ ps -C nginx -no-header |wc -l -eq 0 ];then
                echo -------------- enter ---------------
                killall keepalived
        fi
fi

输出结果:

[root@localhost src]# ./nginx_check.sh
a = 2
root 19403 9877 0 03:59 pts/1 00:00:00 /bin/bash ./nginx_check.sh root 19409 19403 0 03:59 pts/1 00:00:00 /bin/bash ./nginx_check.sh

原因的话就是 ps 通过模糊匹配把 nginx_check.sh 这个 shell 的进程也给查询出来了,解决方案的话:

我这边选择的是后者,修改如下:

#!/bin/bash

A=ps -ef | grep -w nginx | grep -v grep | wc -l
echo a = $A
echo ps -ef | grep -w nginx | grep -v grep
if [ $A -eq 0 ];then
        echo ------------------- enter ---------
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ ps -C nginx -no-header |wc -l -eq 0 ];then
                echo -------------- enter ---------------
                killall keepalived
        fi
fi

输出结果:

[root@localhost src]# ./nginx_check.sh
a = 0

至此,这个 shell 脚本就可以愉快的运行了。

坑之三

keepalived 不能成功执行对应的脚本文件。

keepalived 在启动的时候是正常的,没有报错。但是我把 nginx 关掉后 keepalived 并没有通过脚本去重新启动 nginx,或者是把自己给 kill 掉。

keepalived 启动:

[root@localhost keepalived]# service keepalived start
Starting keepalived (via systemctl):                       [  确定  ]
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.3.43
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

keepalived 的检测脚本
vrrp_script chk_nginx
{
        script "/usr/local/src/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP        # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33     # 网卡
    virtual_router_id 51        # 主、备机的 virtual_router_id 必须相同
    priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
                # VRRP_H 虚拟地址
        192.168.3.50
    }
}
Mar 29 21:41:33 localhost Keepalived_vrrp[9108]: WARNING - script '/usr/local/src/nginx_check.sh' is not executable for uid:gid 0:0 - disabling.

大致的意思就是 nginx_check.sh 这个脚本不能执行。然后我一看脚本的对应执行权限,原来是还没有设置,于是就通过 chmod 进行设置:

-rw-r--r--. 1 root root     191 3月  30 02:48 nginx_check.sh
[root@localhost log]# chmod 777 /usr/local/src/nginx_check.sh
[root@localhost log]# ll /usr/local/src/
-rwxrwxrwx. 1 root root     191 3月  30 02:48 nginx_check.sh

再重新启动 keepalived 查看:

Mar 30 14:57:03 localhost Keepalived_vrrp[28976]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.

Mar 30 14:57:03 localhost Keepalived_vrrp[28976]: Unsafe permissions found for script '/usr/local/src/nginx_check.sh'.

现在的日志信息大致是不能执行对应的安全脚本,后面经查阅资料原来是要对应的检测脚本与 vrrp_instance 进行绑定,也就是要在 vrrp_instance 中添加对应的脚本;

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.3.43
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx
{
        script "/usr/local/src/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP        # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33     # 网卡
    virtual_router_id 51        # 主、备机的 virtual_router_id 必须相同
    priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
                # VRRP_H 虚拟地址
        192.168.3.50
    }
    track_script{
        chk_nginx
    }
}

改动后的脚本就是添加了,下面这个配置信息,将其进行绑定。后面就可以正常的执行对应的脚本了。

track_script{
    chk_nginx
}

踩过的坑需要总结,这样的话下次就有印象了,也能通过总结去复盘去了解一些新的东西。

Original: https://www.cnblogs.com/lhnstart/p/16079587.html
Author: 李小龙他哥
Title: keepalived 踩坑记录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588710/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • html css中有哪些属性可以继承,哪些不可以继承

    css样式表继承指的是,特定的css属性向下传递到后代元素 为了看到继承的实际应用,我们将使用下面的HTML代码。 <p> <em> 继承em> p&…

    Java 2023年6月13日
    072
  • 记录一下今天所学 9.22

    今天上午在公司没啥任务,就学起了es,看的黑马的资料,先看文档,不懂的地方就去看了下视频。 大概知道了es概念,es是es技术栈中最核心的,这个技术栈还有其他的比如分词器插件,还有…

    Java 2023年6月15日
    080
  • 程序员的10个好习惯

    我总结了 10 个程序员的好习惯,今天分享给大家。 1. 引入新的技术栈的时候,要以官方文档为主 在项目里,无论使用新的 jar 包,还是用新的中间件,一定要去看官方文档。 现在网…

    Java 2023年6月7日
    080
  • Java自动化审计(上篇)

    本文是 i 春秋论坛作家「Wker」表哥分享的技术文章,文章旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。 CodeQl CodeQL是一个免费开源的代码语义分析引擎(…

    Java 2023年5月29日
    072
  • [游戏引擎中文版]YU-RIS 4.5 最新中文支持版

    今天给大家带来一个很重要的引擎——YU-RIS 相对于复杂的krkr2,YU-RIS要可爱的多。 为什么我要说她很重要呢? 我看过不下10篇,日本GAL引擎 介绍 基本每一篇都会介…

    Java 2023年5月29日
    090
  • Hexo 搭建个人博客

    Hexo 1、hexo是什么? Hexo是一个快速、简洁且高效的博客框架。可以把用户的markdown文件,按照指定的主题解析成静态网页。 作用:可以快递搭建个人博客。配置着git…

    Java 2023年6月5日
    0105
  • 【力扣】5. 最长回文子串

    给你一个字符串 s,找到 s 中最长的回文子串。 示例 1:输入:s = “babad”输出:”bab”解释:”aba&…

    Java 2023年6月8日
    0130
  • 使用Java Faker模拟测试数据

    当你需要为你的单元测试想出有用的测试数据时,你是否也经常没有灵感?不要担心,Java Faker来救你了!在这篇博客中,你将学习如何生成你的测试数据。在这篇博客中,你将学习如何生成…

    Java 2023年5月29日
    087
  • Springboot中整合knife4j接口文档

    在项目开发过程中,web项目的前后端分离开发,APP开发,需要由前端后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发。 什么是knife4j 简单说knif…

    Java 2023年6月8日
    091
  • ArrayList和Array数组类型转换

    package com.Mxhlin.arrayList; import java.util.ArrayList; import java.util.Arrays; import …

    Java 2023年6月7日
    0107
  • 分布式搜索引擎–02

    1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Doma…

    Java 2023年6月9日
    063
  • 网络编程(TCP协议)

    TCP协议发送数据 A:创建Socket对象—利用Socket对象 B:获取输出流,写数据 C:释放资源 TCP协议接受数据 A:创建Socket接受对象 B:监听客户…

    Java 2023年6月5日
    089
  • 2022-8-9 第六组 输入输出流

    IO流 Java中输入/输出流常用的流: &#x5B57;&#x8282;&#x8F93;&#x5165;&#x6D41; &#x5…

    Java 2023年6月13日
    079
  • java_异常机制(二)

    1.异常对象处理完之后会怎样: 异常处理对象在异常处理完后,没有引用指向它,变成了不可达对象,Exception对象会在下一个垃圾回收过程中被回收掉。 它将在接下来JVM进行gc操…

    Java 2023年6月5日
    089
  • 对象-一论

    创建与初始化对象 在程序里,使用 new关键字创建类的对象,格式: classType className = new classType()。在使用new的同时,也在内存中为该对…

    Java 2023年6月5日
    084
  • SpringBoot整合MyBatis

    一、准备工作 首先新建一个空工程,springboot相关的整合都放在该工程下。 该空工程名称为spring-boot-example 创建好的空工程如下: 接着我们创建模块 注:…

    Java 2023年6月8日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球