坑之一
在执行脚本的时候返回:-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/
转载文章受原作者版权保护。转载请注明原作者出处!