1. 这不是命令手册,是Linux生活里的“肌肉记忆”
你有没有过这样的时刻:在终端里敲下df -h,眼睛扫过那一串带百分比的磁盘使用率,心里突然一紧——/home分区快满了,但根本不知道是哪个文件在偷偷吃空间;或者正用SSH连着服务器跑一个耗时脚本,刚想切出去查个资料,窗口一关,进程直接没了,前功尽弃;又或者想把几十个日志文件从旧目录挪到新目录,mv敲完回车,结果发现目标路径少了个斜杠,整个目录被当成文件名塞进了上一级……这些不是故障,是Linux日常里最真实的“生活褶皱”。
“LINUX生活小技巧”这六个字,表面看是零散命令堆砌,实则是一套面向真实使用场景的生存逻辑——它不教你怎么写内核模块,也不讲POSIX标准有多严谨,而是聚焦在人与系统共处时那些反复发生的、带点烦躁感的微小卡点。screen解决的是“我得走开一会儿,但程序不能停”;df和du联手回答“我的硬盘到底被谁占了”;mv背后藏着路径语义的精密博弈;而所有这些命令的组合、参数取舍、执行顺序,本质上是在训练一种对文件系统状态的直觉式判断力。我做Linux运维和教学十多年,见过太多人把du -sh *背得滚瓜烂熟,却在生产环境误删/var/log后手忙脚乱——问题从来不在命令本身,而在命令背后的意图是否被真正理解。这篇内容,就是把那些没写进man page、但老手每天都在用的“手感”和“分寸感”,掰开揉碎讲清楚。适合刚装好Ubuntu想折腾的大学生,也适合在国产Linux发行版上维护政务系统的工程师,甚至包括用WSL跑开发环境却总被符号链接搞晕的前端同学——只要你每天要和终端打交道,它就不是“技巧”,而是呼吸一样的基本功。
2. 核心思路拆解:为什么是screen、df、du、mv这四个?
2.1 不是随机选的四个命令,而是覆盖Linux生活三大刚需场景
很多初学者会疑惑:Linux命令成百上千,为什么偏偏拎出screen、df、du、mv?这不是凑数,而是它们恰好卡在三个最频繁、最易出错、且后果最直观的生活断点上:
场景一:长时任务的“存在感”危机
screen解决的是时间维度上的失控。当你运行tail -f /var/log/syslog、python train.py或rsync -avz时,终端窗口一旦关闭,进程收到SIGHUP信号直接终止。screen的本质不是“多开窗口”,而是为进程创建一个独立于终端会话的守护上下文。它像给进程套了个透明罩子,罩子外终端关了、网络断了、SSH超时了,罩子里的进程照常呼吸。这种设计哲学,和Windows的“服务”或macOS的launchd异曲同工,但实现更轻量、更贴近用户态。我见过太多人用nohup+&凑合,结果发现nohup.out日志爆炸、无法重连、无法切换会话——screen才是那个能让你安心去泡杯茶、回来还能接着看输出的方案。场景二:磁盘空间的“幽灵侵占”
df和du是一对必须捆绑使用的“双生子”。df(disk free)告诉你文件系统层面的剩余空间,它读取的是superblock里的块统计信息,快、准、但“看不见文件”;du(disk usage)则逐个遍历目录树,计算实际文件占用的磁盘块,慢、细、但可能被硬链接、稀疏文件、已删除但未释放的inode干扰。两者数值不一致?这不是bug,而是Linux文件系统设计的必然结果。比如df显示根分区95%满,du -sh /却只算出80GB,那剩下的15%很可能藏在:被rm删除但仍有进程打开的文件(lsof +L1可查)、/proc或/sys这类虚拟文件系统(du会跳过,df不计入)、或者/var/log/journal里滚动的日志。把df和du当“侦探搭档”用,才能揪出真正的空间窃贼。场景三:文件操作的“语义陷阱”
mv看似最简单,却是Linux里最容易因路径语法引发灾难性后果的命令。关键在于mv对斜杠(/)的敏感度:mv dir1 dir2表示把dir1整个移动到dir2目录下(若dir2不存在,则重命名为dir2);而mv dir1 dir2/明确告诉系统dir2是目录,强制进入该目录。少一个斜杠,可能让整个项目目录变成/home/user/dir2下的一个孤零零文件夹,而不是你想要的/home/user/dir2/project。这种“语法即语义”的设计,是Unix哲学“一切皆文件”的延伸,但也要求用户必须对路径结构有肌肉记忆。我教新手时,第一课永远是ls -ld dir2确认目标是否存在且是目录,再动手mv——这步检查,比任何--dry-run都管用。
2.2 为什么不用其他“更酷”的命令替代?
有人会问:tmux不比screen更现代?ncdu不比du更可视化?rsync不比mv更安全?答案是:生活技巧的核心是“最小必要复杂度”。
tmux确实功能强大,支持窗格分割、鼠标模式、状态栏定制,但它的配置文件.tmux.conf动辄上百行,新手配错一个键绑定就卡住。而screen的默认配置开箱即用,Ctrl+A, d分离、screen -r重连,两个快捷键解决90%需求。我在银行核心系统维护中,要求所有值班工程师只用screen——因为故障处理时,没人有时间翻文档调tmux。ncdu的交互界面确实炫酷,但它的本质仍是调用du的C语言封装。当你需要把结果传给awk做二次分析(比如du -sh /var/* | awk '$1 > "1G" {print}'),或者在无图形界面的嵌入式设备上运行时,原生命令du的管道能力无可替代。ncdu是锦上添花,du是雪中送炭。rsync -av --remove-source-files确实能模拟mv且带校验,但它启动慢、依赖网络栈、在本地文件系统上纯属杀鸡用牛刀。mv在同一个文件系统内是原子操作(仅修改inode链接),毫秒级完成;跨文件系统才退化为cp+rm。把mv用对,比用rsync绕路更符合“生活”场景的效率诉求。
这四个命令的选择,不是技术先进性的投票,而是对真实使用频次、出错概率、学习成本三者权衡后的最优解。它们像厨房里的菜刀、砧板、锅铲——不炫技,但天天用,用得顺手,用得安心。
2.3 国产Linux生态下的特殊适配考量
当前“linux国产”成为热词,但很多人忽略了国产发行版(如统信UOS、麒麟Kylin)对这些基础命令的微妙调整。这不是Bug,而是适配国产硬件和安全规范的主动演进:
screen的权限收紧:部分政务版系统默认禁用/dev/pts的写权限,导致普通用户无法启动screen。解决方案不是sudo screen(违背最小权限原则),而是由管理员执行sudo chmod 666 /dev/pts/*或在/etc/security/limits.conf中添加* soft pts 1024。这背后是SELinux或国密算法模块对伪终端的管控逻辑。df的挂载点过滤:国产系统常预装大量安全审计模块(如auditd),其日志目录/var/log/audit可能被挂载为独立分区。df -h默认会列出所有挂载点,但运维人员真正关心的往往是/、/home、/opt这几个主分区。因此我习惯加-x tmpfs -x devtmpfs -x debugfs排除虚拟文件系统,再用grep -E '(/$|/home$|/opt$)'精准筛选——这步过滤,在国产环境中比在Ubuntu上更重要。du的编码陷阱:国产办公软件(如WPS for Linux)生成的文档常含GBK编码的元数据。当du扫描含中文路径的目录时,若终端locale非zh_CN.UTF-8,可能报错Illegal byte sequence。解决方案不是强行改locale(影响其他应用),而是用LC_ALL=C du -sh *绕过编码检查——LC_ALL=C强制使用ASCII字符集,du虽无法正确显示中文名,但计算大小绝对准确。mv的国产驱动兼容性:某些国产显卡驱动(如景嘉微JM系列)的固件更新包,解压后目录结构含大量空格和括号(如Driver_V2.3.0_(2023_Q3)_for_UOS)。此时mv必须配合引号:mv "Driver_V2.3.0_(2023_Q3)_for_UOS" driver/。我见过工程师因漏掉引号,导致mv把括号解析为shell通配符,批量重命名出一堆奇怪文件——国产环境里,引号不是可选项,是保命符。
这些细节,不会出现在通用Linux教程里,却是国产化落地时每天要面对的真实水位线。把它们揉进“生活小技巧”,才是真正接地气的实践。
3. 核心细节解析与实操要点
3.1 screen:不只是会话管理,是进程生命周期的“保险丝”
screen的常用操作看似简单,但每个快捷键背后都有明确的设计意图,理解这些意图才能避免误操作:
启动与分离(Detach):
screen -S session_name创建命名会话。这里-S参数不是可选的——没有名字的会话(如screen直接启动)在screen -ls列表中显示为12345.pts-0.hostname,难以识别。我给自己所有会话命名遵循项目_角色_日期规则,如nginx_deploy_prod_20240520,screen -ls一眼定位。分离快捷键Ctrl+A, d中的d代表detach,它发送SIGSTOP信号暂停会话,而非杀死。这点至关重要:detach后进程仍在内存运行,只是脱离了当前终端控制;而Ctrl+A, k(kill)会彻底销毁会话及其中所有进程。重连(Resume)与多窗口切换:
screen -r session_name重连指定会话。若会话已被其他终端连接(如同事也在看日志),需用screen -d -r session_name先踢出对方再接管。窗口切换用Ctrl+A, n(next)和Ctrl+A, p(previous),但更高效的是Ctrl+A, "(双引号)列出所有窗口,用方向键选择——这比盲按n/p更可靠,尤其当会话内开了10个窗口时。我习惯在每个窗口顶部用Ctrl+A, A重命名,如0:top、1:logs、2:vim,避免混淆。会话共享与协作:
screen支持多用户同时接入同一会话,这是远程协作的利器。步骤是:1) 创建会话时加-s参数指定socket路径(如screen -S shared -s /var/run/screen/shared);2) 设置socket权限chmod 755 /var/run/screen/shared;3) 其他用户用screen -x /var/run/screen/shared接入。注意:-x参数表示“attach to existing session”,与-r的“resume detached session”不同。曾有个团队用此功能实时调试数据库迁移,DBA在窗口0执行mysqldump,开发在窗口1监控iotop,运维在窗口2查看netstat——三人同屏,问题定位速度提升3倍。
提示:
screen的配置文件~/.screenrc是提升效率的关键。我必配的三行是:defhstatus "always"—— 始终显示底部状态栏,显示当前窗口、负载、时间;hardstatus string "%h %?%F%{=b kR}[%n]%{-}%? %t%?"—— 自定义状态栏,显示窗口编号和标题;bind c screen 1—— 将Ctrl+A, c绑定为新建窗口并跳转到窗口1(默认是0),避免在窗口0里开新窗口覆盖当前工作。
3.2 df与du:磁盘空间侦查的“望闻问切”四诊法
df和du的组合使用,是一套完整的空间诊断流程,我称之为“四诊法”:
望(df宏观扫描):
df -hT是第一步。-h以人类可读格式(GB/MB)显示,-T显示文件系统类型(ext4/xfs/btrfs)。重点看Use%列,超过85%需预警。但注意:df的Use%计算基于Used/(Used+Avail),而Avail是保留给root用户的5%空间(可通过tune2fs -m 1 /dev/sda1调整)。所以Use%显示95%,实际可用空间可能还有5GB——这5GB是留给紧急修复的“安全气囊”,不能指望它。闻(du初步定位):
du -sh /* 2>/dev/null | sort -hr是第二步。2>/dev/null屏蔽权限拒绝错误(如/root目录),sort -hr按人类可读格式逆序排序。这行命令能快速定位/var、/home、/usr哪个是大户。但du默认不统计隐藏文件(.开头),若怀疑.cache作祟,需加-a参数:du -sh .[a-zA-Z0-9]* 2>/dev/null | sort -hr。问(深入子目录):找到大户后,用
du -sh /var/* 2>/dev/null | sort -hr | head -10钻进子目录。这里head -10限制输出,避免刷屏。若发现/var/log异常大,再执行du -sh /var/log/* 2>/dev/null | sort -hr | head -5,通常journal、apt、nginx日志是元凶。此时不是立刻rm,而是先ls -lt /var/log/journal/看最新日志时间——若全是2022年的,说明日志轮转失效,该修systemd-journald配置;若全是昨天的,可能是某个服务疯狂打日志,该查journalctl -u service_name -n 100。切(精确手术刀):最终定位到具体文件,用
find配合du做精准清理。例如清理大于100MB的旧日志:
find /var/log -name "*.log" -size +100M -mtime +30 -exec ls -lh {} \;
先预览(-exec ls -lh),确认无误后再执行:find /var/log -name "*.log" -size +100M -mtime +30 -delete
注意:-delete必须放在最后,且find的-mtime +30表示“30天前修改”,不是“30天以上”,这是常见误区。
实操心得:
du的-x参数(one file system)常被忽略。当/home是独立分区时,du -sh /会递归进入/home,但du -shx /则只统计根分区,自动跳过/home挂载点。这在多分区系统中,能避免重复计算,让du结果与df真正可比。
3.3 mv:路径语法的“毫米级精度”控制
mv的安全使用,核心在于对路径末尾斜杠的绝对敬畏。我总结了一套“三查一试”法则:
一查:目标是否存在
ls -ld target_dir。若返回No such file or directory,说明目标不存在,mv source target会将source重命名为target;若返回drwxr-xr-x,说明是目录,mv source target会把source移入target。这是mv最基础的分支逻辑。二查:目标是否为目录
即使ls -ld target_dir显示存在,也要确认它是目录而非文件:[ -d target_dir ] && echo "is dir" || echo "not dir"。Shell中[ -d ]测试比肉眼判断更可靠,尤其当目录名含空格或特殊字符时。三查:源路径的尾部斜杠
mv /path/to/source/ /path/to/target/vsmv /path/to/source /path/to/target/。前者source/末尾有斜杠,mv会把source目录下的所有内容(不包括source本身)复制到target;后者source无斜杠,mv把整个source目录(包括其名)移入target。这个区别在批量操作时致命。例如mv ~/Downloads/* ~/Documents/(无斜杠)会把所有下载文件移入Documents;而mv ~/Downloads/*/ ~/Documents/(有斜杠)只会移动Downloads下的子目录,忽略文件。一试:用echo模拟执行
在不确定时,把mv换成echo mv:echo mv "$source" "$target"。Shell会打印出实际执行的命令,你能清晰看到路径拼接结果。等确认无误,再删掉echo执行真操作。这招在写for循环批量移动时尤其救命,比如:
for f in *.log; do echo mv "$f" /archive/; done
预览无误后,再运行:for f in *.log; do mv "$f" /archive/; done
注意事项:
mv跨文件系统(如从SSD移到HDD)时,本质是cp+rm,耗时长且不可中断。此时应优先考虑rsync:rsync -av --remove-source-files /source/ /dest/。rsync的优势在于:1) 支持断点续传;2)--remove-source-files确保源文件移除,但只删除已成功同步的文件;3)-v详细输出,知道卡在哪。不过rsync不是mv的替代品,而是特定场景的增强方案。
4. 实操过程与核心环节实现
4.1 从零构建一个可靠的日志归档自动化流程
以“每日自动归档Nginx访问日志并清理30天前旧日志”为例,展示screen、df、du、mv如何协同作战:
步骤1:创建专用screen会话用于长期运行
# 创建命名会话,避免与其他任务混淆 screen -S nginx_log_archiver # 在会话内,创建归档脚本 cat > /opt/scripts/archive_nginx_logs.sh << 'EOF' #!/bin/bash # 日志归档脚本:每日02:00执行 LOG_DIR="/var/log/nginx" ARCHIVE_DIR="/backup/nginx_logs" DATE=$(date +%Y%m%d) # 检查磁盘空间:若/backup分区使用率超90%,退出不归档 if [ $(df -h "$ARCHIVE_DIR" | awk 'NR==2 {print $5}' | sed 's/%//') -gt 90 ]; then echo "$(date): ERROR - $ARCHIVE_DIR space critical, aborting archive" >> /var/log/nginx/archive.log exit 1 fi # 创建当日归档目录 mkdir -p "$ARCHIVE_DIR/$DATE" # 移动当日access.log和error.log(注意mv的路径精度!) mv "$LOG_DIR/access.log" "$ARCHIVE_DIR/$DATE/access.log.$DATE" mv "$LOG_DIR/error.log" "$ARCHIVE_DIR/$DATE/error.log.$DATE" # 重新打开Nginx日志文件(通知Nginx重新加载日志句柄) kill -USR1 $(cat /var/run/nginx.pid) # 清理30天前的归档(du辅助验证) find "$ARCHIVE_DIR" -name "access.log.*" -mtime +30 -print0 | xargs -0 -I {} sh -c ' echo "Deleting: {}" du -sh "{}" >> /var/log/nginx/archive.log rm -f "{}" ' # 记录归档完成 echo "$(date): Archive completed for $DATE" >> /var/log/nginx/archive.log EOF chmod +x /opt/scripts/archive_nginx_logs.sh步骤2:用cron调度,但用screen守护关键环节
# 编辑crontab crontab -e # 添加行: 0 2 * * * /opt/scripts/archive_nginx_logs.sh 2>&1 >> /var/log/nginx/archive_cron.log # 但注意:cron执行环境无tty,screen无法直接attach。因此,我们用screen启动一个常驻监控进程 # 在screen会话中运行: while true; do # 每5分钟检查一次归档目录大小,若突增10GB,发邮件告警 CURRENT_SIZE=$(du -sb "$ARCHIVE_DIR" | awk '{print $1}') if [ "$CURRENT_SIZE" -gt 10000000000 ]; then echo "ALERT: $ARCHIVE_DIR size > 10GB at $(date)" | mail -s "Nginx Archive Alert" admin@company.com fi sleep 300 done步骤3:空间监控与应急响应
当df报警时,快速响应流程:
df -hT定位满载分区(假设是/var);du -shx /var/* 2>/dev/null | sort -hr | head -5发现/var/log/journal占90%;journalctl --disk-usage确认日志占用15GB;journalctl --vacuum-size=500M将日志压缩至500MB;systemctl edit systemd-journald持久化配置:
[Service] RuntimeMaxUse=500M SystemMaxUse=500Msystemctl restart systemd-journald生效。
整个流程中,screen保证监控进程不死,df提供宏观预警,du精准定位,mv在归档时确保路径万无一失——四个命令各司其职,缺一不可。
4.2 WSL环境下特有的空间释放实战
WSL用户常遇到wsl --shutdown后磁盘空间不释放的问题,根源在于WSL2的VHD虚拟硬盘动态增长但不自动收缩。df显示/分区满,du -sh /却只算出一半空间,这就是典型症状:
诊断步骤:
df -h确认/使用率(如98%);du -shx / 2>/dev/null | sort -hr | head -10发现/home和/var合计只占40GB;ls -lh /mnt/wslg/distro/(WSL2默认VHD挂载点)显示ext4.vhdx文件大小为100GB,但du只算出50GB——证明VHD膨胀了。
安全收缩方案(无需重装WSL):
# 步骤1:在WSL内清空所有可清理空间 sudo apt autoremove && sudo apt clean sudo journalctl --vacuum-size=100M sudo rm -rf /var/log/*.gz /var/log/*.old # 步骤2:填充空闲空间并删除(触发TRIM) sudo dd if=/dev/zero of=/var/tmp/bigfile bs=1M count=2000 && sync sudo rm -f /var/tmp/bigfile # 步骤3:在Windows PowerShell中收缩VHD wsl --shutdown diskpart # 在diskpart中执行: # select vdisk file="C:\Users\user\AppData\Local\Packages\...\ext4.vhdx" # attach vdisk readonly # compact vdisk # detach vdisk此方案中,du用于验证清理效果,df确认收缩结果,mv虽未直接出现,但dd生成的大文件本质是mv的“反向操作”——用零填充制造可收缩空间。整个过程体现的是对存储层抽象的理解,而非命令本身。
4.3 国产Linux桌面环境下的OLED屏幕亮度调节
ubuntu oled screen brightness adjust是热门搜索,但在统信UOS等国产系统上,OLED亮度调节常失效,因为驱动路径不同:
通用方案(适用于多数OLED笔记本):
# 查找亮度控制接口 ls /sys/class/backlight/ # 通常为intel_backlight或amdgpu_bl0 # 查看当前最大亮度 cat /sys/class/backlight/intel_backlight/max_brightness # 输出:448 # 设置亮度(需root权限) echo 100 | sudo tee /sys/class/backlight/intel_backlight/brightness国产系统特有问题与mv的妙用:
某些国产OLED屏的亮度文件在/sys/devices/platform/*/backlight/*/brightness,路径深且含特殊字符。此时mv可简化路径:
# 创建软链接,避免每次输长路径 sudo mkdir -p /opt/oled sudo mv /sys/devices/platform/ee100400.edid/backlight/acpi_video0/brightness /opt/oled/brightness # 但注意:/sys下文件是虚拟的,mv会失败。正确做法是创建符号链接: sudo ln -sf /sys/devices/platform/ee100400.edid/backlight/acpi_video0/brightness /opt/oled/brightness # 然后用echo控制: echo 150 | sudo tee /opt/oled/brightness这里ln -sf(force overwrite)替代了mv,但思路同源:用简洁路径封装复杂路径。mv在此场景的“间接价值”,是教会用户理解路径抽象的意义。
5. 常见问题与排查技巧实录
5.1 screen会话“消失”之谜:不是丢了,是detached了
现象:screen -ls看不到自己的会话,以为崩溃了,重启后发现进程还在。
真相:会话处于Dead或Attached状态,但screen -ls默认不显示。
排查命令:
screen -ls # 显示所有会话 screen -D -r session_name # 强制分离并重连(解决Attached状态) screen -wipe # 清理dead会话(删除僵尸会话记录)深层原因:screen会话状态由/var/run/screen/下的socket文件维护。若socket文件损坏或权限错误,screen -ls无法读取。此时ls -la /var/run/screen/可见S-*.pty文件,sudo chmod 755 /var/run/screen/可修复。
5.2 df与du结果差异超10GB:别急着删文件,先查inode
现象:df -h显示/使用率99%,du -shx /只算出80GB,差额巨大。
真相:不是大文件占空间,而是海量小文件耗尽inode。ext4文件系统inode数量固定,即使磁盘有空闲,inode用完也无法创建新文件。
排查命令:
df -i # 查看inode使用率,若Use%接近100%,即为inode耗尽 find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -nr | head -10 # 找出产生最多文件的顶级目录解决方案:
- 清理
/tmp下临时文件(find /tmp -type f -mtime +7 -delete); - 清理
/var/lib/docker/overlay2(Docker容器层,docker system prune -a); - 若是
/var/spool/postfix邮件队列堆积,用postqueue -p查看,postsuper -d ALL清空。
实操心得:
df -i应和df -h一起执行,形成空间健康双指标。我写了一个alias:alias dfh='df -h && df -i',每天晨检必跑。
5.3 mv命令“静默失败”:权限不足却不报错
现象:mv /source/file /dest/执行后,/source/file消失,但/dest/里没有file,也没有错误提示。
真相:/dest/目录有写权限,但/source/file的父目录/source/没有执行(x)权限,导致mv无法读取file的inode信息。
验证方法:
ls -ld /source/ # 若无x权限(如drw-r--r--),则无法cd进入,mv也无法读取其内容 chmod +x /source/ # 修复预防措施:在mv前加权限检查:
if [ ! -r "/source/file" ] || [ ! -x "/source" ]; then echo "ERROR: Cannot read /source/file or traverse /source/" exit 1 fi mv /source/file /dest/5.4 du命令卡死:不是硬盘坏了,是遇到挂载点黑洞
现象:du -sh /卡在某个目录(如/proc、/sys)不动。
真相:du试图递归遍历/proc下每个PID目录,而某些进程(如dockerd)的/proc/PID/fd包含数千个文件描述符,du逐一stat导致阻塞。
解决方案:
- 用
-x参数跳过其他文件系统:du -shx /; - 排除特定目录:
du -sh --exclude='/proc' --exclude='/sys' --exclude='/dev' /; - 用
ncdu替代:ncdu -x /,它对/proc等有智能跳过逻辑。
终极技巧:du的-c参数(total)可快速获取总量而不显示明细:du -shc /var/* 2>/dev/null | tail -1,直接得到/var总大小,避开卡点。
5.5 国产Linux下ch9437 df驱动问题:硬件识别与空间映射
ch9437 df是CH347芯片的USB转串口驱动,但某些国产发行版将其识别为/dev/ttyCH347,而df无法直接关联。此时需手动建立设备映射:
步骤:
lsusb | grep CH347确认设备存在;dmesg | tail -20查看内核是否加载驱动,输出应有ch347字样;- 若无,手动加载:
sudo modprobe ch347; ls -l /dev/ttyCH*确认设备节点;df不显示此设备,因为它不是块设备。需用udevadm info --name=/dev/ttyCH347查设备属性,确认其无ID_FS_USAGE=filesystem,故df忽略合理。
关键认知:df只报告挂载的文件系统,ch3437是字符设备,df不显示是正确行为,非故障。混淆此概念是新手常见误区。
6. 经验沉淀:十年踩坑总结的七条铁律
screen的会话名必须有意义,且长度不超过15字符:过长的会话名在screen -ls中会被截断,screen -r long_session_name_2024可能匹配到多个,导致误操作。我用proj_role_yy格式(如web_db_24),既清晰又安全。df报警阈值设为85%,而非90%:留出15%缓冲空间,足够执行journalctl --vacuum-size、apt clean等清理操作。90%时,很多清理命令因空间不足而失败,陷入死循环。du永远加2>/dev/null:权限拒绝错误(Permission denied)会刷屏,掩盖真正的大户。2>/dev/null不是掩盖问题,而是聚焦核心信息。mv操作前,用ls -ld和[ -d ]双重验证目标:Shell脚本中,[ -d "$target" ]比test -d "$target"更可靠,且能正确处理含空格路径。国产Linux上,
sudo不是万能钥匙:某些安全加固系统(如等保三级)禁用sudo,需用su -c