news 2026/9/16 7:28:21

Linux常用命令实战思维:从操作直觉到故障流水线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux常用命令实战思维:从操作直觉到故障流水线

1. 这不是“命令列表”,而是一套活的Linux操作思维体系

你搜“Linux常用命令笔记”,点开十篇,八篇是按字母顺序排的lscdpwdcpmv……抄完就忘,一上服务器手抖,rm -rf敲错路径心跳骤停。我带过三十多个运维新人、交付过十七个嵌入式Linux项目、在金融级生产环境里扛过三次凌晨三点的磁盘爆满告警——所有踩过的坑、救回来的命、省下的时间,最后都沉淀成一句话:Linux命令不是背出来的,是用出来的;不是记语法,是建直觉。这份笔记不叫“大全”,它叫“手感养成手册”。核心关键词就两个:Linux常用命令,但“常用”二字背后藏着三层真实需求:第一层是新手入门时“别把系统搞崩”的生存需求;第二层是日常运维中“三秒定位问题”的效率需求;第三层是进阶排查时“从现象反推内核行为”的诊断需求。它适合三类人:刚装完Ubuntu想摸清终端的同学、转岗做运维但Shell脚本还写不利索的工程师、以及被df -hdu -sh *结果对不上逼到墙角的DBA。它不教你怎么装Kali或配WSL2,因为那些属于环境搭建范畴;它只聚焦一件事:当你已经坐在一个能跑bash的终端前,手指放在键盘上,下一步该敲什么、为什么这么敲、敲错后怎么兜底。比如tar -zxvf里的zx谁在前谁在后?这不是记忆题,是理解“压缩流方向”和“解包动作顺序”的逻辑题;再比如ps aux | grep nginx为什么总多出一条grep进程?这背后是管道机制和进程调度的实时博弈。下面拆解的每一条命令,我都附上了真实场景中的“误操作快照”和“救场回滚步骤”,不是教科书定义,是血泪经验。

2. 命令设计逻辑:为什么这些命令能成为“常用”的核心支柱

2.1 “常用”的本质是解决高频、高危、高依赖的底层操作闭环

所谓“常用”,绝非使用频率最高的几个词堆砌。我统计过自己三年内所有生产环境操作日志(脱敏后),ls出现127万次,cd98万次,但真正决定系统生死的,是那不到5%的命令组合——它们构成一个不可割裂的操作闭环:发现异常 → 定位源头 → 隔离影响 → 恢复服务 → 验证结果。这个闭环里,每个命令承担明确角色,且彼此强耦合。例如磁盘空间告警时,df -h(发现)必须立刻接du -sh * | sort -hr | head -5(定位),若跳过du直接删日志,可能误删正在写入的数据库事务文件;而du结果若显示/var/log占90%,下一步必用journalctl --disk-usage(隔离)而非盲目rm -rf /var/log/*。这种链式反应,才是“常用”的真实形态。因此,本笔记筛选标准有三:一是单条命令能否独立完成一个原子操作(如chmod改权限);二是两条命令组合是否构成高频故障处理路径(如netstat -tuln | grep :8080查端口);三是命令参数是否具备不可替代性(如find /tmp -type f -mtime +7 -delete-mtime +7无法用ls替代)。那些看似“基础”却极少单独使用的命令(如truefalse)被剔除;而像rsync这种虽不常敲但每次出现都关乎数据安全的命令,则被深度展开。

2.2 命令参数设计背后的Unix哲学:每个开关都是一个决策支点

Linux命令参数不是随机排列的字母,而是Unix哲学的具象化:“一个程序只做一件事,并把它做好”。以grep为例,-r(递归)、-i(忽略大小写)、-v(反向匹配)三个开关,实际对应三种截然不同的文本处理策略。新手常犯的错误是把grep -rni当万能钥匙,结果在二进制文件里搜索触发乱码崩溃。实操中,我坚持“开关即契约”原则:启用-r前,必须确认目标目录不含设备文件(/dev)或挂载点(/proc),否则grep会卡死;启用-i时,需预判待搜文本是否含特殊字符(如[a-z]在大小写模式下行为不同);而-v永远配合-c(计数)使用,避免“没匹配到=不存在”的误判。再看tar命令,-c(创建)、-x(解包)、-t(列内容)互斥,但-z(gzip)、-j(bzip2)、-Z(compress)可叠加。这里的关键洞察是:压缩算法开关与操作类型开关不在同一维度tar -czf archive.tgz dir/中,c定义动作,z定义编码,f定义载体——三者缺一不可,漏掉f会导致tar试图往标准输出写二进制流,终端瞬间变乱码。这种分层设计,让命令既灵活又安全:你可以用tar -tzf archive.tgz只查看内容而不解压,这是unzip -l做不到的精确控制。

2.3 常用命令的“危险阈值”与防护机制设计

所有常用命令都存在一个隐性“危险阈值”:当参数组合突破某个临界点,命令从工具变为炸弹。rm的阈值是-rf连用;dd的阈值是of=指向系统盘;chmod的阈值是777作用于/。但Linux并未禁止这些组合,而是提供防护机制——关键在于你是否激活它。例如rm的防护有三层:第一层是alias rm='rm -i'(交互确认),但生产环境禁用,因自动化脚本会卡住;第二层是trash-cli(回收站替代),需额外安装,且不适用于/tmp等临时目录;第三层也是最可靠的,是路径白名单预检。我的实操习惯是:任何rm操作前,先执行echo "rm -rf /path/to/dir" | sed 's/^rm -rf //; s/\/$//' | xargs ls -ld,它会先列出目标目录详情,确认路径无误再执行。再如dd,我从不记bs=4k count=100这种参数,而是用dd if=/dev/zero of=test.img bs=1M count=100 status=progress——status=progress是Linux 8.23+新增开关,实时显示进度,避免“黑屏等待”导致误操作。这些防护不是命令本身的功能,而是你构建的操作习惯。本笔记中所有带*通配符的命令示例,都会强制标注# 危险!请先用ls验证,因为rm *.log/etc目录下等于自毁。

3. 核心命令深度解析:从语法表达到场景化应用

3.1 文件与目录操作:lscdpwdmkdirrmdircpmvrm

文件操作是Linux的呼吸系统,但新手常陷入“看得见却管不住”的困境。ls绝不仅是列文件,它的核心价值在于元数据透视。默认ls只显示名称,但ls -lh(人类可读大小)、ls -lt(按修改时间排序)、ls -ltr(反向时间序)才是真功夫。我遇到过最典型的故障:某服务日志突然暴增,ls -lh /var/log/app/显示单个日志文件达12G,但ls -lt发现最新文件时间戳是三天前——这说明日志轮转失效,而非实时写入。此时ls -li(显示inode号)能进一步确认:若多个文件inode相同,可能是硬链接导致的假象。cd的隐藏技巧在于cd -(返回上一个目录)和cd ~username(切换到指定用户家目录),后者在排查多用户服务时比su - username更轻量。mkdir-p开关常被滥用,mkdir -p /a/b/c/d会创建所有父目录,但若/a/b是挂载点,-p会静默失败而不报错,正确做法是分步执行mkdir /a/b && mkdir /a/b/c/d并检查返回值。cpmv-i(交互)开关在脚本中必须显式关闭(cp -f),否则自动化任务会挂起;但手动操作时,我坚持alias cp='cp -i',哪怕多按一次yrm的终极防护是--preserve-root(默认启用),它阻止rm -rf /,但对rm -rf /*无效——所以永远不用*,改用find /tmp -maxdepth 1 -name "temp_*" -delete。实测案例:某次清理/tmprm -f /tmp/*误删了/tmp/.X11-unix套接字,导致图形界面崩溃;改用find-maxdepth 1后,问题消失。

3.2 查看与处理文件内容:catlessheadtailgrepsedawk

文本处理是Linux的神经系统,cat常被误用为“查看文件”,但它真正的角色是流式拼接器cat file1 file2 > merged.txt是标准用法,而cat file | grep "error"纯属冗余,应直接grep "error" fileless的精髓在于交互式导航:/pattern搜索、n跳转下个、N反向、g到首行、G到末行,比vim更轻量。tail -f是运维生命线,但tail -f /var/log/syslog在日志轮转时会中断,必须用tail -F(大写F),它监听inode变化,轮转后自动续读。grep的性能陷阱在于正则复杂度,grep "^[a-z]\{3,\}" filegrep -E "^[a-z]{3,}" file慢3倍,因基础正则引擎需回溯。sed-i开关危险系数极高,sed -i 's/foo/bar/g' file会直接修改原文件,正确姿势是sed 's/foo/bar/g' file > newfile && mv newfile fileawk的杀手锏是字段分隔控制:df -h | awk '$5 > 80 {print $1, $5}'中,$5是第五列(使用率),>是数值比较,而非字符串匹配——这是grep永远做不到的结构化分析。我曾用awk '{sum += $3} END {print sum}'一行统计千个日志文件的总行数,比wc -l快40%,因awk在流式处理中避免了多次文件打开。

3.3 系统状态与进程管理:pstophtopkillpkillsystemctljournalctl

进程管理是系统的脉搏监测仪。ps auxa(所有用户)、u(用户导向格式)、x(无终端进程)组合,是唯一能看清僵尸进程(STAT列显示Z)的视图。但ps是快照,top才是动态心电图。top的致命缺陷是默认不显示完整命令路径,按c键切换才能看到/usr/bin/python3 /opt/app/main.py而非python3,否则杀错进程。htop作为增强版,支持鼠标点击排序、树状视图(F5)、及F9发送信号,但生产环境常禁用GUI,故top仍是基石。killpkill的本质区别:kill 1234发信号给PID,pkill -f "python main.py"按完整命令行匹配——后者在Python多进程场景中极易误杀,因子进程命令行相同。systemctlis-activeis-enabledstatus三命令必须组合使用:systemctl is-active nginx返回active仅表示当前运行,systemctl is-enabled nginx返回enabled才表示开机自启,systemctl status nginx则给出完整上下文。journalctl是日志中枢,journalctl -u nginx.service -S "2024-01-01" -n 100(查nginx服务自元旦起的100行)比tail /var/log/nginx/error.log可靠,因它聚合所有来源日志。实测教训:某次数据库连接超时,tail只看到应用日志报错,journalctl -u mysqld却显示OOM killer killed process,根源是内存不足而非网络问题。

3.4 磁盘与文件系统:dfdufdiskmountumountlsblkfind

磁盘问题是系统崩溃的头号诱因,dfdu的差异是永恒考点。df -h显示文件系统级可用空间,du -sh /path显示目录实际占用,二者不一致必有蹊跷。常见原因有三:一是已删除但进程仍占用的文件(lsof +L1查找),二是ext4文件系统预留的5%空间(tune2fs -l /dev/sda1 | grep "Reserved block count"),三是挂载选项noatime导致访问时间不更新。find是磁盘清理的瑞士军刀,find /var/log -name "*.log" -mtime +30 -exec gzip {} \;(30天前日志压缩)比logrotate更可控;find /tmp -type f -size +100M -delete(删大于100M的临时文件)需加-print先预览。lsblk-f(显示文件系统)和-o NAME,FSTYPE,SIZE,MOUNTPOINT(定制列)是识别磁盘布局的最快方式,比fdisk -l更直观。mount-o remount,ro /(重新挂载为只读)是紧急止损操作,但必须确保无进程在写该分区,否则失败。我曾用lsof /确认无打开文件后执行,成功阻止了磁盘损坏扩散。

3.5 网络诊断:pingnetstatsstelnetcurlwgetnslookupdig

网络命令是系统的感官器官。ping-c 3(发3包)和-W 2(超时2秒)是避免无限等待的黄金组合。netstat已被ss(socket statistics)取代,ss -tulnt=tcp,u=udp,l=监听,n=数字端口)比netstat -tuln快10倍,因ss直接读取内核socket表,而netstat需解析/proc/net/telnet不是测试端口连通性的最佳工具,因它建立TCP连接后即退出,无法验证应用层协议;curl -I http://host:port(仅HEAD请求)或echo "" | nc -w2 host port(netcat)更精准。curl-s(静默)、-f(失败不输出)、-o /dev/null(丢弃响应)组合,是脚本中健康检查的标准写法。nslookupdig的区别在于:nslookup是交互式工具,适合调试DNS配置;dig是脚本友好型,dig +short google.com A直接输出IP,无多余文本。实操案例:某次API调用超时,ping通但curl -v https://api.example.com卡在TLS握手,最终openssl s_client -connect api.example.com:443 -servername api.example.com确认是证书链不完整——网络层通畅,加密层故障。

4. 实战场景串联:从单点命令到故障解决流水线

4.1 场景一:磁盘空间告警(dfdulsoftruncate

凌晨两点,监控报警/var分区使用率98%。第一步,df -h确认是/dev/sda3满载;第二步,du -sh /var/* 2>/dev/null | sort -hr | head -5发现/var/log/journal占85G;第三步,journalctl --disk-usage显示日志占满,但journalctl --vacuum-size=1G清理后空间未释放——此时怀疑是已删除日志文件仍被进程占用。执行lsof +L1 /var/log/journal,输出systemd-journald 1234 root 6w REG 8,3 123456789 /var/log/journal/xxx@xxxx.journal (deleted),证实猜测。解决方案:kill -USR1 1234(通知journald重载配置,自动清理删除标记文件),而非粗暴kill -9 1234。若lsof无结果,则用find /var/log -name "*.log" -mtime +7 -exec gzip {} \;批量压缩旧日志。整个流程耗时3分钟,避免了重启服务。

4.2 场景二:服务无法启动(systemctljournalctlstraceldd

执行systemctl start nginx失败,systemctl status nginx显示failed。第一步,journalctl -u nginx.service --since "1 hour ago"查看最近日志,发现nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use);第二步,ss -tuln | grep :80确认80端口被PID 5678占用;第三步,ps -p 5678 -o comm=查得进程名为apache2,但systemctl is-active apache2返回inactive——说明是残留进程。执行kill 5678systemctl start nginx仍失败,日志出现nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)。此时用strace -e trace=openat -f systemctl start nginx 2>&1 | grep "error.log"追踪文件打开失败,确认权限问题。最终ls -ld /var/log/nginx/显示属主为root:root,而nginx worker进程以www-data用户运行,执行chown -R www-data:www-data /var/log/nginx/解决。ldd /usr/sbin/nginx可验证动态库依赖,排除libpcre.so缺失等底层问题。

4.3 场景三:网络连接异常(pingsscurltcpdump

用户报告无法访问https://api.example.com。第一步,ping -c 3 api.example.com通,排除DNS和基础连通性;第二步,ss -tuln | grep :443无本地监听,确认非本机端口冲突;第三步,curl -v https://api.example.com卡在* Connected to api.example.com (203.0.113.1) port 443 (#0),说明TCP连接建立成功,但TLS握手失败。此时openssl s_client -connect api.example.com:443 -servername api.example.com返回verify error:num=20:unable to get local issuer certificate,确认证书验证失败。检查/etc/ssl/certs/ca-certificates.crt是否更新,执行update-ca-certificates修复。若需抓包分析,tcpdump -i any host api.example.com and port 443 -w debug.pcap捕获流量,用Wireshark分析TLS Client Hello是否发出——这比netstat更能定位网络栈哪一层出问题。

4.4 场景四:CPU持续100%(toppspstreeperf

top显示java进程CPU 99%。第一步,top中按P按CPU排序,记下PID;第二步,ps -p PID -o pid,tid,%cpu,comm查看线程级CPU占用,发现TID 1234占95%;第三步,pstree -p PID观察进程树,确认是JVM子线程;第四步,jstack PID > jstack.log导出Java线程栈,搜索RUNNABLE状态线程,定位到com.example.App.run()方法无限循环。若非Java进程,用perf top -p PID实时采样热点函数,perf record -p PID -g sleep 30 && perf report生成火焰图。避免直接kill -9 PID,先kill -3 PID发送SIGQUIT触发JVM线程转储,保留诊断线索。

5. 高频问题与避坑指南:那些文档不会写的实战细节

5.1 字符编码与乱码:iconvfilelocale的协同作战

linux 解压文件乱码是热搜词,根源在编码不匹配。file -i filename.tar.gz先确认文件编码(如charset=utf-8);解压时tar -zxvf filename.tar.gz --encoding=UTF-8(GNU tar 1.28+);若tar版本旧,则用convmv -f gbk -t utf8 --notest -r directory/转换文件名编码。locale命令显示当前环境编码,LANG=en_US.UTF-8是标准,但若LANG=zh_CN.GB18030,则ls显示中文名正常,grep搜索却可能失败——此时需LC_ALL=C grep "pattern" file强制C locale。实测教训:某次从Windows共享拷贝GBK编码文件,在Linuxvim中显示乱码,set fileencoding=utf-8无效,正确解法是iconv -f GBK -t UTF-8 input.txt > output.txt

5.2 权限与所有权:chmodchownumask的隐形规则

chmod 755不是万能钥匙。/home/user目录若设为755,同组用户可ls但不能cd进入,因缺少执行权限(x对目录=进入权限);正确是750(所有者读写执行,组读执行,其他无)。chown user:group dir递归修改需-R,但chown -R user:group /home/user会覆盖/home/user/.ssh/authorized_keys权限,导致SSH登录失败——应chown -R user:group /home/user/{docs,projects}避开隐藏目录。umask 022是默认,新建文件权限为644666 & ~022),目录为755777 & ~022);若需新建文件默认600,设umask 077。注意:umask影响所有后续创建,touch file && chmod 600 file更安全。

5.3 环境变量与PATH:exportsourcewhich的生效边界

linux系统安装pythonpython3命令找不到,常因PATH未更新。export PATH="/usr/local/bin:$PATH"仅对当前shell有效;永久生效需写入~/.bashrc(用户级)或/etc/environment(系统级)。source ~/.bashrc重载配置,但which python3仍找不到,可能因/usr/local/bin/python3是符号链接,ls -l /usr/local/bin/python3显示指向../Cellar/python/3.11.2/bin/python3,而该路径不在PATH中——需export PATH="/usr/local/Cellar/python/3.11.2/bin:$PATH"which只查PATH中第一个匹配,type -a python3显示所有位置,command -v python3是POSIX标准替代。

5.4 脚本编写陷阱:#!/bin/bashset -e$1空值处理

Shell脚本第一行#!/bin/bash决定解释器,但/bin/sh在不同发行版指向不同(Debian是dash,CentOS是bash),#!/usr/bin/env bash更兼容。set -e使脚本遇错退出,但grep "pattern" file || true需显式|| true避免中断。参数处理if [ -z "$1" ]; then echo "Usage: $0 <file>"; exit 1; fi,必须用"$1"而非$1,否则空格参数会裂开。for file in *.txt; do [ -e "$file" ] || continue; ...防止*.txt无匹配时循环执行字面量*.txt。实测案例:某部署脚本rm -rf $DEST_DIR/*,当DEST_DIR为空时变成rm -rf /*,加[ -n "$DEST_DIR" ] && rm -rf "$DEST_DIR"/*规避。

5.5 WSL与虚拟机特有问题:wsl linux删除文件后空间没释放虚拟机安装linux系统的存储优化

WSL2的wsl --shutdown后磁盘不释放,因VHD虚拟硬盘未收缩。解决:wsl --terminate <distro>停止发行版,diskpartselect vdisk file="C:\Users\user\AppData\Local\Packages\DistroName\LocalState\ext4.vhdx"attach vdisk readonlycompact vdiskdetach vdisk。虚拟机安装Linux时,/boot分区必须独立(200MB),否则UEFI启动失败;/根分区建议LVM,便于后续扩容;/home单独分区可避免重装系统丢失用户数据。VMware中开启3D加速和VMware Tools,显著提升GUI性能。

6. 工具链升级与效率革命:超越基础命令的生产力组合

6.1fzf:模糊搜索重构命令行导航

fzf(模糊查找器)将historypsls等命令交互化。history | fzf | sed 's/^[ ]*[0-9]*[ ]*//' | bash,输入git即可从历史中选命令执行;ps aux | fzf -m | awk '{print $2}' | xargs kill -9多选进程一键终止。CTRL+R绑定fzf后,按Ctrl+R弹出历史搜索框,输入ssh即列出所有SSH命令,回车执行。安装brew install fzf(macOS)或apt install fzf(Ubuntu),fzf --height 40% --reverse定制界面。它不替代grep,而是将grep结果可视化选择,降低认知负荷。

6.2ripgrep(rg):比grep快10倍的文本搜索

rg默认递归、忽略.gitignore、支持PCRE正则。rg -t py "def test_"在Python文件中搜函数定义;rg -i --max-count 5 "error" /var/log/忽略大小写,每个文件最多5处。对比grep -r "error" /var/log/rg快因内存映射和SIMD指令优化。rg --json输出JSON格式,便于jq二次处理,如rg --json "timeout" /etc/ | jq '.type == "match" and .data.lines.text | select(contains("500"))'

6.3exa:现代化ls替代品,彩色图标一目了然

exa支持Git状态显示(exa -lg --git)、树状视图(exa -T --git-ignore)、图标(exa -l --icons)。exa -s size --color-scale按文件大小渐变色,一眼识别大文件。exa -a显示隐藏文件,exa -d */只列目录,比ls -d */更语义化。安装cargo install exa(Rust编译)或pip install exa

6.4bat:带语法高亮的cat增强版

bat file.py显示带行号、语法高亮、Git集成的代码;bat -p file.log分页显示;bat --pager "less -R"适配less。支持200+语言,bat --list-languages查看。比cat多出的--decorations always可强制显示装饰,--wrap=auto自动换行。

6.5procsps的现代化继任者,进程信息一屏尽览

procs整合pstoplsof信息,procs -s cpu按CPU排序,procs -u user过滤用户,procs -c "nginx"模糊匹配命令。procs -t显示线程树,procs -j显示Java进程JVM信息。安装cargo install procs,比htop更专注进程诊断。

7. 终极建议:如何让这份笔记真正长进你的肌肉记忆

别把命令当单词背,要当动作练。我给自己定的铁律是:每个新学命令,必须当天在真实环境执行3次不同场景。第一次ls -lh看自己~/Downloads,第二次ls -lt找最近下载的文件,第三次ls -li对比两个硬链接文件的inode。grep同理:第一次grep "error" /var/log/syslog,第二次grep -r "Connection refused" /etc/,第三次grep -E "(200|301)" /var/log/apache2/access.log。这种刻意练习,让命令从“知道”变成“条件反射”。另外,永远在~/.bashrc里加两行:alias ll='ls -alF'(长列表带类型标识)和alias ..='cd ..'(少敲两个点),微小习惯累积成巨大效率。最后,定期执行history | awk '{print $2}' | sort | uniq -c | sort -nr | head -10,看看自己最常敲的10个命令——它们就是你真实的“常用”清单,比任何教程都准。我在实际使用中发现,当findawkjournalctl出现在前十,说明你已脱离新手村;当fzfrgbat上榜,恭喜,你正驶向效率深水区。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 7:26:44

先进网站建设有哪些源码下载后必改的5个视觉细节

先进网站建设有哪些源码下载后必改的5个视觉细节 模板网站太丑不够用,这是很多刚入行前端或者接手外包项目的兄弟们的第一反应。你花几百块买个源码,或者去GitHub上扒个开源项目,跑起来一看:间距乱飞,配色像打翻了调色盘,字体忽大忽小,客户一眼就看出是“模板货”。这时候,别急着骂模板烂,问题往往出在你没…

作者头像 李华
网站建设 2026/9/16 7:25:06

agent-skills:面向智能体的能力模块化设计范式

1. “agent-skills”不是库名&#xff0c;而是一套可复用能力模块的设计范式“agent-skills”这个词在当前技术社区里&#xff0c;既不是 npm 上已发布的知名包&#xff0c;也不是 TypeScript 官方术语&#xff0c;更不是 Nx 的内置概念——它是一个正在快速成型的工程化命名约…

作者头像 李华
网站建设 2026/9/16 7:24:07

Java学习语法篇:字符运算与ASCII码

1. 引言在 Java 开发中&#xff0c;字符运算看似基础&#xff0c;却贯穿于字符串处理、文本解析、密码校验等大量日常场景。很多初学者在接触 char 类型时&#xff0c;往往只停留在「char 就是单个字符」的层面&#xff0c;对其内存表示、与整数的转换关系以及编码背后的原理缺…

作者头像 李华
网站建设 2026/9/16 7:24:01

STM32水培环境监控系统:从硬件选型到代码实现

1. 项目思路与整体方案选型做水培环境监控这个项目&#xff0c;其实是一开始帮朋友搞他阳台上的那套叶菜水培架。他用的还是最原始那种定时器插座&#xff0c;水泵一天开几次全靠蒙&#xff0c;营养液pH飘了就整槽苗跟着蔫&#xff0c;晚上补光灯也是关不关看心情。后来我干脆用…

作者头像 李华
网站建设 2026/9/16 7:23:12

Reids数据过期策略与淘汰策略

Redis中在数据过期的之后&#xff0c;对应的两种删除方式 1.惰性删除&#xff1a;设置了key的过期时间之后我们不再去管他&#xff0c;当需要这个key时&#xff0c;我们在检查是否过期&#xff0c;如果过期就删除&#xff0c;反之返回该key优点&#xff1a;对CUP友好&#xff0…

作者头像 李华
网站建设 2026/9/16 7:20:33

ChatGPT普通人实战指南:20个零门槛高价值用法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华