我正在开发一个需要使用 NUT 服务器监控 UPS 的项目。对于监控和数据记录,我使用 minibian OS (JESSIE)。为了监控 ETON UPS,我编写了一个 shell 脚本,每秒查询数据。由于我使用一张 8Gb SD 卡来存储操作系统和数据日志,因此我将其分区为根(2Gb)和数据日志(4Gb)驱动器。
UPS 监控脚本由 Crontab 作为后台进程启动。 UPS Monitor 脚本中包含的功能如下:
- 每 1 秒获取一次 UPS 数据
- 每天生成新文件夹
- 日志文件 .csv 的时间戳
- 搜索超过 1 天的文件夹,将其压缩并删除文件夹
问题:
我认为 2 GB 的 root 空间就足够了,因为我的操作系统只需要大约 800 Mb。但当我运行三天测试时,根分区在三天内消耗了超过 100 Mb。这样的话,我的根分区将在30天内被填满
我不知道为什么运行 shell 脚本会导致内存消耗过多。
这是 Raspberry Pi OS(不带 shell 脚本)和 UPS Monitor(带 shell 脚本)的内存使用情况
测试运行时间:3天
UPS 监控内存测试:开始
UPS 监视器内存测试:停止
Raspberry PI OS 内存测试:开始
Raspberry PI OS 内存测试:停止
脚本的内存使用情况
我在网上找到了一些链接来查找脚本的内存使用情况,但无法从中理解任何意义。
数据记录脚本
#!/bin/bash
gpio -g mode 16 out
gpio -g mode 21 out
gpio -g write 16 0
gpio -g mode 24 in
LOG_PATH='/media/ntfs/logs/'
LOG_HEADER=`date +%H:%M:%S`
LOG_DIR_NAME=`date +%d_%m_%Y`
LOG_FOLDER=`find /media/ntfs/logs -type d -mtime +0`
timeCounter=0
switchRead=0
# Browse log directory
cd -- $LOG_PATH
LOG_NAME=$LOG_HEADER
while :
do
switchRead=`gpio -g read 24`
LOG_DIR_NAME=`date +%d_%m_%Y`
LOG_DIR=$LOG_PATH$LOG_DIR_NAME
echo "$LOG_DIR"
if [ -d "$LOG_DIR" ]
then
cd -- $LOG_DIR
echo "DIRECTORY FOUND"
else
mkdir -p $LOG_DIR
LOG_NAME=`date +%H:%M:%S`
echo "NEW DIRECTORY CREATED!!!!!"
cd -- $LOG_DIR
HEADER='UPS MODEL, UPS STATUS, BATTERY CHARGE, BATTERY RUNTIME,$
echo $HEADER > $LOG_NAME.csv
# Calling old folder compression script
/root/day.sh
fi
# executing ups status command and saving result in array
declare -A status="($(upsc myups | sed 's/\(.*\):\(.*\)/[\1]="\2"/'))"
if [[ ${status[device.model]} != "" ]] ; then
echo "WRITIN FILE"
echo ${status[device.model]}","${status[ups.status]}"," ${stat$
fi
if [[ ${status[ups.status]} = *OB* ]] ; then
timeCounter=$(( $timeCounter+1))
#echo $timeCounter ":("
if [[ "$timeCounter" -gt 20 ]] ; then
#echo ":D"
timeCounter=0
LOG_NAME=`date +%H:%M:%S`
echo $HEADER > $LOG_NAME.csv
fi
fi
if [[ "$switchRead" = 1 ]] ; then
echo "Read Kar liya bhiya"
gpio -g write 16 1
`sudo shutdown -h now`
else
gpio -g write 16 0
fi
gpio -g write 21 0
sleep 0.5
gpio -g write 21 1
sleep 0.5
done
exit 0
谢谢
答案1
看起来您正在谈论磁盘使用/存储空间而不是内存使用。内存 (RAM) 是一种快速易失性存储器(断电时数据会丢失),通常由程序用来处理数据。你说的是磁盘使用情况,它物理存储在你的SD卡上,断电时不会丢失。对于其余部分,我假设您指的是磁盘使用情况。
除了数据文件之外,程序在运行时可能在很多地方使用磁盘。如果不确切地知道你的程序在做什么,就很难确切地知道它在做什么来耗尽额外的空间。然而,一些常见的需要查找的内容是日志、缓存和临时文件。
日志文件通常写入/var/log
,缓存文件写入/var/cache
,临时文件写入/tmp
或/var/tmp
。这些位置的规模可能会不断扩大,您应该密切关注。
你实际上有两个选择:
- 查看您的脚本,看看它可能会写入哪些其他位置,这很大程度上取决于它正在做什么,如果没有更多信息,很难建议如何执行此操作。
- 分析您的文件系统以查看可用空间的使用情况。
对于第二点,该工具du
非常方便,它可以让您查看哪些文件/目录占用了空间。以下是我通常发现文件占用大量空间的方式。
从文件系统的根目录开始(如果您大致知道空间的使用位置,则从子目录开始)。跑步sudo du -sxh * | sort -h
。这将需要一段时间,具体取决于它正在分析的目录的大小(但对于 1G 来说,应该不会花太长时间)。选项的含义是-s
:每个列出的文件/目录的摘要。-x
:不要跨越文件系统边界,这样您就不会使用其他磁盘。并-h
打印人类可读的尺寸。他们| sort -h
将按大小顺序对它们进行排序。
一旦找到使用大部分空间的目录,或者使用的空间量增加,您可以 cd 到它们并重新运行 du 命令。重复此操作,直到找到空间的去向。
请注意,在您的情况下,您正在寻找尺寸的增长,但这将是小幅增长而不是绝对尺寸。