我的目标是删除任何进程不再使用的超过5天的旧文件。 作为首发,我已经编写了以下脚本,但它没有用,说没有找到第10行命令。
HOME=~/var
cd $HOME
for f in `find . -type f`; do
if [`lsof -n $f`]; then
echo $f
fi
done
答案 0 :(得分:2)
嗯,如果它没有做好,请试试这个:
#!/bin/bash
DIR=$HOME/var
##########################################################
## files older than 5 days and recursive value set to 1
# for f in $(find $DIR -mtime +5 -maxdepth 1 -type f); do
##########################################################
for f in $(find $DIR -type f); do
# run lsof and look for pattern a-z send it to dev null
lsof -n $f |grep [a-z] > /dev/null
# If it was found the exit status will be 0 or success
if [ $? = 0 ]; then
echo "$f in use -->"
else
echo "File $f not in use"
fi
done
在您的脚本中,您已将HOME定义为〜/ var - 在脚本中使用squigly line我会尝试远离。其次,您正在更改脚本中的环境变量值。尝试从命令行
env|grep HOME
这种新方法更清洁
现在这是另一个指针,可能意味着你需要进行进一步的改变......
你的脚本会在cron作业中运行吗?它会像现有用户一样作为cron条目运行吗?如果设置为root运行,那么上面将失败我会告诉你如何:
echo $HOME
/home/myuser
sudo -i
echo $HOME
/root
注意home的〜或$ HOME值如何变化..所以如果你决定将它作为cron条目作为另一个用户运行,那么试试这个
scriptuser="your_user"
getent passwd $scriptuser|awk -F":" '{print $6}'
如果当前用户是sudo su - 或sudo -i然后执行脚本然后尝试:
getent passwd $(logname)|awk -F":" '{print $6}'