我具有以下脚本,用于从/ tmp和/ var / tmp目录中删除Web缓存和文件,以降低磁盘利用率。当我执行脚本时,它不会删除文件,什么也不会给出。
#!/bin/bash
#set -x
#THRESHOLD=30
TEMP1=$(cd /tmp)
TEMP2=$(cd /var/tmp)
df -h | grep -v '^Filesystem' | awk '{print $1,$5}' | while read output;
do
used=$(echo $output | awk '{print $5}' | cut -d '%' -f1)
diskpart=$(echo $output | awk '{print $2}')
if [[ "$used" -ge "30" ]]; then
echo "Disk utilization percentage is more"
# sync; echo 1 > /proc/sys/vm/drop_caches
rm -rf "$TEMP1/*"
rm -rf "$TEMP2/*"
fi
done
以下输出:
srikant@ubuntu:~$ ./example.sh
srikant@ubuntu:~$ ./example.sh
srikant@ubuntu:~$
df -h命令输出:
srikant@ubuntu:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 393M 12M 382M 3% /run
/dev/sda1 19G 9.5G 8.2G 54% /
tmpfs 2.0G 272K 2.0G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs 393M 0 393M 0% /run/user/121
tmpfs 393M 52K 393M 1% /run/user/1000
我在rm -rf之前并在执行脚本时尝试了sudo。但是仍然无法正常工作。 请帮忙。
答案 0 :(得分:1)
生成output
时,其中只有两个字段,例如,原始 $1
和前$5
中的awk '{print $1,$5}'
/dev/sda1
和54%
。然后在:
used=$(echo $output | awk '{print $5}' | cut -d '%' -f1)
您只有这两个字段,因此awk '{print $5}'
部分给出了一个空字符串。应该是:
used=$(echo $output | awk '{print $2}' | cut -d '%' -f1)
除此之外:
TEMP1=$(cd /tmp)
TEMP2=$(cd /var/tmp)
将为空字符串,因为cd
不会在标准输出中写入任何内容。应该是:
TEMP1='/tmp'
TEMP2='/var/tmp'
在这种情况下,引号是可选的。
也:
rm -rf "$TEMP1/*"
将查找名为*
的文字文件,因为文件名扩展未在引号内完成!
编辑:我的首选解决方案是释放外部程序awk
和cut
:
temp1='/tmp' # Avoid uppercase variable names
temp2='/var/tmp' # they can collide with shell names
while read -r diskpart Size Used Avail Use Mounted
do
# Remove the trailing %
used=${Use%%%*}
# A neater from of numeric comparison
if (( used >= 30 ))
then
echo "Disk utilization percentage is more"
#sync; echo 1 > /proc/sys/vm/drop_caches
# Note that putting * inside quotes won't be expanded
rm -rf "$temp1"/*
rm -rf "$temp2"/*
fi
done < <(df -h)