定期清理过期文件和垃圾文件,维持文件系统合理的空间使用率,是一个系统管理员的日常工作。对于中小规模文件系统而言,简单的系统命令或者脚本都就可以实现;但是对于拥有数亿甚至数十亿数文件的大型、超大型文件系统,文件清理就变成一项艰巨的任务。如果确定哪些文件需要被清理,怎样清理大批量文件,怎样确保清理性能,都是系统管理员需要解决的难题。本文探讨了 Linux 下大批量文件自动清理的相关命令和方法,以及实际操作中的最佳实践。
文件自动清理的需求 系统管理员的手中,管理着企业最有价值的资产——数据;而占据企业级服务器操作系统市场半壁江山的 Linux,更是让 Linux 系统管理员成为最重要的资产管理员。管理员的职责,就是让有限的 IT 资源,存储最有价值的数据。1991 年 IBM 推出 3.5 英寸 1GB 硬盘的时候,管理员洞悉硬盘上的每个文件,人工就可以实现文件管理;而今天 PB 级的存储设备,则给文件管理带来了前所未有的挑战。 文件删除操作,用过 Linux 的人都应该可以完成。那么以下这些文件删除操作,你能完成哪些? 删除整个文件系统中以特定后缀结尾的文件、 在一个有 1 百万的文件系统中删除某个指定文件、 从一个千万级的文件系统里,删除指定日期创建的 10 万个文件、 在亿级文件系统里,每天执行文件系统清理,删除 1 年前产生的上百万文件.... 下面要讨论就是如何实现以上文件删除操作的策略和方法,如果以上操作对你来说轻而易举,可以忽略本文。 对于清理文件系统而言,我们可以简单的把清理任务分成两大类,清理过期文件和清理垃圾文件。
复制代码代码如下: RULE EXTERNAL LIST "trash_list" EXEC "" RULE "exp_scan_rule" LIST "trash_list" FOR FILESET("data") WHERE DAYS(CURRENT_TIMESTAMP) – DAYS(ACCESS_TIME) > 30 RULE "tmp_scan_rule" LIST "trash_list" FOR FILESET("data") WHERE NAME LIKE "%.tmp"
复制代码代码如下: mmapplypolicy /data – P trash_rule.txt – L 3 | grep “/data” |awk ‘ {pint $1} ’ > trash.lst split – a 4 – C 10000 – d trash.lst trash_split_
执行以下命令进行删除操作:
复制代码代码如下: for a in `ls trash_splict_*` do rm `cat $a` done
将上述操作保存为 trash_clear.sh,然后定义 crontab 任务如下:
复制代码代码如下: 0 2 * * * /path/trash_clear.sh
手动执行删除任务,待删除文件扫描结果如下:
复制代码代码如下: [I] GPFS Policy Decisions and File Choice Totals: Chose to migrate 0KB: 0 of 0 candidates; Chose to premigrate 0KB: 0 candidates; Already co-managed 0KB: 0 candidates; Chose to delete 0KB: 0 of 0 candidates; Chose to list 1543192KB: 1752274 of 1752274 candidates; 0KB of chosen data is illplaced or illreplicated;