阅读 492

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 或者 “[ ]” ,符号”monitoreq0]iftest[]“ 表示取变量的值, -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

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐