IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Shell编写守护进程实现nginx服务监控 -> 正文阅读

[系统运维]Shell编写守护进程实现nginx服务监控

????????需求描述: 写一个监控nginx的脚本;如果Nginx服务宕机,则该脚本可以检测到并将进程启动;如果正常运转,则不做任何处理。

1. 如何判断一个进程死掉了,分析思路如下:

# Mac 启动nginx服务 
~ % sudo nginx      
# 通过ps -ef命令查看服务是否存在,通过grep-v参数过滤掉执行查看命令时生成grep子进程
~ % ps -ef | grep nginx | grep -v grep
    0 36127     1   0 11:04下午 ??       0:00.00 nginx: master process nginx
   -2 36128 36127   0 11:04下午 ??       0:00.00 nginx: worker process
# $?返回值为0时,表示nginx进程正常
~ % echo $?
0
# Mac 关闭nginxfuwu
~ % sudo nginx -s quit 
# 再次查看nginx服务无任何输出
~ % ps -ef | grep nginx | grep -v grep

# $?返回值为非0时,表示nginx进程已经死掉了
~ % echo $?                           
1

2. 编写守护进程常遇到坑

# 查看nginx进程是否存在
~ % ps -ef | grep nginx | grep -v "grep"
# $?返回值为非0,表示nginx服务已经停止
~ % echo $?
1
# 查看脚本内容中nginx服务进程查询命令
~ % cat 27.nginx_daemon.sh
#!/bin/bash

ps -ef | grep nginx | grep -v grep
echo $?
# 运行脚本,发现 $?返回值竟然不是0,这是为什么呢?
# 因为脚本名中包含nginx了,在执行 sh 27.nginx_daemon.sh这个命令的时候,
# 执行脚本本身也会作为一个子进程运行在系统中,又给grep出来。
~ % sh 27.nginx_daemon.sh
  501 36216 36017   0 11:25下午 ttys000    0:00.01 sh 27.nginx_daemon.sh
0
# 给脚本修改名字,再次运行脚本,$?返回值不为0,充分验证了上述判断是正确的
~ % mv 27.nginx_daemon.sh 27_1.daemon.sh
~ % sh  27_1.daemon.sh
1
# 将脚本名重新改回去
~ % mv  27_1.daemon.sh 27.nginx_daemon.sh

????????如何处理因脚本名包含nginx时,导致“运行脚本包含查看进程命令”和“终端直接运行查看进程命令”,$?返回值不一致问题,解决思路如下:通过使用‘$$’命令进行过滤。

#!/bin/bash

# echo $$, 直接输出执行脚本过程产生的子进程的PID
this_pid=$$
# 通过“grep -v $this_pid”直接把自身执行的子进程过滤掉,
# 这样就可以不管脚本中起的名字包含什么字眼,只要你执行这个脚本的时候过滤掉,
# 从而可以使判断进程是否存在的执行命令做出正确判断
ps -ef | grep nginx | grep -v grep | grep -v $this_pid

echo $?

3. nginx守护进程代码实现

#!/bin/bash
#
# set password="XXX" # 预输入需要的密码
# echo $$, 直接输出执行脚本过程产生的子进程的PID
# 用来过滤脚本本身执行时启动子进程
# 常用于执行脚本传参为进程名称时,查看某个进程情况避免干扰
this_pid=$$
# 通过“grep -v $this_pid”直接把自身执行的子进程过滤掉,
# 这样就可以不管脚本中起的名字包含什么字眼,只要你执行这个脚本的时候过滤掉,
# 从而可以使判断进程是否存在的执行命令做出正确判断
while true
do
ps -ef | grep nginx | grep -v grep | grep -v $this_pid &>/tmp/null
 
if [ $? -eq 0 ];then
	echo "Nginx  is running well"
	# 等待3s
	sleep 3
else
    # Mac 使用
	sudo nginx
	# systemctl start nginx
	echo "Nginx  is down, Start it ..."
fi
done


# 脚本运行结果
~ % sh 27.nginx_daemon.sh
Nginx  is running well
Nginx  is running well
Nginx  is down, Start it ...
Nginx  is running well

4. 使用nopub命令,让脚本运行日志不在前台输出并后台运行进程

# 通过nohup后台挂起运行程序,通过exit命令退出终端然后关闭shell,
# 注意:不能直接退出终端,要不后台无法挂起任务
# 直接输入以下命令,连续两次回车,进程开始在后台作为一个守护进程不停运行
~ % nohup sh  27.nginx_daemon.sh &

[1] 36623
~ % appending output to nohup.out
~ %
# 查看守护进程的日志输出
~ % tail -f nohup.out 
Nginx  is running well
Nginx  is running well
Nginx  is down, Start it ...
Nginx  is running well

# nohup关闭后台程序
# 方式一:通过jobs -l查看进程PID,kill命令结束进程,
# 用于查看当前终端后台运行的任务,换了终端就看不到了
~ % jobs -l
[1]  + 36623 running    nohup sh 27.nginx_daemon.sh
~ % kill % 36623
[1]  + terminated  nohup sh 7.nginx_daemon.sh
~ % jobs -l 
# 方式二:通过ps -ef查看进程PID,kill命令结束进程,
# 用于查看瞬间进程动态,可以看到别的终端后台运行
~ % ps -ef | grep "27.nginx_daemon.sh" | grep -v grep
  501 37561 36017   0 12:39上午 ttys000    0:00.01 sh 27.nginx_daemon.sh
~ % kill % 37561     
[1]  + terminated  nohup sh 27.nginx_daemon.sh

5. 其它判断服务是否正常运行场景

# 以下命令都可以作为进程是否存在判断条件等等,需要灵活运用
~ % netstart -tnlp | grep :80   # 如果进程存在时候就代表服务正常
zsh: command not found: netstart
~ % curl localhost/index.html  # 获取到某个页面的值就认为服务正常
curl: (7) Failed to connect to localhost port 80: Connection refused

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:30:21  更:2022-05-16 11:30:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:37:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码