redis key的shell脚本,监控运行异常并重启
背景
先需要每秒重置一下redis指定的某个key的值,并且需要在后台实时运行,一旦程序异常就重启该程序并继续运行,保证程序不间断执行。 实现方案: 1.编写更新redis key的shell脚本; 2.使用nohub命令,后台运行shell脚本; 3.编写shell脚本,监控更新redis key的shell脚本的运行状态,一旦发现异常则重启。
编写更新redis key的shell脚本
想要更新redis key,需要连接redis机器,可以使用如下命令:
redis-cli -h redis服务器IP -p redis服务器端口号 -a 密码复制代码
同样,连接mysql的命令如下:
mysql -u 用户名 -p密码 -h 服务器IP地址 -P 服务器MySQL端口号 -D 数据库名复制代码
下面是重置redis key的脚本reset_rediskey.sh,内容如下:
#!/bin/bash while: do date +%Y-%m-%d' '%H:%M:%S.%N /bin/redis-cli -h hostxxxxxx set rediskey1 value1 sleep 5 done复制代码
改脚本每5秒重置一下hostxxxxxx服务器上的key是rediskey1的值为value1。
PS:redis服务器端口号非6379或者设置密码时,需要指定对应的端口号和密码
使用nohub后台运行shell脚本
nohup使用说明
nohup 是 no hang up 的缩写,就是不挂断的意思。
用途:不挂断地在后台运行命令。
语法:nohup Command [ Arg … ] [ & ]
nohup 命令由 Command参数、相关的Arg参数指定、可选的&等组成,该命令忽略所有挂断(SIGHUP)相关的信号。如果要在后台运行nohup 命令,需要添加 & ( 表示“and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
使用案例
一般通过nohup command &的方式在后台运行指定的可执行程序或脚本。
示例1
例如:
nohup /usr/local/node/bin/node /www/im/chat.js >> /usr/local/node/output.log 2>&1 &复制代码
运行结果如下:
如果你想要在退出当前终端/帐户时,单并不结束该进程,那么可以使用nohup命令。该命令可以在你关闭终端/退出帐户之后,继续在后台运行相应的进程。在默认情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。
示例2
nohup sh reset_rediskey.sh > myout.file 2>&1 & 复制代码
在Linux命令中,有些数字用在特定的命令或场景中有着特殊的意义,比如用在上面的nohub命令中:
0 – stdin (standard input),代表标准输入; 1 – stdout (standard output),代表标准输出设备; 2 – stderr (standard error),代表标准错误; ...复制代码
2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到myout.file文件中。
示例3
0 6 * * * /usr/bin/python /home/work/python/reset_rediskey.py > /home/work/python/reset_rediskey.log 2>&1复制代码
这是放在crontab中的定时任务,每天凌晨6点启动该重置redis key的python的脚本,并把日志写在reset_rediskey.log文件中。
nohup和&的区别
& : 是and的意思,指在后台运行。
nohup :是 no hang up 的缩写,指不挂断地运行,注意并没有后台运行的功能。用nohup运行命令可以使命令永久地执行下去,和用户终端没有关系,比如,在运行nohub命令后断开SSH连接,并不会影响程序的运行。
注意nohup没有后台运行的意思,&是指在后台运行,但当用户退出(挂起)的时候,命令自动也跟着退出。
将nohub和&命令结合起来用就可以使命令永久不停地在后台执行,命令格式如下:
nohup COMMAND &复制代码
例如:
sh reset_rediskey.sh &
将sh reset_rediskey.sh任务放到后台 ,即使关闭xshell等远程连接工具的终端,退出当前session会话后,程序依然可以继续运行,但标准输出和标准错误信息会丢失(因为缺少将标准错误/输出日志信息重定向到对应的日志文件)
将sh test.sh任务放到后台 ,关闭xshell,对应的任务也跟着停止。
nohup sh reset_rediskey.sh
将sh reset_rediskey.sh任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入) ,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session后台脚本进程依然继续运行。
nohup sh reset_rediskey.sh &
将sh reset_rediskey.sh任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。
监控程序异常则重启脚本
可以通过ps命令查看后台进程运行状态,一旦发现后台进程退出即重启脚本的方式,达到监控程序永不中断的目的。
查看后台进程
查看运行的后台进程,有多种命令的方式可以实现,比如:jobs -l、ps -aux、ps -ef等
jobs -l
jobs命令只能查看当前终端下还在生效的命令,一旦关闭当前运行命令的终端后,新开另一个终端再去执行jobs命令,就无法看到之前终端运行过的后台程序。
此时利用ps(进程查看命令)
ps -ef命令
ps -ef 指令中ps的意思是process status,即进程状态,其中-ef 是ps命令的选项,表示以详细格式显示所有进程内容。
ps: process status,进程状态
比如,如下命令以详细格式显示重置redis key后台进程的状态信息。
ps -ef | grep reset_rediskey.sh | grep -v grep复制代码
也可以写成:
ps -ef | grep sh | grep -v grep复制代码
但是该方式,由于是通过正则表达式的方式搜索的sh名称,所以可能搜索出来多个同名的进程。
ps -aux
ps -aux | grep reset_rediskey.sh | grep -v grep复制代码
a:显示所有程序
u:以用户为主的格式来显示
x:显示所有程序,不以终端机来区分
用`ps -ef | grep`或`ps -aux | grep`命令查找进程很方便,最后一行总是会grep自己 用`grep -v`参数可以将grep命令排除掉 再用awk提取一下进程ID 复制代码
ps配合awk命令,使用方式如下:
ps -aux|grep reset_rediskey.sh| grep -v grep | awk '{print $2}'复制代码
lsof -i查看某端口的进程PID
如果某个进程起不来,可能是某个端口被占用
查看使用某端口的进程
lsof -i:8090复制代码
或者,通过上面ps命令获取到进程PID后,通过ps pid的方式查看。
netstat -ap|grep 8090复制代码
查看到进程id之后,使用netstat命令查看其占用的端口
netstat -nap|grep 7779复制代码
使用kill杀掉进城后再启动
kill -9 终止后台运行的进程
kill -9 进程号复制代码
完整的监控后台进程异常后再重启的脚本
#! /bin/bash while true do monitor=`ps -ef | grep reset_rediskey | grep -v grep | wc -l ` if [ $monitor -eq 0 ] then echo "reset redis key process is not ran, right now is restarting" nohub sh /home/work/script/reset_rediskey.sh & else echo "reset_rediskey program is running" fi sleep 5 done复制代码
ps -ef 指令中ps的意思是process status,即进程状态, -ef 是ps命令的选项,表示以详细格式显示所有进程内容。
竖线 “ | ” 称为管道符号,是Linux系统一个很强大的功能,表示把前一个命令的输出结果传递给后一个命令处理。
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。后面的Manipulator是要搜索的关键字。
grep -v grep : 其中 -v 是grep命令的选项,表示反向选择,这几个字符表示在前面搜索结果的基础上去除掉带有grep关键字的内容。 因为使用 ”grep+关键字“ 命令搜索时会有一个grep本身的进程,而且带有搜索的关键字,grep -v grep就是要排除自身搜索的影响。
wc -l : wc命令统计指定文件中的字节数、字数、行数,并将统计结果显示输出。选项 ”-l “ 表示统计行数。
综合起来这句指令的意思就是: 以详细格式查看所有进程,从中选出具有关键字 reset_rediskey 的进程,但是排除掉用于查找的grep自身进程,对于满足上面条件的结果,统计其行数,也就是看有几个带有reset_rediskey关键字的进程,将统计的结果赋值给变量monitor 。
if…then…else…fi : shell脚本里面 if 语句的用法, fi 符号与 if 符号成对使用,表示 if 语句的结束。
if [ monitor−eq0]:if语句的判断用test或者“[]”,符号”monitor -eq 0 ] : if 语句的判断用 test 或者 “[ ]” ,符号”monitor−eq0]:if语句的判断用test或者“[]”,符号”“ 表示取变量的值, -eq表示等于, -gt大于, -lt小于, -ge大于等于,-le小于等于。
echo :用于输出显示。
nohub sh /home/work/script/reset_rediskey.sh &复制代码
用于运行reset_rediskey.sh脚本。
sleep 5 : 休眠5秒钟。 done:程序结束。
总体就是使用ps命令监控进程状态,一旦返现监控的进程异常,就使用nohub在后台重新运行脚本程序。
作者:goonwalk
链接:https://juejin.cn/post/7032955414400466952