博客的免费飞机场(https://vpn.xiaoweigod.com/)最近注册的人越来越多,慢慢地发现了一个比较严重的bug。当用户在web页面注册完毕之后,远程节点却经常迟迟不同步账号信息。因此会导致这种现象:虽然注册激活成功了,但是无法使用,可能过一天就好了,也可能一直都没用。等下一次手动重启了远程节点又好了。
造成这个bug的原因是节点和数据库分开在不同的主机,且主服务器在用户注册后偶尔无法发送更新节点的命令,这个问题就一直成了一个梗。
最近终于有点时间了,想到了一个比较好的点子。
思路如下:
节点服务器上编写一个脚本,这个脚本会自动连接飞机场的数据库,检测是否有新用户注册,如果有,那么自动重启节点的服务,以此来同步数据库。
因为Linux脚本方面的东西我没有系统学过,所以今天实现功能的这个脚本,完全都是靠百度,举一反三,一点一点凑出来的,如果其中有可以改善的地方,欢迎大家提提意见!
详细的思路如下:
脚本原理大致是每隔每隔一分钟读取一次远程数据库内user表中的id(新用户注册id会变多),然后通过后一分钟读取的id和前一分钟读取的id作对比,如果id变大或者变小了就重启节点,如果id不变就继续监测。
- 为了保证脚本能够24小时不间断运行,所以需要一个无限循环语句,这里我们选择for循环。
- 除此之外,对于数据库内的内容有需要对比的地方,需要一个判断语句,这里选择if。
- 为了保证更新的及时性并避免服务器负载过大,需要延时执行循环,这里选择sleep。
4.数据库操作用mysql命令即可。
脚本内容如下(后面有注释):
#!/bin/bash
clear
# 版权信息
echo 本脚本为小伟博客开发,欢迎大家使用!
echo 小伟博客:https://www.xiaoweigod.com/
echo 小伟博客网络加速器 https://vpn.xiaoweigod.com/
echo 小伟博客免费VIP影院 https://v.xiaoweigod.com/
echo
echo
# 判断是否在SSR目录下
if [ -e logrun.sh ]; then
echo
else echo 请将脚本放到SSR根目录下运行!
exit
fi
# 判断是否安装数据库
which mysql >mysqlpath
if [ $? -eq 1 ]; then
echo 数据库客户端未安装,正在执行安装...
sudo yum -y install mysql
else echo 检测到已安装数据库客户端...
fi
# 判断有无账号密码信息
if [ -e temp ]; then
username=$(cat temp| awk 'NR==1')
password=$(cat temp| awk 'NR==2')
dbname=$(cat temp| awk 'NR==3')
host=$(cat temp| awk 'NR==4')
else
# 如果是第一次运行那么录入账号密码保存到temp文件中
echo date -d"1 week ago" +"%F %H:%M:%S" 首次运行,开始配置...
echo -n 请输入远程数据库用户名:
read username
echo $username >>temp
echo -n 请输入远程数据库密码:
stty -echo
read password
stty echo
echo $password >>temp
echo
echo -n 请输入远程数据库名:
read dbname
echo $dbname >>temp
echo -n 请输入远程数据库地址:
read host
echo $host >>temp
echo
echo 信息录入完成,正在执行操作...
fi
# 测试数据库连接,账号密码没错的话就继续操作
echo date -d"1 week ago" +"%F %H:%M:%S" 正在测试数据库连接...
dbtest=mysql -u$username -p$password -h$host $dbname <<EOF show tables; EOF
if [ ! -n "$dbtest" ]; then
echo 数据库连接失败,请重新运行脚本!
rm -rf temp
exit
exit
else echo date -d"1 week ago" +"%F %H:%M:%S" 数据库连接成功!
fi
# 开始运行,先重启一下节点
echo date -d"1 week ago" +"%F %H:%M:%S" 节点重启中...
echo date -d"1 week ago" +"%F %H:%M:%S" 程序开始运行,重启节点 >>run.log
/bin/bash stop.sh
sleep 3s
/bin/bash logrun.sh
# 监测开始
echo $time 远程节点监测开始...
echo $time 当前每分钟监测一次节点...
set i=0
set j=0
# 最外层的for循环,定义一个无限循环
for((i=0;i<10;))
do
let "j=j+1"
# 读取数据库中的节点用户数量和用户信息
data0=mysql -u$username -p$password -h$host $dbname <<EOF select id from user order by id desc limit 1; EOF
echo $data0 >count0
sed -i 's/id //g' count0
userdata0=mysql -u$username -p$password -h$host $dbname <<EOF select passwd,enable,method,custom_method,protocol,protocol_param,obfs,obfs_param,expire_time,status from user; EOF
# 一分钟后再次读取数据库中的用户数量和用户信息
sleep 1m
data1=mysql -u$username -p$password -h$host $dbname <<EOF select id from user order by id desc limit 1; EOF
echo $data1>count1
sed -i 's/id //g' count1
userdata1=mysql -u$username -p$password -h$host $dbname <<EOF select passwd,enable,method,custom_method,protocol,protocol_param,obfs,obfs_param,expire_time,status from user; EOF
# 定义循环内的变量
time=date -d"1 week ago" +"%F %H:%M:%S"
# 开始判断
# 1.判断用户数据是否修改
if [[ $(cat count1) -eq $(cat count0) && $userdata0 != $userdata1 ]] ;then
/bin/bash stop.sh
sleep 3s
/bin/bash logrun.sh
echo $time 发现用户信息修改,节点更新完成!
echo $time 用户信息修改,更新节点... >>run.log
# 2.判断用户是否无操作
elif [[ $(cat count1) -eq $(cat count0) && $userdata0 == $userdata1 ]] ;then
echo date -d"1 week ago" +"%F %H:%M:%S" 节点第 $j 次监测中...
# 3.判断用户是否删除
elif [[ $(cat count1) -lt $(cat count0) ]] ;then
/bin/bash stop.sh
sleep 3s
/bin/bash logrun.sh
echo $time 发现用户删除,节点更新完成!
echo $time 用户删除,更新节点... >>run.log
# 4.判断用户是否注册
elif [[ $(cat count1) -gt $(cat count0) ]]; then
/bin/bash stop.sh
sleep 3s
/bin/bash logrun.sh
echo $time 发现用户注册,节点更新完成!
echo $time 用户注册,节点更新... >>run.log
else echo 出错了!
fi
done
运行效果如图(中间特意增删了用户):

一键部署节点自动监测(支持centos):
cd ~/shadowsocksr wget https://www.xiaoweigod.com/autorst.sh && chmod +x autorst.sh && ./autorst.sh
















博主,我想问一下,我根据你的那个SS-panel-modV3搭建教程已经成功搭建位置了,但我想把ssr的端口固定位443端口,请问怎么设置呢