linux shell watchdog,使用shell编写的极简WatchDog

WatchDog-看门狗程序用于自动监测进程的运行状态,并按照需要重启进程。对于嵌入式系统的存储服务、网络服务程序经常因为各种错误出现中断,可以使用WatchDog来自动保持服务的可用。WatchDog可以使用shell来进行编写,这里给出一个极简的实现。

1、基本逻辑

检查进程是否存在。

如果进程不存在,则启动之。

如果进程存在,则跳过,休眠给定时间。

再次检查进程,重复上面的步骤。

2、极简版本

编写脚本,如下:

#!/bin/bash

while true; do

ret=`ps -aux | grep "22.*openthings" | grep -v grep | wc -l`

if [ $ret -eq 0 ]; then

nohup sshpass -p password ssh -y -NgL 2200:localhost:22 username@openthings.x.x &

fi

sleep 6

done

每6秒钟检查一次ssh命令的进程,如果退出了自动重新启动。

More simple:

#!/bin/bash

while true; do

sshpass -p password ssh -y -NgL 2200:localhost:22 username@openthings.x.x &

sleep 10

done

3、运行WatchDog

使用nohup和&让其在后台运行,也可以使用screen软件或放在rc.local作为服务运行。

nohup ssht-watchdog &

在本地机器,检查是否在运行:

ps -x

在远程机器,检查ssh的端口:

netstat -a | grep "220\|2088"

4、详细说明

4.1 提取进程信息

如下:

ps -aux | grep "22.*192.168.1.1" | grep -v grep | awk -F " " '{print $1,$2}'

可以根据指定的信息(上面为 “22.*192.168.1.1”)查询进程信息列表,排除grep自己(grep -v grep),通过awk提取信息,按照空格分离字段,并输出前两个字段的值(进程ID/tty)。可以灵活运用来操作进程,如kill 指定进程等等。ps的参数在不同操作系统有所不同,请根据系统而定。

4.2 WatchDog脚本

如下:

#!/bin/bash

# 获取当前时间。

now=`date '+%Y-%m-%d %H:%M:%S'`

# 检测间隔的休眠时间。

sleepTime=6

# 检查进程的关键词,".*"为“且”关系,有顺序。

# 一定要包含在下面的命令中,否则或不断启动新的进程!

grepFlag='22.*openthings'

# 基本目录和日志文件名。

baseDir="/home/smt/openthings/tutools"

thisLog='/home/smt/openthings/tutools/tulog'

# 检查的主循环,无穷循环。

while true; do

# 按照上面设定的关键词获取进程,如果存在返回1。

ret=`ps aux | grep "$grepFlag" | grep -v grep | wc -l`

# 如果不存在,则启动之。

if [ $ret -eq 0 ]; then

cd $baseDir

echo "$now process not exists ,restart process now... " > "$thisLog"

# 可以是任何shell命令。这里以ssh任务说明,不同操作系统和版本的ssh命令参数不同。

# 密钥对需要预先生成,并上传公钥到服务端,追加到/etc/ssh/authrized_keys文件。

# 这里是DropBear的用法。

ssh -K 30 -y -fNgL 2200:localhost:22 username@openthings.x.x -i /opt/etc/.ssh/id_ecdsa >/dev/null 2>&1 &

# 这里是openssh的用法。

#ssh -y -fNgL 2200:localhost:22 username@openthings.x.x -i ~/.ssh/id_ecdsa >/dev/null 2>&1 &

echo "$now restart done ..... " > "$thisLog"

cd $curDir

else # 如果已存在,输出日志即可,不做任何其它操作。

echo "$now process exists , sleep $sleepTime seconds " > "$thisLog"

fi

# 休眠一段时间,重新循环。

sleep $sleepTime

done

nohup sshpass -p mypassword ssh -y -fNgL 2200:localhost:22 username@openthings.x.x &

注意:

这里的ssh和sshpass的后台运行机制不同,参考后面的资料。

具体操作系统的实现有一些差异,需要进行仔细测试后部署。

参考资料

ssh远程运行命令,退出终端后继续执行,参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值