【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出

文章目录

  • 前言
  • 增加守护进程
      • 1. 编写监控脚本
      • 2. 创建 systemd 服务文件
      • 3. 启动并启用服务
      • 4. 验证服务是否运行
      • 注意事项
  • 如何修改守护进程
      • 1. 修改监控脚本
      • 2. 重新加载并重启服务
      • 3. 验证服务是否运行
      • 总结
  • 如何设置一个日志文件来查看信息
      • 1. 修改监控脚本以记录日志
        • 方法一:使用 `logger` 命令记录日志
        • 方法二:将日志重定向到文件
      • 2. 修改 systemd 服务文件(如果使用日志文件)
      • 3. 重新加载并重启服务
      • 4. 查看日志
        • 查看系统日志(如果使用 `logger` 命令)
        • 查看日志文件(如果将日志重定向到文件)
  • 服务脚本含义
      • `[Unit]` 部分
      • `[Service]` 部分
      • `[Install]` 部分
  • 总结全文【直接用这个即可】
      • 1. 编写监控脚本
      • 2. 创建 systemd 服务文件
      • 3. 启动并启用服务
      • 4. 验证服务是否运行
      • 5. 使用 `journalctl` 查看日志

前言

内存溢出后,服务器可能就打不开了,死机了。所以设置个程序监测内存占用状态,超出95%后,直接关掉那个最占用内存的进程。

增加守护进程

在Ubuntu上设置一个守护进程来监控内存使用情况,并在内存超过90%时终止内存占用最多的进程,可以通过编写一个shell脚本和使用systemd来实现。以下是详细的步骤和代码示例:

1. 编写监控脚本

创建一个脚本文件,例如monitor_memory.sh,其内容如下:

我在/root中创建了。

#!/bin/bash# 设置内存阈值为95%
MEMORY_THRESHOLD=95while true; do# 获取总内存和已用内存TOTAL_MEM=$(free | grep Mem | awk '{print $2}')USED_MEM=$(free | grep Mem | awk '{print $3}')# 计算已用内存的百分比MEMORY_USAGE=$(($USED_MEM * 100 / $TOTAL_MEM))# 如果内存使用超过阈值,找到并终止占用内存最多的进程if [ $MEMORY_USAGE -gt $MEMORY_THRESHOLD ]; thenecho "Memory usage is at $MEMORY_USAGE%, which is above the threshold of $MEMORY_THRESHOLD%."TOP_PROCESS_INFO=$(ps -eo pid,comm,%mem,user --sort=-%mem | head -n 2 | tail -n 1)TOP_PROCESS_PID=$(echo $TOP_PROCESS_INFO | awk '{print $1}')TOP_PROCESS_USER=$(echo $TOP_PROCESS_INFO | awk '{print $4}')TOP_PROCESS_MEM=$(echo $TOP_PROCESS_INFO | awk '{print $3}')echo "Killing process $TOP_PROCESS_PID, owned by $TOP_PROCESS_USER, which is using $TOP_PROCESS_MEM% of memory."kill -9 $TOP_PROCESS_PIDfi# 每隔60秒检查一次sleep 60
done

确保脚本具有可执行权限:

chmod +x monitor_memory.sh

2. 创建 systemd 服务文件

/etc/systemd/system/目录下创建一个服务文件,例如memory_monitor.service,其内容如下:

[Unit]
Description=Memory Monitor Service
After=network.target[Service]
Type=simple
ExecStart=/root/monitor_memory.sh
Restart=on-failure[Install]
WantedBy=multi-user.target

请将/path/to/your/monitor_memory.sh替换为实际的脚本路径。

3. 启动并启用服务

重新加载systemd,启动并启用服务:

sudo systemctl daemon-reload
sudo systemctl start memory_monitor.service
sudo systemctl enable memory_monitor.service

4. 验证服务是否运行

使用以下命令检查服务状态:

sudo systemctl status memory_monitor.service

如果一切正常,服务应该会显示为“active (running)”。

注意事项

  1. 这种方法会强制终止占用内存最多的进程,可能导致数据丢失或服务中断。请谨慎使用。
  2. 可根据需要调整脚本的检查频率和阈值。
  3. 可以在脚本中添加日志记录以便后续分析。

通过上述步骤,你就可以在Ubuntu上设置一个守护进程来监控内存使用情况,并在内存超过95%时终止占用最多的进程。

在这里插入图片描述

如何修改守护进程

比如要将监控频率从每60秒一次改为每10秒一次,同时更新和重启服务,你需要进行以下修改和操作:

1. 修改监控脚本

编辑之前创建的 monitor_memory.sh 脚本,将 sleep 时间从 60 秒改为 10 秒:

#!/bin/bash# 设置内存阈值为95%
MEMORY_THRESHOLD=95while true; do# 获取总内存和已用内存TOTAL_MEM=$(free | grep Mem | awk '{print $2}')USED_MEM=$(free | grep Mem | awk '{print $3}')# 计算已用内存的百分比MEMORY_USAGE=$(($USED_MEM * 100 / $TOTAL_MEM))# 如果内存使用超过阈值,找到并终止占用内存最多的进程if [ $MEMORY_USAGE -gt $MEMORY_THRESHOLD ]; thenecho "Memory usage is at $MEMORY_USAGE%, which is above the threshold of $MEMORY_THRESHOLD%."TOP_PROCESS_INFO=$(ps -eo pid,comm,%mem,user --sort=-%mem | head -n 2 | tail -n 1)TOP_PROCESS_PID=$(echo $TOP_PROCESS_INFO | awk '{print $1}')TOP_PROCESS_USER=$(echo $TOP_PROCESS_INFO | awk '{print $4}')TOP_PROCESS_MEM=$(echo $TOP_PROCESS_INFO | awk '{print $3}')echo "Killing process $TOP_PROCESS_PID, owned by $TOP_PROCESS_USER, which is using $TOP_PROCESS_MEM% of memory."kill -9 $TOP_PROCESS_PIDfi# 每隔10秒检查一次sleep 10
done

保存并关闭文件。

2. 重新加载并重启服务

执行以下命令重新加载 systemd,然后重启并启用服务:

sudo systemctl daemon-reload
sudo systemctl restart memory_monitor.service

3. 验证服务是否运行

使用以下命令检查服务状态:

sudo systemctl status memory_monitor.service

如果服务正常运行,它将显示为“active (running)”。

总结

通过以上步骤,你将监控频率改为每10秒检查一次,并重启了服务。这样,守护进程将每10秒检查一次内存使用情况,并在内存超过阈值时终止占用最多的进程。

如何设置一个日志文件来查看信息

为了查看脚本中 echo 命令打印的日志信息,可以将其输出重定向到一个日志文件。可以在 monitor_memory.sh 脚本中添加日志记录,并确保 systemd 服务配置正确处理日志输出。以下是详细步骤:

1. 修改监控脚本以记录日志

编辑 monitor_memory.sh 脚本,添加日志记录功能。可以使用 logger 命令将信息写入系统日志,也可以将日志输出重定向到一个专用的日志文件。以下是两种方法:

方法一:使用 logger 命令记录日志

echo 命令替换为 logger 命令,将信息写入系统日志:

#!/bin/bash# 设置内存阈值为95%
MEMORY_THRESHOLD=95while true; do# 获取总内存和已用内存TOTAL_MEM=$(free | grep Mem | awk '{print $2}')USED_MEM=$(free | grep Mem | awk '{print $3}')# 计算已用内存的百分比MEMORY_USAGE=$(($USED_MEM * 100 / $TOTAL_MEM))# 如果内存使用超过阈值,找到并终止占用内存最多的进程if [ $MEMORY_USAGE -gt $MEMORY_THRESHOLD ]; thenlogger "Memory usage is at $MEMORY_USAGE%, which is above the threshold of $MEMORY_THRESHOLD%."TOP_PROCESS_INFO=$(ps -eo pid,comm,%mem,user --sort=-%mem | head -n 2 | tail -n 1)TOP_PROCESS_PID=$(echo $TOP_PROCESS_INFO | awk '{print $1}')TOP_PROCESS_USER=$(echo $TOP_PROCESS_INFO | awk '{print $4}')TOP_PROCESS_MEM=$(echo $TOP_PROCESS_INFO | awk '{print $3}')logger "Killing process $TOP_PROCESS_PID, owned by $TOP_PROCESS_USER, which is using $TOP_PROCESS_MEM% of memory."kill -9 $TOP_PROCESS_PIDfi# 每隔10秒检查一次sleep 10
done
方法二:将日志重定向到文件

将所有输出重定向到一个日志文件,例如 /var/log/memory_monitor.log

#!/bin/bash# 设置内存阈值为95%
MEMORY_THRESHOLD=95
LOG_FILE="/var/log/memory_monitor.log"while true; do# 获取总内存和已用内存TOTAL_MEM=$(free | grep Mem | awk '{print $2}')USED_MEM=$(free | grep Mem | awk '{print $3}')# 计算已用内存的百分比MEMORY_USAGE=$(($USED_MEM * 100 / $TOTAL_MEM))# 如果内存使用超过阈值,找到并终止占用内存最多的进程if [ $MEMORY_USAGE -gt $MEMORY_THRESHOLD ]; thenecho "$(date): Memory usage is at $MEMORY_USAGE%, which is above the threshold of $MEMORY_THRESHOLD%." >> $LOG_FILETOP_PROCESS_INFO=$(ps -eo pid,comm,%mem,user --sort=-%mem | head -n 2 | tail -n 1)TOP_PROCESS_PID=$(echo $TOP_PROCESS_INFO | awk '{print $1}')TOP_PROCESS_USER=$(echo $TOP_PROCESS_INFO | awk '{print $4}')TOP_PROCESS_MEM=$(echo $TOP_PROCESS_INFO | awk '{print $3}')echo "$(date): Killing process $TOP_PROCESS_PID, owned by $TOP_PROCESS_USER, which is using $TOP_PROCESS_MEM% of memory." >> $LOG_FILEkill -9 $TOP_PROCESS_PIDfi# 每隔10秒检查一次sleep 10
done

确保日志文件具有写入权限:

sudo touch /var/log/memory_monitor.log
sudo chmod 666 /var/log/memory_monitor.log

2. 修改 systemd 服务文件(如果使用日志文件)

如果选择将日志输出重定向到文件,则需要确保 systemd 服务能够正确处理这些输出。在 /etc/systemd/system/memory_monitor.service 文件中,添加 StandardOutputStandardError 选项:

[Unit]
Description=Memory Monitor Service
After=network.target[Service]
Type=simple
ExecStart=/root/monitor_memory.sh
StandardOutput=append:/var/log/memory_monitor.log
StandardError=append:/var/log/memory_monitor.log
Restart=on-failure[Install]
WantedBy=multi-user.target

3. 重新加载并重启服务

执行以下命令重新加载 systemd,然后重启并启用服务:

sudo systemctl daemon-reload
sudo systemctl restart memory_monitor.service

4. 查看日志

根据你选择的日志记录方法,查看日志信息:

查看系统日志(如果使用 logger 命令)

使用 journalctl 查看日志:

sudo journalctl -u memory_monitor.service
查看日志文件(如果将日志重定向到文件)

使用 cattail 命令查看日志文件:

cat /var/log/memory_monitor.log
# 或
tail -f /var/log/memory_monitor.log

通过以上步骤,你可以在监控脚本中记录日志,并使用 systemd 服务来管理和查看这些日志。

服务脚本含义

这个 systemd 服务单元文件定义了一个名为 memory_monitor.service 的服务,该服务运行一个用于监控内存使用情况的脚本。以下是各部分的详细解释:

[Unit] 部分

  • Description=Memory Monitor Service:描述该服务的功能,这里是“内存监控服务”。
  • After=network.target:指定该服务应该在 network.target 之后启动。这意味着网络服务启动后才会启动该服务。

[Service] 部分

  • Type=simple:指定服务类型为 simple,表示 ExecStart 选项启动的进程不会派生其他子进程,且不会进入后台。systemd 会认为该服务的主进程就是 ExecStart 启动的进程。
  • ExecStart=/root/monitor_memory.sh:指定服务启动时执行的命令,即运行 /root/monitor_memory.sh 脚本。
  • StandardOutput=append:/var/log/memory_monitor.log:将标准输出(即脚本中 echo 或其他标准输出的内容)追加到 /var/log/memory_monitor.log 文件中。
  • StandardError=append:/var/log/memory_monitor.log:将标准错误输出(即脚本中错误信息的输出)追加到 /var/log/memory_monitor.log 文件中。
  • Restart=on-failure:如果服务因为非零退出状态失败,则自动重启服务。这有助于确保服务在意外故障时重新启动。

[Install] 部分

  • WantedBy=multi-user.target:指定该服务应该在多用户目标下启动。multi-user.target 是一个常用的系统运行级别,类似于传统的运行级别 3(多用户模式,不带图形界面)。

总结全文【直接用这个即可】

在Ubuntu上设置一个守护进程来监控内存使用情况,并在内存超过90%时终止内存占用最多的进程,可以通过编写一个shell脚本和使用systemd来实现。以下是详细的步骤和代码示例:

1. 编写监控脚本

创建一个脚本文件,例如monitor_memory.sh,其内容如下:

我在vim /root/monitor_memory.sh中创建了。

#!/bin/bash# 设置内存阈值为95%
MEMORY_THRESHOLD=95while true; do# 获取总内存和已用内存TOTAL_MEM=$(free | grep Mem | awk '{print $2}')USED_MEM=$(free | grep Mem | awk '{print $3}')# 计算已用内存的百分比MEMORY_USAGE=$(($USED_MEM * 100 / $TOTAL_MEM))# 如果内存使用超过阈值,找到并终止占用内存最多的进程if [ $MEMORY_USAGE -gt $MEMORY_THRESHOLD ]; thenlogger "Memory usage is at $MEMORY_USAGE%, which is above the threshold of $MEMORY_THRESHOLD%."TOP_PROCESS_INFO=$(ps -eo pid,comm,%mem,user --sort=-%mem | head -n 2 | tail -n 1)TOP_PROCESS_PID=$(echo $TOP_PROCESS_INFO | awk '{print $1}')TOP_PROCESS_USER=$(echo $TOP_PROCESS_INFO | awk '{print $4}')TOP_PROCESS_MEM=$(echo $TOP_PROCESS_INFO | awk '{print $3}')logger "Killing process $TOP_PROCESS_PID, owned by $TOP_PROCESS_USER, which is using $TOP_PROCESS_MEM% of memory."kill -9 $TOP_PROCESS_PIDfi# 每隔10秒检查一次sleep 10
done

确保脚本具有可执行权限:

chmod +x monitor_memory.sh

2. 创建 systemd 服务文件

/etc/systemd/system/目录下创建一个服务文件,例如memory_monitor.service,其内容如下:

[Unit]
Description=Memory Monitor Service
After=network.target[Service]
Type=simple
ExecStart=/root/monitor_memory.sh
StandardOutput=append:/var/log/memory_monitor.log
StandardError=append:/var/log/memory_monitor.log
Restart=on-failure[Install]
WantedBy=multi-user.target

请将/root/monitor_memory.sh替换为实际的脚本路径。

3. 启动并启用服务

重新加载systemd,启动并启用服务:

sudo systemctl daemon-reload
sudo systemctl start memory_monitor.service
sudo systemctl enable memory_monitor.service

4. 验证服务是否运行

使用以下命令检查服务状态:

sudo systemctl status memory_monitor.service

如果一切正常,服务应该会显示为“active (running)”。

5. 使用 journalctl 查看日志

sudo journalctl -u memory_monitor.service

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用代理IP实现高效大数据抓取的策略与技巧

在当今信息爆炸的时代,数据对于各行各业都至关重要。而数据的获取往往需要通过网络爬取。然而随着网络安全意识的提高和反爬虫机制的加强,传统的数据爬取方式可能会受到限制。在这种情况下,代理IP技术的应用就显得尤为重要。本文将探讨代理IP…

C语言 | Leetcode C语言题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; int countPrimes(int n) {if (n < 2) {return 0;}int isPrime[n];int primes[n], primesSize 0;memset(isPrime, 0, sizeof(isPrime));for (int i 2; i < n; i) {if (!isPrime[i]) {primes[primesSize] i;}for (int j 0; j < …

C++ | Leetcode C++题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* removeElements(ListNode* head, int val) {struct ListNode* dummyHead new ListNode(0, head);struct ListNode* temp dummyHead;while (temp->next ! NULL) {if (temp->next->val val) {…

arco disign vue 日期组件的样式穿透

问题描述: 对日期组件进行样式穿透. 原因分析: 如图,日期组件被展开时它默认将dom元素挂载到body下, 我们的页面在idroot的div 里层, 里层想要穿透外层是万万行不通的. 解决问题: 其实官网提供了参数,但是并没有提供例子, 只能自己摸索着过河. 对于日期组件穿透样式,我们能…

GEO数据挖掘-富集分析、TinyArray简化流程、多组样本分析more

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 富集分析一些理论知识具体代码 富集不到的补救措施更多资料---问题数据和常见错误分析Part4-复杂数据及其分析多分组数据分析流程 tinyarray简化版本分析流程多分组…

如何高效安全的开展HPC数据传输,保护数据安全?

高性能计算&#xff08;HPC&#xff09;在多个行业和领域中都有广泛的应用&#xff0c;像科学研究机构、芯片IC设计企业、金融、生物制药、能源、航天航空等。HPC&#xff08;高性能计算&#xff09;环境中的数据传输是一个关键环节&#xff0c;它涉及到将数据快速、安全地在不…

【嵌入式操作系统(Linux篇)】实验期末复习(1)

以下是关于嵌入式操作系统&#xff08;Linux篇&#xff09;的实验汇总&#xff0c;大概率都是会考的 特别是shell程序和文件IO的操作 嵌入式操作系统实验小结—涉及期末大题 &#xff08;一&#xff09;Linux操作系统的使用实验 1、认识Linux操作系统的目录结构 请进入自己…

代理IP如何助力旅游信息聚合?

在数字化时代&#xff0c;旅游信息聚合对于提升服务质量、优化用户体验起着至关重要的作用。随着在线旅游预订的普及&#xff0c;旅游信息的采集、整合和呈现成为了一个复杂而关键的过程。在这个过程中&#xff0c;代理IP技术以其独特的优势&#xff0c;为旅游信息聚合提供了强…

APP项目测试 之 开发模型和发布

项目客户端一般分为&#xff1a;浏览器端和APP端 APP端分为&#xff1a;手机端&#xff08;安装在手机上的软件&#xff09;和PC端&#xff08;安装在电脑上的软件&#xff09; 1.开发模型 项目迭代速度不同&#xff1a;开发模型不一样 传统行业&#xff1a;瀑布模型 互联网行业…

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…

vue2axios的使用

1.安装axios npm i axios 2.配置代理服务器 1.在config.js中配置单个代理服务器 // 开启代理服务器 需要重新启动项目devServer: {proxy: http://localhost:5000}配置简单&#xff0c;请求资源时直接发给前端&#xff08;8080&#xff09;即可&#xff1b;但不能配置多个代理…

ORB-SLAM2同OpenMVS实现三维重建

ORB-SLAM2 位姿导出 Note: 为与OpenMVS进行对接本次进对ORB-SLAM2进行部分修改&#xff0c;使之可以为 OpenMVS提供稀疏点云、关键帧的位姿、内参&#xff0c;以及稀疏点云在各个View 中的可见性。 主要更改如下 . 在Map文件下增添如下函数 public: void Save(const string &a…

iOS shouldRecognizeSimultaneouslyWithGestureRecognizer 调用机制探索

shouldRecognizeSimultaneouslyWithGestureRecognizer 经常会看到&#xff0c;但是一直没有弄清楚其中的原理和运行机制&#xff0c;今天专门研究下 其运行规律 我们准备三个视图&#xff0c;如下&#xff0c;红色的是绿色视图的父视图&#xff0c;绿色视图 是蓝色视图的父视图…

Feign 配置全局日志存入mongo

1、开启feign日志 在application.yml 添加配置 feign:client:config:default:loggerLevel: FULL2、日志实体类 Document(collection "feignLogs") Data public class FeignLog {Idprivate String id;private String method;private String url;private LocalDate…

CTF-PWN-LLVM-【红帽杯-2021 simpleVM】

文章目录 参考检查逆向漏洞思路调试定位到PASS名exp 参考 https://bbs.kanxue.com/thread-274259.htm#msg_header_h2_6 http://www.blackbird.wang/2022/08/30/LLVM-PASS%E7%B1%BBpwn%E9%A2%98%E6%80%BB%E7%BB%93/ 检查 因为是用opt运行&#xff0c;加载动态库VMPASS.so的P…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(四)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

基于STM32的智能花园灌溉系统

目录 引言环境准备智能花园灌溉系统基础代码实现&#xff1a;实现智能花园灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;花园灌溉管理与优化问题解决方案与优化收尾与总结 1. 引言 智能花园灌溉系统通过使用ST…

普元EOS学习笔记-EOS8.3精简版安装

前言 普元EOS是优秀的高低开结合的企业应用软件开发框架。 普元&#xff1a;这是普元公司的名字&#xff0c;普元信息&#xff0c;上市公司哦&#xff0c;这里就不过多安利了。 EOS&#xff1a;普元公司的企业应用开发系统&#xff0c;开发语言是基于Java&#xff0c;技术框…

在 UBUNTU 22.04 上逐步构建 Postal SMTP 服务器

构建 Postal SMTP 服务器来发送批量电子邮件是电子邮件营销人员的不错选择。Postal 功能非常强大&#xff0c;并拥有大量开发人员的支持。它是一个用 JavaScript 和 Ruby 编写的开源邮件服务器脚本。它可用于构建内部 SMTP 服务器&#xff0c;就像 Mailgun、Sendgrid、Mailchim…

LangChain入门学习笔记(七)—— 使用检索提高生成内容质量

大模型训练使用的数据是开放的、广泛的&#xff0c;因此它显得更加的通用。然而在有些应用场景下&#xff0c;用户需要使用自己的数据使得大模型生成的内容更加贴切&#xff0c;也有时候用户的数据是敏感的&#xff0c;无法提供出来给大模型进行通用性的训练。RAG技术就是一种解…