应用商店无故对硬盘进行写入后立即删除
Tofloor
poster avatar
野疯牛
deepin
2020-11-16 06:35
Author



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

Reply Favorite View the author
All Replies
野疯牛
deepin
2020-11-16 06:36
#1

#!/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

Reply View the author
野疯牛
deepin
2020-11-16 06:41
#2

代码还有两个问题尚未解决
1.如果浮点运算的结果绝对值小于1,那么小数点前面的0就没有了
2.我希望代码能每秒循环一次,应当如何进行调整呢?

希望能有懂得的高人解答

Reply View the author
SamLukeYes
deepin
2020-11-16 06:46
#3

可能和 deepin 的 /tmp 不是 tmpfs 有关,不知道为什么要这么设定[尾]

Reply View the author
mcaoser
deepin
2020-11-16 08:00
#4

46M不算大吧,很多应用都会读写硬盘,另外SSD分区后是否会影响其寿命,现在也没个统一的说法。我们通常知道的hdd每个分区,是固定的一段连续的磁盘空间,但SSD可能不是这样,或许在硬盘的更底层有一个动态的映射表,来动态的调整每个磁盘物理块与逻辑块的对应。所以说,重复写SSD某一分区,并不一定是在我们理解的某一小块区域写入,当然这只是我的猜想。

Reply View the author
无名
deepin
2020-11-16 10:07
#5
野疯牛

代码还有两个问题尚未解决
1.如果浮点运算的结果绝对值小于1,那么小数点前面的0就没有了
2.我希望代码能每秒循环一次,应当如何进行调整呢?

希望能有懂得的高人解答

  1. 好像是 bc 的毛病,可以用 awk
  2. 你加了 sleep 了呀,应该是每秒循环一次了啊
Reply View the author
无名
deepin
2020-11-16 10:09
#6

自己也试着写了下脚本

#!/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


Reply View the author
野疯牛
deepin
2020-11-16 17:24
#7
mcaoser

46M不算大吧,很多应用都会读写硬盘,另外SSD分区后是否会影响其寿命,现在也没个统一的说法。我们通常知道的hdd每个分区,是固定的一段连续的磁盘空间,但SSD可能不是这样,或许在硬盘的更底层有一个动态的映射表,来动态的调整每个磁盘物理块与逻辑块的对应。所以说,重复写SSD某一分区,并不一定是在我们理解的某一小块区域写入,当然这只是我的猜想。

重复写SSD某一分区,就是在某一小块区域写入,因为我的根很小

Reply View the author
Comments
mcaoser
2020-11-16 19:20
HDD与SSD很可能不一样,很多年前看过一本书叫磁盘加密解密技术中讲到了硬盘很底层的一些东西,所以SSD的底层肯定会在逻辑层面如分区之类的磁盘块之前有一个动态映射,这样虽然看起来是一直在写某个分区,实际上不是在对同一段物理区块进行写入
野疯牛
deepin
2020-11-16 17:27
#8
无名
  1. 好像是 bc 的毛病,可以用 awk
  2. 你加了 sleep 了呀,应该是每秒循环一次了啊

加了sleep 1是执行过程中暂停一秒,并不是每秒循环一次,其他代码也会占用时间

Reply View the author
野疯牛
deepin
2020-11-16 17:42
#9
无名

自己也试着写了下脚本

#!/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


Reply View the author
无名
deepin
2020-11-16 19:22
#10
野疯牛

加了sleep 1是执行过程中暂停一秒,并不是每秒循环一次,其他代码也会占用时间

每次循环要如此精准地控制在整整一秒,是为了精确体现出速度中的“/s”嘛?

每次取样时间差不是一秒,也可以简单数学计算纠正回去嘛

如:1.02秒内大小变化了100M,速度:98.04 M/s

Reply View the author
无名
deepin
2020-11-16 19:26
#11
野疯牛

第四行报错   Syntax error: "(" unexpected


这个脚本要求用  bash(4+)   执行,你是如何执行的呢?

sh ./monitor.sh  # 不会是这样吧

可以改用:

./monitor.sh  # 脚本第一行指明用 bash 才行
bash ./monitor.sh


Reply View the author
野疯牛
deepin
2020-11-19 07:57
#12
无名

这个脚本要求用  bash(4+)   执行,你是如何执行的呢?

sh ./monitor.sh  # 不会是这样吧

可以改用:

./monitor.sh  # 脚本第一行指明用 bash 才行
bash ./monitor.sh


感谢  我稍后尝试一下

Reply View the author