#!/bin/env bash
i=0
while [ $i -lt 100000 ]
do
size1=$(df|grep nvme0n1p1|awk '{print $3}')
size5=$(df|grep nvme0n1p5|awk '{print $3}')
sizesdb1=$(df|grep sdb1|awk '{print $3}')
sleep 0.990
size2=$(df|grep nvme0n1p1|awk '{print $3}')
size6=$(df|grep nvme0n1p5|awk '{print $3}')
sizesdb2=$(df|grep sdb1|awk '{print $3}')
time1=$(date "+%H:%M:%S")
time5=$(date "+%H:%M:%S")
timesdb2=$(date "+%H:%M:%S")
echo "/ " $time1 $(echo "scale=8;($size2 - $size1)"/1024|bc)'M/s'|grep -v ^"/ $time1 0M/s"
echo /home $time5 $(echo "scale=8;($size6 - $size5)"/1024|bc)'M/s'|grep -v ^"/home $time5 0M/s"
echo "/sdb "$timesdb2 $(echo "scale=8;($sizesdb2 - $sizesdb1)"/1024|bc)'M/s'|grep -v ^"/sdb $timesdb2 0M/s"
i=$((i+1))
done
代码还有两个问题尚未解决
1.如果浮点运算的结果绝对值小于1,那么小数点前面的0就没有了
2.我希望代码能每秒循环一次,应当如何进行调整呢?
希望能有懂得的高人解答
可能和 deepin 的 /tmp 不是 tmpfs 有关,不知道为什么要这么设定![[尾]](/assets/image/raccoon/[tail].gif)
46M不算大吧,很多应用都会读写硬盘,另外SSD分区后是否会影响其寿命,现在也没个统一的说法。我们通常知道的hdd每个分区,是固定的一段连续的磁盘空间,但SSD可能不是这样,或许在硬盘的更底层有一个动态的映射表,来动态的调整每个磁盘物理块与逻辑块的对应。所以说,重复写SSD某一分区,并不一定是在我们理解的某一小块区域写入,当然这只是我的猜想。
代码还有两个问题尚未解决
1.如果浮点运算的结果绝对值小于1,那么小数点前面的0就没有了
2.我希望代码能每秒循环一次,应当如何进行调整呢?
希望能有懂得的高人解答
- 好像是 bc 的毛病,可以用 awk
- 你加了 sleep 了呀,应该是每秒循环一次了啊
自己也试着写了下脚本
#!/bin/env bash
# 路径列表
declare -a path_list=(
'/'
'/home'
'/dev/sdb1'
)
# 已使用大小(关联数组)
declare -A path_used=()
declare -i last current
declare -- path change
while true; do
for path in "${path_list[@]}"; do
# 获取上一次 及 本次 该路径 所属文件系统 已使用大小
current="$(df --output=used "$path" | sed -n 2p)"
last=${path_used[$path]:-$current}
# 计算变化大小,并记录本次大小
change="$(awk '{printf "%.2f", ($2 - $1) / 1024}' <<<"$last $current")"
path_used[$path]=$current
echo -e "\r[$(date "+%H:%M:%S")] $path: $change M/s\e[K"
done
sleep 1
echo -ne "\e[${#path_list[@]}A"
done
46M不算大吧,很多应用都会读写硬盘,另外SSD分区后是否会影响其寿命,现在也没个统一的说法。我们通常知道的hdd每个分区,是固定的一段连续的磁盘空间,但SSD可能不是这样,或许在硬盘的更底层有一个动态的映射表,来动态的调整每个磁盘物理块与逻辑块的对应。所以说,重复写SSD某一分区,并不一定是在我们理解的某一小块区域写入,当然这只是我的猜想。
重复写SSD某一分区,就是在某一小块区域写入,因为我的根很小
- 好像是 bc 的毛病,可以用 awk
- 你加了 sleep 了呀,应该是每秒循环一次了啊
加了sleep 1是执行过程中暂停一秒,并不是每秒循环一次,其他代码也会占用时间
自己也试着写了下脚本
#!/bin/env bash
# 路径列表
declare -a path_list=(
'/'
'/home'
'/dev/sdb1'
)
# 已使用大小(关联数组)
declare -A path_used=()
declare -i last current
declare -- path change
while true; do
for path in "${path_list[@]}"; do
# 获取上一次 及 本次 该路径 所属文件系统 已使用大小
current="$(df --output=used "$path" | sed -n 2p)"
last=${path_used[$path]:-$current}
# 计算变化大小,并记录本次大小
change="$(awk '{printf "%.2f", ($2 - $1) / 1024}' <<<"$last $current")"
path_used[$path]=$current
echo -e "\r[$(date "+%H:%M:%S")] $path: $change M/s\e[K"
done
sleep 1
echo -ne "\e[${#path_list[@]}A"
done
第四行报错 Syntax error: "(" unexpected
加了sleep 1是执行过程中暂停一秒,并不是每秒循环一次,其他代码也会占用时间
每次循环要如此精准地控制在整整一秒,是为了精确体现出速度中的“/s”嘛?
每次取样时间差不是一秒,也可以简单数学计算纠正回去嘛
如:1.02秒内大小变化了100M,速度:98.04 M/s
第四行报错 Syntax error: "(" unexpected
这个脚本要求用 bash(4+) 执行,你是如何执行的呢?
sh ./monitor.sh # 不会是这样吧可以改用:
./monitor.sh # 脚本第一行指明用 bash 才行
bash ./monitor.sh这个脚本要求用 bash(4+) 执行,你是如何执行的呢?
sh ./monitor.sh # 不会是这样吧可以改用:
./monitor.sh # 脚本第一行指明用 bash 才行
bash ./monitor.sh感谢 我稍后尝试一下
Popular Ranking
ChangePopular Events
More

中文 
自己写了个脚本实时监控硬盘剩余容量的变化,发现每次打开应用商店后,根下都会有一个46M的写入和删除,因为我的固态盘是有寿命限制的 而且根比较小,为保护用户的硬盘 ,希望官方能修正这个异常