为什么我的机械硬盘总会自动起转

现状

几百块买了个J1900主板,搭配上家里最早电脑的最早的DDR3内存条,本来初中时加了根内存条干到4G内存了,但是新的二十多块的淘宝内存条坏了导致不开机,尽管在老电脑上工作正常😮‍💨。这个电脑自买来刷上UbuntuServer就基本没关过,里面系统装在我买的一个二手固态硬盘上,那个固态硬盘金手指上是开有两个槽的,好像不是m.2接口,转接成SATA接口的盒子金手指上塑料也断了,反之接上还能用。机械硬盘是淘宝上买的50块钱500g那种,这种小机械硬盘投入小,不行了就拆来当摆件。每次我用hdparm -Y让硬盘停转之后过一阵子又会自启,可能和种子下载、jellyfin、smb有关,我每次发现时硬盘都自动转了数十天了。今天有空就让AI(讯飞星火)帮忙写了个脚本。

失败的其中一次尝试

问题

sudo hdparm -C /dev/sdb的输出是:

/dev/sdb:
drive state is: active/idle
或者:

/dev/sdb:
drive state is: standby
请注意这个输出前有一个空行
我需要一个在ubuntu系统下每两分钟自动执行的脚本,你可以分为一个脚本和我需要添加的sudo crontab中的一行
我希望在检测到 drive state is: standby转化为 drive state is: active/idle时在/home/zhaosn/disk.csv文件中添加一行,其由:
echo TZ=UTC-8 date +"%Y/%m/%d %H:%M:%S, %s, %z, "的输出结果和sudo lsof /mnt/hdd的输出结果组合而来

回复

首先,我们需要创建一个脚本来检测硬盘状态并执行相应的操作。以下是脚本的内容:

1
2
3
4
5
6
#!/bin/bash

STATE=$(sudo hdparm -C /dev/sdb | grep "drive state is" | awk '{print $3}')
if [ "$STATE" == "active/idle" ]; then
echo `TZ=UTC-8 date +"%Y/%m/%d %H:%M:%S, %s, %z, "`$(sudo lsof /mnt/hdd) >> /home/zhaosn/disk.csv
fi

将以上内容保存为一个名为check_disk_state.sh的文件。接下来,我们需要为这个脚本添加可执行权限:

1
chmod +x check_disk_state.sh

最后,我们需要将这个脚本添加到crontab中以便每两分钟自动执行一次。请运行以下命令以编辑crontab:

1
crontab -e

在打开的编辑器中,添加以下一行:

1
*/2 * * * * /path/to/check_disk_state.sh

请将/path/to/替换为check_disk_state.sh文件的实际路径。保存并退出编辑器。现在,脚本将在每两分钟自动执行一次,并在检测到硬盘状态从standby变为active/idle时将相关信息追加到/home/zhaosn/disk.csv文件中。

其实这个表现不好,如果我用ls访问硬盘,lsof是看不到的

换种思路

问题

我想在sudo lsof /mnt/hdd执行结果不为空时在/home/zhaosn/disk.csv文件中添加一行,其由:

echo TZ=UTC-8 date +"%Y/%m/%d %H:%M:%S, %s, %z, "的输出结果和sudo lsof /mnt/hdd的输出结果组合而来。设置脚本需要root用户身份运行

回复

你可以使用以下脚本来实现你的需求:

  1. 创建一个名为check_disk_state.sh的文件,并将以下内容复制到该文件中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
set -e
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi

while true; do
LSOF=$(sudo lsof /mnt/hdd)
if [ -n "$LSOF" ]; then
echo `TZ=UTC-8 date +"%Y/%m/%d %H:%M:%S, %s, %z, "`$LSOF >> /home/zhaosn/disk.csv
fi
sleep 60
done
  1. 保存并关闭文件。

  2. 为脚本添加可执行权限:

1
chmod +x check_disk_state.sh
  1. 以root用户身份运行脚本:
1
sudo ./check_disk_state.sh

这个脚本会持续监控/mnt/hdd目录的lsof结果,如果结果不为空,则在/home/zhaosn/disk.csv文件中添加一行,该行由echo TZ=UTC-8 date +"%Y/%m/%d %H:%M:%S, %s, %z, "的输出结果和sudo lsof /mnt/hdd的输出结果组合而成。同时,脚本会每隔60秒检查一次。


为什么我的机械硬盘总会自动起转
https://zhaosn.github.io/2024/whatUseMyDisk/
作者
Zhao SN
发布于
2024年8月4日
更新于
2024年8月4日
许可协议