要往一個Portable SSD上不停寫入,在這個過程中,已經遇到過幾次移動硬盤卡死。因爲沒有及時發現,一般都已經卡死了很久了。
症狀:對應在移動硬盤上的進程%CPU一直在90%以上。
一般處理手法:強制Eject
爲了保護一下ssd 的壽命於是,
k=0
MEGA=10
urgent=850
breaking=60
while true; do
#第一步得到相關的命令的各資源佔用
OUTPUT=`ps aux|head -1;ps aux|grep "some_command"`
DUTPUT=`echo "${OUTPUT}" |grep -v 'grep'` #grep 本身這一條要去掉
#echo "$DUTPUT"
#第二步得到他的CPU佔用
array_all=(${DUTPUT/\t/})
CPU_SIGN=`echo "${array_all[13]}"`
#第三步把得到的CPU_SIGN放大十倍,注意這裏得到的CPU_SIGN其實是個字符串,要變成小數
CPU_SIGN=$(awk '{print $1*$2}' <<<"${CPU_SIGN} ${MEGA}")
#$(這個是爲了恢復vim正常的語法高亮,可忽略
#echo "$CPU_SIGN"
#如果沒事,就break
if [ $CPU_SIGN -lt $urgent ]; then
break
fi
#如果可能有事....
k=$[k+1]
#確定有事,於是第四步找出移動硬盤上的在運行的bash窗口
if [ $k -gt $breaking ]; then
CMD_OUT=$(diskutil unmountDisk /dev/disk2 2>&1 ) #抓住unmount的錯誤輸出
CMD_PUT=`echo "${CMD_OUT}" |grep 'PPID'` #PPID取巧拿法
PPID_NUM=`echo "${CMD_PUT}" | egrep -o -E '[0-9]+'`
#echo $PPID_NUM
#第五步幹掉爺爺進程,然後unmount
kill $PPID_NUM
sleep 2
diskutil unmountDisk /dev/disk2
break
fi
sleep 5
done
最後,做成一個30分鐘啓動一下的定時任務。