欢迎光临
我们一直在努力

一文搞懂:Linux常用命令与Shell脚本——文件操作、进程管理、网络排查到自动化部署

📌 写在前面

刚入行时,我有个很大的疑惑:为什么不管是面Java、前端、测试还是运维岗位,都会被问到Linux命令?当时觉得“我又不是运维,会用IDE不就行了?”

直到第一次线上排查问题:服务器CPU飙高,我用top一看,某个Java进程占满核;再用jstack导出线程栈,发现死循环。那一刻才明白——无论你写什么代码,最终都运行在Linux服务器上(大部分情况)。不懂Linux,就像司机不会看仪表盘,出了问题只能干瞪眼。

后来写自动化部署脚本,用scp上传jar包,用ssh远程执行命令,用crontab定时备份……一套脚本下来,发布从半小时缩短到1分钟。再后来接触Docker、K8s,发现底层依然是Linux的cgroup和namespace。

可以说,Linux命令是程序员在服务器世界的“手脚”,Shell脚本是自动化“大脑”。这篇笔记,我把日常开发和运维中最常用的命令和脚本技巧整理出来,涵盖文件操作、进程管理、网络排查,以及一个真实项目的自动化部署脚本。掌握这些,你至少能自信地登录任何一台Linux服务器。

1️⃣ 为什么所有技术岗都要懂Linux?

一句话:Linux是互联网基础设施的操作系统,不懂它就像厨师不懂火候。

2️⃣ Linux常用命令速查

2.1 文件操作(最常用)

实用技巧:

  • grep –color=auto 高亮匹配词。

  • find . -name "*.java" | xargs grep "TODO" 批量搜索。

2.2 进程管理

实用组合:查找并杀死进程

ps aux | grep "java" | grep -v grep | awk '{print $2}' | xargs kill -9

2.3 网络排查

快速检查Web服务:

curl -I http://example.com # 只看响应头
curl -o /dev/null -s -w "%{http_code}\\n" http://example.com # 只返回状态码

3️⃣ Shell脚本基础

Shell脚本是把多条命令写入一个文件,批量执行,并加入逻辑控制。默认解释器是/bin/bash。

3.1 Hello World & 执行权限

bash

#!/bin/bash
# 这是注释
echo "Hello, Linux!"

赋予执行权限并运行:

bash

chmod +x script.sh
./script.sh

3.2 变量

bash

name="John" # 等号两边不能有空格
echo $name # 输出 John
readonly AGE=30 # 只读变量
unset name # 删除变量

3.3 条件判断

bash

if [ -f "config.txt" ]; then
echo "文件存在"
elif [ -d "backup" ]; then
echo "目录存在"
else
echo "都不存在"
fi

常见判断:-f(文件)、-d(目录)、-z(字符串为空)、-eq(数值相等)、!=(字符串不等)。

3.4 循环

bash

# for循环
for i in {1..5}; do
echo "Number $i"
done

# while循环
count=1
while [ $count -le 5 ]; do
echo $count
((count++))
done

3.5 函数

bash

function say_hello() {
echo "Hello, $1" # $1 是第一个参数
}
say_hello "World"

3.6 特殊变量

4️⃣ 实战:编写Spring Boot应用自动化部署脚本

假设场景:每次发布新版本,需要在服务器上执行:停止旧应用、备份旧jar、拉取新jar(或从构建机复制)、启动新应用、检查健康状态。

脚本实现 deploy.sh

#!/bin/bash
# 自动化部署Spring Boot应用脚本

set -e # 任何命令失败立即退出

# 配置项
APP_NAME="myapp"
APP_JAR="/opt/apps/${APP_NAME}.jar"
BACKUP_DIR="/opt/backups"
LOG_DIR="/var/log/${APP_NAME}"
HEALTH_URL="http://localhost:8080/actuator/health"
MAX_RETRY=30

# 颜色输出
RED='\\033[0;31m'
GREEN='\\033[0;32m'
NC='\\033[0m' # No Color

log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}

# 1. 停止旧应用
stop_app() {
log_info "停止旧应用…"
PID=$(pgrep -f "java.*${APP_NAME}.jar" || true)
if [ -n "$PID" ]; then
kill $PID
# 等待最多30秒
for i in {1..30}; do
if ! kill -0 $PID 2>/dev/null; then
break
fi
sleep 1
done
if kill -0 $PID 2>/dev/null; then
log_error "应用未响应,强制杀死"
kill -9 $PID
fi
else
log_info "应用未运行"
fi
}

# 2. 备份旧jar
backup_jar() {
if [ -f "$APP_JAR" ]; then
mkdir -p "$BACKUP_DIR"
BACKUP_FILE="${BACKUP_DIR}/${APP_NAME}_$(date +%Y%m%d%H%M%S).jar"
cp "$APP_JAR" "$BACKUP_FILE"
log_info "备份到 $BACKUP_FILE"
# 保留最近5个备份
ls -t ${BACKUP_DIR}/${APP_NAME}_*.jar 2>/dev/null | tail -n +6 | xargs -r rm
fi
}

# 3. 复制新jar(假设从当前目录的target下获取)
copy_new_jar() {
local new_jar="target/${APP_NAME}.jar"
if [ ! -f "$new_jar" ]; then
log_error "找不到新jar包: $new_jar"
exit 1
fi
cp "$new_jar" "$APP_JAR"
log_info "新jar包部署到 $APP_JAR"
}

# 4. 启动应用
start_app() {
log_info "启动应用…"
mkdir -p "$LOG_DIR"
nohup java -jar "$APP_JAR" > "${LOG_DIR}/console.log" 2>&1 &
echo $! > /tmp/${APP_NAME}.pid
}

# 5. 健康检查
health_check() {
log_info "等待应用启动…"
for i in $(seq 1 $MAX_RETRY); do
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_URL)
if [ "$HTTP_CODE" = "200" ]; then
log_info "应用启动成功"
return 0
fi
sleep 2
done
log_error "应用启动超时"
return 1
}

# 主流程
main() {
stop_app
backup_jar
copy_new_jar
start_app
if health_check; then
log_info "部署完成!"
else
log_error "部署失败,请检查日志"
exit 1
fi
}

main

执行流程示意

使用方法

# 在本地mvn package后,将脚本和target/*.jar上传到服务器同目录
scp deploy.sh user@server:/opt/deploy/
scp target/myapp.jar user@server:/opt/deploy/target/
ssh user@server
cd /opt/deploy
chmod +x deploy.sh
./deploy.sh

可以进一步配合Jenkins或GitLab CI,实现一键部署。

5️⃣ 进阶技巧

5.1 管道 | 和重定向 > >>

  • 管道:前一个命令输出作为后一个命令输入。

    bash

    ps aux | grep java | wc -l # 统计Java进程数

  • 重定向:> 覆盖写入,>> 追加写入。

    bash

    echo "log message" >> app.log

5.2 后台运行 & 和 nohup

  • command &:后台运行,但终端关闭进程会退出。

  • nohup command &:忽略挂断信号,退出终端也继续运行。

5.3 定时任务 crontab

bash

crontab -e # 编辑当前用户的定时任务

示例:每天凌晨2点备份数据库

text

0 2 * * * /opt/scripts/backup_mysql.sh >> /var/log/backup.log 2>&1

5.4 文本处理三板斧:grep + awk + sed

  • grep 过滤行

  • awk 切分列

  • sed 替换、删除行

bash

# 查看tomcat日志中最近10分钟的ERROR行
grep "$(date –date='-10 min' '+%Y-%m-%d %H:%M')" catalina.out | grep ERROR

# 从nginx访问日志统计每个IP的请求数
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

6️⃣ 总结与学习建议

学习路线:

  • 掌握常用命令(文件、进程、网络)20个左右,能做到日常操作。

  • 学会用man或–help查询陌生命令。

  • 尝试写简单的Shell脚本,比如自动备份、监控磁盘空间。

  • 学习awk和sed的基本用法,处理文本事半功倍。

  • 理解$?、&&、||实现条件执行。

  • 推荐资源:

    • 《鸟哥的Linux私房菜》

    • Linux命令大全

    • Bash脚本教程(阮一峰)

    最后提醒:线上服务器执行rm -rf前,先ls确认;养成备份习惯;不轻易用chmod 777。

    当你第一次登录生产服务器,发现CPU飙升到100%,但top看到是Java进程占用的,你又不会用jstack分析线程,你会用什么Linux命令组合快速定位是哪个线程在疯狂消耗CPU?请给出命令步骤。(欢迎在评论区分享你的排查技巧)

    赞(0)
    未经允许不得转载:171主机测评 » 一文搞懂:Linux常用命令与Shell脚本——文件操作、进程管理、网络排查到自动化部署
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址