简介这份PDF面向Linux运维工程师与Shell初学者聚焦日常运维中的自动化脚本实践帮助读者用脚本替代重复手工操作提升排障与巡检效率。资源共1个PDF文件压缩包约100KB内容以Shell脚本代码与命令示例为主涵盖日志过滤与错误统计、服务健康检查、旧文件清理、备份压缩、多文件循环操作、远程文件传输、用户home目录核查、日志实时监控、批量建用户、进程检查与kill、系统初始化配置等典型场景每段脚本均配有可直接参考的命令写法与判断逻辑。文档还包含脚本头部注释规范、变量与循环用法、ping连通性判断、find按时间清理文件等实用技巧适合作为案头速查手册或练习素材。目前已有1165人学习下载可帮助读者快速积累可复用的运维脚本片段理解常见任务的自动化实现思路。1. 从一份 shell 笔记说起它到底能帮你省下多少重复劳动如果你做过一段时间 Linux 运维大概率经历过这种场景凌晨两点被告警叫醒登机器一看是磁盘满了手动翻日志、删旧文件、重启服务一套操作下来四十分钟没了。第二天你想着「下次写个脚本吧」结果一忙又忘了。这份《Linux运维必备工作常用shell脚本.pdf》就是冲着这类重复劳动来的——它不是一本从变量、循环讲起的教材而是一份把日常运维里高频出现的操作直接落成可执行片段的速查笔记。整份文档覆盖的范围很实在日志过滤与统计、服务健康检查、旧文件清理、备份压缩、多主机批量 ping、远程文件传输、用户 home 目录校验、日志实时监控、批量建用户、进程查找并 kill、系统初始化配置、告警邮件、资源利用率查看。适合已经能登服务器、会敲基本命令但懒得每次手写的人也适合刚转运维、想看看「老手平时怎么写」的新手。下面我不按文档顺序复述而是按「拿来就能用」的路径拆开讲。2. 日志过滤与实时监控grep、tail 和那个容易被忽略的退出码2.1 为什么日志处理是运维脚本的第一入口几乎所有线上问题的第一现场都在日志里。文档里给的第一个例子就是grep -i ERROR error.log看着简单但背后有两个值得说清楚的参数。-i表示忽略大小写因为很多应用打日志时Error、error、ERROR混着来不加这个参数你会漏掉一半。第二个是统计条数grep -i ERROR error.log | wc -l管道把匹配行交给wc -l计数适合做「错误量突增」的粗判断。但真正让脚本能「自动决策」的是退出码$?。grep 匹配到内容返回 0没匹配到返回 1。这意味着你可以直接用它做条件分支而不需要去解析输出文本。常见做法是把它包进 if# 统计最近一小时错误数超过阈值就打印告警标记 count$(grep -i error /var/log/app.log | wc -l) if [ $count -gt 100 ]; then echo ALERT: error count $count else echo OK: error count $count fi这里$(...)是命令替换把 grep 加 wc 的结果赋给变量 count-gt是数值比较greater than注意数值比较不能用那是重定向符号。阈值 100 只是示例实际要按你业务的日志量调我一般会先跑一周统计出基线再定。2.2 tail -fn0 做实时监控的正确姿势文档里监控日志用的是tail -fn0 /var/log/message | while read line。拆开看-f是 follow持续输出新追加的内容-n0表示从文件末尾第 0 行开始也就是只看新来的不打印历史。两者合起来就是「盯着文件有新行就吐出来」。管道后面的while read line逐行读取再配合egrep -i error|faild|shut|down做关键字过滤命中就追加写进/tmp/error.log。# 实时盯日志命中关键字就落盘方便事后回溯 tail -fn0 /var/log/message | while read line do echo $line | egrep -i error|faild|shut|down if [ $? -eq 0 ]; then echo $line /tmp/error.log fi done逻辑说明egrep等价于grep -E支持扩展正则|在这里是「或」。$?取的是上一条 egrep 的退出码命中为 0 就写文件。参数上要注意是追加别写成否则每次都会把之前的记录覆盖掉这个坑我踩过不止一次。另外faild是文档里的拼写实际很多程序打的是failed建议两个都加上写成error|fail|shut|down更稳。提示tail -f在日志轮转logrotate后可能跟丢文件生产环境更推荐tail -F它会按文件名重新打开。3. 服务健康检查与批量主机操作ping、for 循环和黑洞重定向3.1 ping 检查里 /dev/null到底干了什么文档里反复出现ping -c1 192.168.1.2 /dev/null。-c1是只发一个包快速返回适合脚本里做探活。 /dev/null把标准输出和标准错误一起丢进「黑洞」这样屏幕上不会刷一堆 ping 的统计信息脚本输出干净。然后立刻用$?判断结果# 单机探活静默模式 ping -c1 192.168.1.2 /dev/null if [ $? -eq 0 ]; then echo ok else echo not ok fi参数说明-c1的 1 是次数别省否则 ping 会一直跑下去把脚本卡死。是 file 21的简写把两个流合并后重定向。判断依据是 ping 的退出码通为 0不通为非 0。这里有个边界有些机器禁 ICMPping 不通不代表服务挂了所以探活只能作为第一层关键服务还得配合端口探测比如nc -z host port。3.2 用 for 循环把单机操作扩展成批量单机检查只能算手工批量才是脚本的价值。文档给了两种写法一种是把 IP 写进变量一种是从文件读# 从文件读取 IP 列表逐个探活 hosts_file/home/soyoger/ip_list for ip in $(cat $hosts_file) do ping -c1 $ip /dev/null if [ $? -eq 0 ]; then echo $ip is passed. else echo $ip is faild. fi done逻辑说明$(cat $hosts_file)把文件内容按空白拆成一个个词for 依次取出赋给 ip。注意文档里写的是cat hosts_file少了$那会被当成字面文件名实际跑会报错这是原文的一个笔误用的时候记得加$。参数上ip_list 一行一个 IP 最清晰别用逗号分隔否则 for 拆不开。如果主机多串行 ping 会慢可以加放后台并行但要配合wait收尾否则脚本提前退出。注意批量操作前先用一两个测试 IP 验证循环逻辑别直接对着生产清单跑尤其是后面带删除、kill 的脚本。4. 文件清理、备份与用户管理find 的 -exec 和 useradd 的边界4.1 find -mtime 清理旧文件先 ls 再 rm文档里清理旧文件的思路很标准find /home/soyoger/logs -type f -mtime 90 -exec rm {} \;。拆解参数-type f只找普通文件排除目录-mtime 90表示修改时间在 90 天以前是「大于」-exec ... \;对每个命中文件执行后面的命令{}是文件占位符\;是结束符反斜杠不能丢。# 第一步先列出来确认别急着删 find /home/soyoger/logs -type f -mtime 90 -exec ls -lh {} \; # 第二步确认无误再删 find /home/soyoger/logs -type f -mtime 90 -exec rm -f {} \; # 变体重命名保留比直接删安全 find /home/soyoger/logs -type f -mtime 90 -exec mv {} {}.old \;逻辑说明先 ls 后 rm 是我强制自己走的流程-exec ls能让你看到到底哪些文件会被命中避免误删。-mtime按天算如果要按分钟用-mmin。备份压缩文档用的是tar cvf log_bak.rar ./log再gzip这里有个小问题tar 的-f后面跟的是归档名用.rar后缀容易误导实际它是 tar 格式不是 rar建议改成.tar再 gzip 成.tar.gz。4.2 批量建用户grep -c 校验加随机密码用户管理部分文档的核心是「先查再建」。用grep -c /home/${name} /etc/passwd统计匹配行数-c返回计数大于等于 1 说明用户已存在。不存在才 useradd并且用echo $RANDOM | md5sum | cut -c 1-8生成随机密码。# 批量建用户并记录密码到文件 echo please input the new user name: read name is_exist$(grep -c /home/${name} /etc/passwd) if [ $is_exist -ge 1 ]; then echo ${name} user is already existed. else useradd -s /bin/bash -d /home/${name} -m ${name} if [ $? -eq 0 ]; then pwd$(echo $RANDOM | md5sum | cut -c 1-8) echo ${pwd} | passwd --stdin ${name} echo ${name} ${pwd} user_list.txt fi fi参数说明useradd的-s指定登录 shell-d指定家目录-m表示家目录不存在就创建三个一起用才完整。passwd --stdin从标准输入读密码适合脚本但注意这是 CentOS/RHEL 系的用法Ubuntu 上得用chpasswd。$RANDOM是 0 到 32767 的随机数md5sum 后取前 8 位强度够日常用但别用于高安全场景。密码落盘到 user_list.txt 后记得及时改权限chmod 600否则等于把密码公开。提示userdel -r会连家目录一起删文档里注释掉了是对的生产环境删用户前务必确认家目录里没有要留的数据。5. 避坑与排查那些让脚本「看着对、跑起来错」的细节5.1 变量没加引号导致路径带空格就崩现象脚本里for file_name in *.txt然后mv $file_name ${file_name}.bak遇到文件名带空格就报「参数太多」。原因变量展开时没加引号shell 按空白做了二次分词。解决所有变量引用加双引号写成mv $file_name ${file_name}.bak。这个坑在文件操作脚本里出现频率最高。5.2$?被中间命令覆盖现象明明 ping 通了却走了 else 分支。原因$?只保留最近一条命令的退出码如果你在 ping 和 if 之间插了 echo 或赋值$?就变成那条命令的了。解决要么让判断紧跟命令要么先把退出码存进变量ret$?后面用$ret判断。5.3 find -exec 里{}和\;写错现象find 报missing argument to -exec。原因\;的反斜杠被 shell 吃掉或者{}和\;之间少了空格。解决严格写成-exec rm -f {} \;分号前必须有空格反斜杠不能省。如果嫌麻烦可以用-delete替代-exec rm但-delete只对文件有效目录要配合-type f。5.4 批量脚本对生产清单裸跑现象一次误删或误 kill 影响面很大。原因脚本里循环直接读生产 IP 或进程清单没有 dry-run。解决加一个DRY_RUN1开关为真时只 echo 要执行的动作不真执行确认后再关掉。这个习惯救过我至少两次。5.5 时区和时间同步没做导致日志时间对不上现象多台机器日志时间差几小时排查问题时对不上。原因系统时区没统一。文档里给了ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime和ntpdate ntp1.aliyun.com。解决新机器初始化时就把这两步加进去注意ntpdate现在很多系统推荐用chronyd替代但思路一致。6. 资源利用率一键查看把 vmstat、free 包成函数文档最后一部分是「一键查看服务器资源利用率」用 function 把 CPU、内存、磁盘的采集包起来。这块值得单独讲因为它示范了怎么把零散命令组织成可复用的工具。# CPU 使用率vmstat 第 3 行是采样行$13$14 是用户态系统态 function cpu() { util$(vmstat | awk {if(NR3)print $13$14}) iowait$(vmstat | awk {if(NR3)print $16}) echo CPU-使用率${util}%, 等待磁盘IO${iowait}% } # 内存利用率free -m 以 MB 为单位$NF 是最后一列 available function memory() { total$(free -m | awk NR2{printf %.1f, $2/1024}) used$(free -m | awk NR2{printf %.1f, ($2-$NF)/1024}) avail$(free -m | awk NR2{printf %.1f, $NF/1024}) echo MEMORY-总${total}G, 已用${used}G, 可用${avail}G } cpu memory逻辑说明vmstat输出第一行是表头第二行是自开机以来的平均值第三行才是当前采样值所以 awk 里用NR3锁定。$13是用户态 CPU 时间$14是系统态相加近似总使用率$16是 iowait。free -m的-m是以 MB 显示NR2取内存那一行$2是 total$NF是最后一列 available用$2-$NF算已用比直接取 used 更准因为 used 不含缓存。printf %.1f保留一位小数除以 1024 转成 GB。参数上vmstat不带参数只采一次如果要持续观察可以vmstat 1 5每秒一次共五次。这套函数可以直接放进~/.bashrc登录就能用。我自己的习惯是再包一层把 cpu、memory、磁盘df -h一起输出做成一个sysinfo命令巡检时一条命令看完。从那以后我每次写涉及删除、kill、批量改配置的脚本都强制先跑一遍 dry-run确认输出符合预期再摘掉开关。这份笔记的价值不在于命令多高深而在于它把运维日常里那些「每次都要现查」的片段攒成了一套能直接抄的底子你拿到后按自己环境改改路径和阈值就能用。希望帮到你。本文还有配套的精品资源点击获取