Linux高频面试问题:查找大文件并安全清除

本篇文章给大家分享一个linux 线上面试高频问题:如何查找大文件并安全地清除?,给大家分析分析,大家也可以对照着自己分析一下,希望对大家有所帮助!

Linux高频面试问题:查找大文件并安全清除

1 案例描述?

服务线上环境,会出现一些磁盘使用率过高而告警的情况,可能是某个日志文件过大,没有及时清理回收,如何找到大目录和大文件?

如何安全的清理大文件?

如何使占用的磁盘空间快速释放掉?

2 命令一(目录统计排序最佳命令)

(这里以当前目录 ./ 为例,统计 top5)

【du -k –max-depth=1 ./ |sort -nr|head -n5】

[root@test-001 /]# du -k --max-depth=1 ./ |sort -nr|head -n5137450839518./6785876./data2182577./usr1830341./home446856./var//du -k # 显示目录或文件大小时,以 kB 为单位;//du --max-depth=1 [目录] # 只显示指定目录下第一层目录(不含单个文件)的大小;//sort -nr # 以行为单位,根据数字大小从大到小排序;//head -n5 # 显示内容的开头 5 行,这里显示就是 top5 内容;

3 命令二(最实用,目录和文件一起统计排序)

(这里以当前目录 ./ 为例,统计 top5)

(1)命令详情和说明

【du -sk * ./ | sort -nr | head -n5 | awk -F’t’ ‘{if(1024 * 1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024 * 1024) {printf “%.2fTtt %sn”, $1/(1024 * 1024 * 1024), $2} else if(1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024) {printf “%.2fGtt %sn”, $1/(1024 * 1024), $2} else if (1024 * 1024 > $1 && $1 >= 1024) {printf “%.2fMtt %sn”, $1/1024, $2} else {printf “%sktt %sn”, $1, $2}}’ 】

[root@test-001 /]# du -sk * ./ | sort -nr | head -n5 | awk -F't' '{if(1024 * 1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024 * 1024) {printf "%.2fTtt %sn", $1/(1024 * 1024 * 1024), $2} else if(1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024) {printf "%.2fGtt %sn", $1/(1024 * 1024), $2} else if (1024 * 1024 > $1 && $1 >= 1024) {printf "%.2fMtt %sn", $1/1024, $2} else {printf "%sktt %sn", $1, $2}}'7.13G data2.17G usr1.75G home447.04M var408.50M run//du -sk * # 显示当前目录下每个文件夹和文件的大小以KB为单位(最常用),s表示汇总,k是以KB为统计单位;//./ #当前目录下//sort -nr # 以行为单位,根据数字大小从大到小排序;//awk -F't'# 以水平制表符进行分割,后面的程序就是进行换算单位,格式化输出成易懂的形式;

(2)du、head、sort、awk 详细说明参考已有文章附录

(3)Linux 中 printf 命令使用参考

// Linux 中 printf 命令使用参考// https://www.linuxprobe.com/linux-printf-example.html'{    if(1024 * 1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024 * 1024)     {        printf "%.2fTtt %sn", $1/(1024 * 1024 * 1024), $2    }     else if(1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024)     {        printf "%.2fGtt %sn", $1/(1024 * 1024), $2    }     else if (1024 * 1024 > $1 && $1 >= 1024)     {        printf "%.2fMtt %sn", $1/1024, $2    }     else     {        printf "%sktt %sn", $1, $2    }}'

4 如何安全使用 rm 命令删除文件?

(1)rm 命令有哪些坑?

rm -rf / # 这个命令绝逼不能操作,删除根目录下的文件,就是系统中的所有文件都要被删除。如果是线上服务机器操作了,那就悲剧了!误操作了怎么办?赶快ctrl+c、ctrl+z 能保住多少是多少吧。

rm -rf / home/apps/logs/ # 这也是个天坑命令!目的是删除日志文。结果书写时“多了一个空格”的 bug,看懂了么?这就变成了 [rm -rf /] !

埋藏隐患的日志清理 shell 脚本!脚本关键内容如下。

cd ${log_path}rm -rf *

目的是:进入到日志目录,然后把日志都删除。隐患:当目录不存在时,悲剧就发生了!

(2)如何安全使用 rm 命令?

在生产环境把 [rm -rf] 命令替换为 [mv],再写个脚本程序定期清理,模拟回收站的功能。

把日志清理 shell 脚本,改用逻辑与 && 进行连接。

cd ${log_path}rm -rf *

改用逻辑与 && 进行连接,合并成一句,前半句逻辑失败,后半句命令不执行:

```shell

cd ${log_path} && rm -rf *

完整的日志清理 shell 脚本如下:

 ```shell#!/bin/bashbase_home="/home/apps"log_path=${base_home}/logscd ${log_path} && rm -rf *

5 磁盘使用率报警,却查不到具体的大文件?

(1)问题情景

白瓜面试 白瓜面试

白瓜面试 – AI面试助手,辅助笔试面试神器

白瓜面试 40 查看详情 白瓜面试

1 磁盘使用率监控报警,进入机器可以 (df -h) 命令看到磁盘使用率确实超过了报警阀值。

2 使用命令查看大目录,并进入到目录下 【du -sk * ./ | sort -nr | head -n5 | awk -F't' '{if(1024 * 1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024 * 1024) {printf "%.2fTtt %sn", $1/(1024 * 1024 * 1024), $2} else if(1024 * 1024 * 1024 > $1 && $1 >= 1024 * 1024) {printf "%.2fGtt %sn", $1/(1024 * 1024), $2} else if (1024 * 1024 > $1 && $1 >= 1024) {printf "%.2fMtt %sn", $1/1024, $2} else {printf "%sktt %sn", $1, $2}}'

3 依然没找到大文件,该怎么办呢?

(2)排查思路

1 思考:是不是有文件已经被删除了,但进程还在占用该文件,进程未结束,空间未释放?

2 使用「lsof |grep -i deleted」命令查看,能查看到已删除,空间没有释放的文件,包含文件大小,进程和服务名等信息。

1.pnglsof(List Open Files) 用于查看进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP),找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 命令需要访问核心内存和各种文件,所以需要root 用户权限执行。

(3)占用磁盘空间释放

重启下进程所指的服务,占用的磁盘空间即可释放掉。线上生产操作一定要谨慎,不要直接 kill 掉进程,评估看是否有进程服务自身的重启名命令,以及评估服务是否可以重启。

(4)备注附录

1 当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除。

2 当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间。Linux 打开一个文件的时候,内核会为每个进程在 /proc//proc/{nnnn}/fd/文件夹({nnnn} 为 pid)』建立一个以其 pid 为名的文件夹用来保存进程的相关信息,而其子文件夹 fd 保存的是该进程打开的全部文件的 fd(fd:file descriptor)。

3 Ctrl + CCtrl + Z都是中断命令。Ctrl + C 是强制中断程序的执行,进程已经终止;Ctrl + Z 是将任务中止(暂停的意思),他仍然在进程中他只是维持挂起的状态。

6 生产环境常用的安全清理大文件命令

生产环境安全清理大文件的诉求是什么?既要不影响服务的正常运行,又要让磁盘占用的空间快速释放掉(让文件消失掉不是我们的目的,我们的目的是快速释放掉占用的磁盘空间)。

不要使用 「rm -rf xxx.log」;常用 「echo "" > xxx.log」。

这里假设 xxx.log 为大文件,如这个 xxx.log 有几十个 GB,「echo "" > xxx.log」是用一个 "" 内容覆盖原文件内容,使磁盘空间得到瞬间释放!

7 小结

总结了查找大目录以及大文件的常用组合命令(涉及到 du、head、sort、awk 等命令);

以及如何安全使用 rm 命令;

还有在磁盘使用率报警,却查不到具体的大文件的情况如何排查;

最后还提到了常用的 echo 命令对原文件进行覆盖以达到使磁盘空间占用得到瞬间释放。

相关推荐:《Linux视频教程》

以上就是Linux高频面试问题:查找大文件并安全清除的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/261395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 09:10:10
下一篇 2025年11月4日 09:10:54

相关推荐

  • CGO 教程:利用环境变量实现 C/C++ 库路径的灵活配置

    本文探讨了在 Go Cgo 绑定中,如何避免硬编码 C/C++ 库路径,实现跨环境的编译灵活性。我们将介绍 `cgo` 指令不直接支持环境变量的原因,并详细阐述如何通过 `CGO_CFLAGS` 和 `CGO_LDFLAGS` 等系统环境变量,在 `go build` 过程中动态指定头文件和库文件的…

    2025年12月16日
    000
  • Go语言环境配置:解决go install权限不足与GOPATH冲突问题

    本文旨在解决go语言开发中常见的go install命令因gopath或gobin配置不当,导致尝试写入系统目录并遭遇权限不足的问题。我们将详细介绍go环境变量gopath和gobin的作用,提供诊断方法,并给出正确的配置步骤,确保go install能够将编译后的二进制文件和包安装到用户指定的路径…

    2025年12月16日
    000
  • Go语言开发环境GOPATH配置深度解析与安装路径问题解决

    本文深入探讨了go语言开发中go install命令将二进制文件安装到错误路径(如/usr/lib/go)导致权限拒绝的问题。核心在于gopath和gobin环境变量的错误或缺失配置。文章详细阐述了如何正确设置gopath和gobin,确保go工具链能将编译后的可执行文件正确放置到用户指定的目录,从…

    2025年12月16日
    000
  • 在 Go 中实现终端屏幕居中显示文本

    本文介绍了如何使用 Go 语言获取终端窗口的尺寸,并在屏幕中心显示指定文本。我们将利用 golang.org/x/crypto/ssh/terminal 包提供的功能来实现这一目标,并提供示例代码和注意事项,帮助开发者构建更友好的终端应用程序。 获取终端尺寸 在 Go 中,要获取终端窗口的宽度和高度…

    2025年12月16日
    000
  • Go语言性能基准测试:标准实践与参数化优化

    本文详细介绍了go语言中进行性能基准测试的标准方法,强调了使用`benchmarkxxx`函数和`go test -bench=.`命令的正确实践。针对重复代码(dry原则)的挑战,文章提出了通过通用基准测试函数结合特定包装器进行参数化测试的有效策略,帮助开发者编写高效且可维护的性能测试代码。 在G…

    2025年12月16日
    000
  • 使用Go Build Constraints实现跨平台代码管理

    go语言通过构建约束(build constraints)机制,优雅地解决了平台特定代码的兼容性问题。开发者可以利用文件注释或文件名约定,为不同操作系统或架构编写独立的实现,从而在编译时自动选择正确的代码,无需传统预处理器,确保跨平台应用的顺畅构建与运行。 在开发跨平台应用程序时,经常会遇到某些功能…

    2025年12月16日
    000
  • 解决Go go get获取Mercurial仓库包时’hg’未找到的错误

    在使用go语言的`go get`命令获取基于mercurial(`hg`)版本控制系统的远程包时,用户可能会遇到“exec: “hg”: executable file not found in %path%”的错误。本文旨在解释此问题的根源,即系统环境中缺少mercuria…

    2025年12月16日
    000
  • 解决Go语言go get命令中“可执行文件未找到”错误的实用指南

    当使用go语言的`go get`命令获取远程包时,若遇到“exec: “xxx”: executable file not found in %path%”错误,通常意味着系统缺少该远程仓库所依赖的版本控制系统(如mercurial、git、svn)的客户端工具,或者这些工具…

    2025年12月16日
    000
  • Go语言中CGO静态链接C库的实践指南

    本文详细阐述了在go语言中使用cgo静态链接c库的方法。核心在于确保go版本为1.1及以上,并正确配置#cgo ldflags指向静态库文件。同时,文章也探讨了如何通过cgo_enabled=0构建完全静态的go可执行文件,以避免运行时对系统动态库的依赖。 引言:CGO与静态链接C库 Go语言通过C…

    2025年12月16日
    000
  • Go语言go get命令:解决“hg”可执行文件未找到错误

    本文旨在解决go语言开发中,使用`go get`命令获取基于mercurial版本控制系统的远程包时,出现的“exec: “hg”: executable file not found in %path%”错误。核心解决方案是安装mercurial客户端,并确保其可执行文件路…

    2025年12月16日
    000
  • 解决Go安装包权限问题:正确配置GOPATH与GOBIN

    本文旨在解决go语言开发中go install命令因权限不足而失败的问题,即go尝试将编译产物安装到goroot而非用户定义的gopath。我们将深入探讨gopath和gobin的正确配置方法,并提供详细的步骤和示例,确保go包能被正确安装到用户可写的路径,从而避免“权限拒绝”错误。 在Go语言开发…

    2025年12月16日
    000
  • Go Cgo项目中使用环境变量灵活配置C/C++库路径

    本文旨在解决go语言c++go编译中,c/c++库路径硬编码导致的环境不兼容问题。通过深入解析cgo编译指示(`// #cgo`)与`cgo_cflags`、`cgo_ldflags`等环境变量的协同工作机制,教程将指导开发者如何利用环境变量动态指定库的包含路径和链接路径,从而实现跨平台、多开发者环…

    2025年12月16日
    000
  • Go Cgo项目中使用环境变量灵活配置外部C库路径

    本文旨在解决Go Cgo项目中外部C库路径硬编码导致的跨环境兼容性问题。我们将深入探讨为何不能直接在`#cgo`指令中使用环境变量,并详细介绍如何通过Go提供的`CGO_CFLAGS`和`CGO_LDFLAGS`等环境变量,在编译时动态指定C库的包含和链接路径,从而实现更灵活、可移植的Go C绑定编…

    2025年12月16日
    000
  • Go Web 服务器无响应问题排查与解决

    本文旨在帮助开发者解决Go Web服务器在本地运行时无法访问的问题。通过分析常见原因,例如监听地址配置错误和潜在的权限、防火墙问题,提供切实可行的解决方案,并强调错误处理的重要性,确保服务器稳定运行。 在开发Go Web应用程序时,有时会遇到服务器启动后无法通过浏览器访问 localhost:808…

    2025年12月16日
    000
  • 解决 Go Get 获取 Mercurial 仓库包时 ’hg’ 未找到的问题

    本文详细阐述了在使用 `go get` 命令获取基于 mercurial (hg) 版本控制系统的 go 语言包时,遇到 ‘exec: “hg”: executable file not found in %path%’ 错误的解决方案。核心在于需要安…

    2025年12月16日
    000
  • Cgo构建中利用环境变量动态管理外部库路径

    本文探讨了在go语言的cgo绑定中,如何解决硬编码外部库路径导致的环境不兼容问题。通过利用cgo_cflags和cgo_ldflags等环境变量,开发者可以动态指定编译和链接所需的库路径,从而避免在cgo指令中固定路径,提高项目的可移植性和跨平台兼容性。文章提供了具体的示例代码和实践指导,帮助开发者…

    2025年12月16日
    000
  • 文件IO操作性能优化实践

    文件IO优化需减少系统调用、提升吞吐量,核心方法包括:使用缓冲流(如Java的BufferedInputStream、C的setvbuf)合并小IO;批量写入与预分配空间以降低磁盘开销;内存映射(mmap/MappedByteBuffer)加速大文件访问;结合异步IO(如io_uring)与多线程并…

    2025年12月16日
    000
  • Golang开发环境安全加固与配置优化方法

    Go开发环境安全需从最小权限、模块校验、静态扫描和构建优化入手。1. 使用非特权账户运行开发工具,减少攻击面;2. 配置可信GOPROXY与GOSUMDB,启用模块完整性验证,定期检查依赖;3. 集成gosec和govulncheck进行安全扫描,结合CI流程提升代码质量;4. 编译时禁用CGO、启…

    2025年12月16日
    000
  • 动态 Kind 在 App Engine 中的索引配置

    本文档介绍了在 Google App Engine (GAE) 中处理动态 Kind 的索引配置问题。由于 GAE 仅允许通过 `index.yaml` 文件和 `appcfg.py` 工具进行索引配置,因此针对 Kind 名称动态生成的情况,提出了一种通过外部服务器动态生成 `index.yaml…

    2025年12月16日
    000
  • Go语言:使用gofmt进行快速语法检查

    本文详细介绍了在go语言开发中,如何不进行完整项目构建的前提下,快速有效地检查源代码的语法错误。我们将重点探讨`gofmt`工具及其关键的`-e`选项,该选项能够报告代码中的所有语法问题。文章将通过命令行示例演示其用法,并解释如何利用命令的退出状态码来判断语法检查结果,帮助开发者实现高效的代码预检和…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信