*Java 沉淀重走长征路*之——《Linux 从入门到企业实战:一套六步法,带你打通运维与开发的任督二脉》

引言:为什么 Linux 是开发者绕不过去的"坎"?

问题锚定: 想象一下,你是一个刚学会 Java 编程的应届生,在 Windows 上用 Eclipse 写了一个"Hello World"程序,自认为已经掌握了开发技能。但当你进入一家互联网公司,面对的是以下场景:

  1. 线上部署:公司的生产服务器是 Linux 系统,你的代码需要跑在它上面。

  2. 环境隔离:你的开发环境、测试环境、生产环境需要严格一致,否则会出现"在我电脑上能跑"的尴尬情况。

  3. 服务管理:你写的 Web 应用(如 Tomcat)、数据库(如 MySQL)、缓存(如 Redis)需要被稳定地管理、监控和启动。

  4. 问题排查:系统突然变慢、CPU 飙升、磁盘满了,你需要能登录到服务器,快速定位并解决问题。

核心价值: Linux 是解决以上所有问题的基石。它是企业级后端系统、云计算、大数据、容器化(Docker/K8s)等技术的底层核心操作系统。不懂 Linux,你就无法真正理解你的代码是如何在线上环境运行的,也无法成为一个合格的架构师或运维工程师。

技术边界: 这篇文章不会让你成为一个 Linux 内核源码贡献者,但会让你成为一个能熟练驾驭 Linux 进行开发、部署、调试和排错的"老鸟"。我们将聚焦于应用层面,覆盖从入门到企业实战所需的所有核心技能。


第一阶段:问题锚定 - 我们为何踏上 Linux 之路?

在开始动手之前,我们先回答一个根本问题:我为什么要学这些?

1. 场景化抛出问题(每个知识点的"灵魂拷问")

知识点 企业痛点引入
Linux系统安装 买了台云服务器,或者想在自己的电脑上搭建一个和公司生产环境一致的学习环境,怎么从头开始?
环境变量 在命令行输入 java -version 提示"command not found",明明已经安装了 JDK,为什么系统找不到?
文件管理 服务器上的日志文件 /var/log/messages 把磁盘写满了,怎么找到并清理它?怎么按时间、大小查找文件?
用户管理 新员工入职,需要给他一个服务器账号,既要让他能工作,又不能让他乱改系统核心文件,怎么设置权限?
内存管理 线上应用突然 OOM (Out of Memory) 了,怎么快速查看哪个进程吃了最多的内存?
磁盘管理 数据库服务器磁盘告警,如何快速定位是哪个分区满了,并添加一块新的磁盘来扩展容量?
进程管理 某个 Java 应用假死,端口占用,无法停止,如何强制"杀死"它?
网络管理 部署好的应用,浏览器却无法访问,怎么排查是端口没开放、防火墙阻拦还是网络不通?
软件包管理 需要在服务器上安装 Nginx、MySQL 等软件,是下载源码编译,还是用一条命令搞定?两者有什么区别?
服务管理 想让 Nginx 在服务器开机后自动启动,而不是每次重启都要手动运行,怎么做?
日志管理 系统出现异常,如何从海量的日志文件中快速筛选出某个时间段的错误信息?
Linux内核 听说 Linux 内核可以动态调整参数(如文件句柄数、网络连接数),为什么要调?怎么调?
常用命令 忘了某个命令的用法,或者想查一个文件里包含"error"关键词的行,怎么办?
常用环境搭建 需要搭建一套 Java Web 开发环境(JDK, MySQL, Nginx, Redis),如何高效、规范地完成?
Shell脚本编程 每天上班都要执行一堆重复的命令(如备份日志、重启服务),能不能写个脚本一键搞定?
VIM的使用 在服务器上修改配置文件,没有图形化界面,如何在命令行里高效地编辑文件?

2. 技术定位与价值

Linux 不是一个孤立的工具,而是一个平台。它将以上所有知识点有机地整合在一起,为我们提供了一个强大、稳定、高效的运行环境。学习 Linux,就是学习如何与这台强大的服务器进行沟通,让它按我们的意愿去工作。


第二阶段:基础认知 - 搭建你的第一块基石

2.1 Linux 系统安装

核心概念: 安装 Linux 就像给一台新电脑装 Windows 一样,但不同的是,我们通常安装在服务器上,或者通过虚拟机(如 VirtualBox、VMware)在我们的个人电脑上模拟出来。

去专业化类比: 安装 Linux 就像是买一块空地(服务器)并搭建一套标准化的毛坯房(操作系统),后续我们所有的软件(家具、家电)都要在这个毛坯房里安装和运行。

最小可运行示例:

这里以最主流的 CentOS 7(企业级稳定版)为例,在 VirtualBox 上演示安装。

  1. 下载 ISO 镜像:从官方或镜像站下载 CentOS-7-x86_64-DVD-xxx.iso。

  2. 创建虚拟机

    • 名称:CentOS-7-Learn

    • 类型:Linux,版本:Red Hat (64-bit)

    • 内存:至少 1024 MB

    • 硬盘:创建虚拟硬盘,至少 20GB

  3. 启动安装:选择 ISO 文件,启动虚拟机。

  4. 关键步骤

    • 语言:选择"中文"或"English"(建议英文,为以后处理英文报错打基础)。

    • 安装位置:自动分区或手动分区(新手建议自动分区)。

    • 网络和主机名 :开启网络连接,设置主机名(如 server1.local)。

    • 软件选择:选择"带 GUI 的服务器"(初学者可以有个桌面),或者"最小安装"(高手模式,纯命令行)。

    • 设置 root 密码:超级管理员密码,务必牢记。

    • 创建用户 :创建一个普通用户(如 jack),用于日常操作。

核心原理极简讲解:

  • 分区/ (根分区) 是根目录,所有文件都在它下面;/boot 存放启动文件;swap 是交换分区,当内存不够时,可以临时用硬盘空间充当内存,类似于 Windows 的虚拟内存。

  • Root 用户:类似 Windows 的 Administrator,拥有最高权限,日常操作应避免使用,以防止误操作。

2.2 环境变量

核心概念: 环境变量是操作系统用来存储信息的全局变量 ,比如系统的路径、语言设置、当前用户等。当你在命令行输入一个命令时,系统会去 PATH 这个变量指定的所有路径下寻找这个命令的可执行文件。

去专业化类比: PATH 环境变量就像是小区物业的"通联簿"。你喊一声"修水管"(执行 java 命令),物业(操作系统)会先去查看"通联簿"上记录的维修师傅(/usr/bin/java/usr/local/java/bin)的地址,找到了就去叫他,找不到就说"查无此人"(command not found)。

最小可运行示例:

  1. 查看环境变量

    复制代码
    # 查看所有环境变量
    env
    # 查看 PATH 变量
    echo $PATH
    # 输出类似:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  2. 临时设置 PATH

    复制代码
    # 假设你手动解压了 JDK 到 /opt/jdk1.8.0_202
    export PATH=/opt/jdk1.8.0_202/bin:$PATH
    # 这样,当前终端会话中,java 命令就生效了
  3. 永久设置(企业规范)

    编辑 /etc/profile(系统级,对所有用户生效)或 ~/.bashrc(用户级,仅对当前用户生效)。

    复制代码
    # 编辑用户级的配置文件
    vim ~/.bashrc
    # 在文件末尾添加以下两行
    export JAVA_HOME=/opt/jdk1.8.0_202
    export PATH=$JAVA_HOME/bin:$PATH
    # 保存后,让配置立即生效
    source ~/.bashrc

核心原理极简讲解:

  • $ :在 Shell 中,$ 是取值符号,$PATH 代表获取 PATH 这个变量的值。

  • : :在 PATH 中,冒号是路径分隔符。

  • export:让子进程也能继承这个变量,否则只在当前 Shell 中生效。

2.3 文件管理

核心概念: Linux 一切皆文件。无论是普通的文本文件、目录,还是硬件设备(如磁盘、打印机),都被抽象成文件。文件系统是一个树形结构,从根目录 / 开始。

去专业化类比: 文件系统就像一棵倒着长的大树。/ 是树根,/home 是主枝干,/home/jack 是小枝干,而 jack.txt 就是一片叶子。

最小可运行示例:

  1. 常用命令

    复制代码
    # 显示当前路径
    pwd
    # 列出目录内容
    ls -l /home
    # 切换目录
    cd /var/log
    # 创建目录
    mkdir -p /data/project/logs  # -p 递归创建父目录
    # 创建空文件
    touch myfile.txt
    # 复制文件
    cp myfile.txt /tmp/
    # 移动/重命名文件
    mv myfile.txt yourfile.txt
    # 删除文件(危险!谨慎使用)
    rm yourfile.txt
    # 删除目录(递归)
    rm -rf /data/project/   # -r 递归,-f 强制,慎之又慎!

核心原理极简讲解:

  • 文件权限ls -l 显示的第一列如 -rw-r--r--,代表了文件类型和权限。- 普通文件,d 目录。后面 9 个字符,每 3 个一组,分别代表 所有者(u)所属组(g)其他人(o)读(r)写(w)执行(x) 权限。

  • 绝对路径 vs 相对路径/home/jack/file 是绝对路径;../jack/file 是相对路径(.. 代表上一级目录)。

2.4 用户管理

核心概念: Linux 是多用户系统,每个用户都有一个唯一的 UID。通过用户和组,我们可以精细地控制谁可以访问哪些文件和进程。

去专业化类比: 公司大楼(服务器)里有很多办公室(文件)。用户 就是员工,每人有一张门禁卡。 就是部门,部门经理(组管理员)可以决定部门成员能进入哪些办公室。root 用户就是公司老板,可以进任何办公室。

最小可运行示例:

复制代码
# 添加用户
useradd alice
# 为用户设置密码
passwd alice

# 添加组
groupadd dev
# 将用户 alice 添加到 dev 组
usermod -aG dev alice

# 查看用户信息
id alice
# 输出:uid=1001(alice) gid=1001(alice) groups=1001(alice),1002(dev)

# 切换用户(su = switch user)
su - alice
# 以其他用户身份执行一条命令
sudo -u alice ls /home/alice

# 删除用户
userdel -r alice  # -r 会同时删除用户的家目录

核心原理极简讲解:

  • UID 0:UID 为 0 的用户就是 root 用户。

  • /etc/passwd:存储用户的基本信息,如用户名、UID、家目录、默认 Shell。

  • /etc/group:存储组信息。

  • /etc/shadow:存储加密后的用户密码,权限极高,只有 root 可读。


第三阶段:核心用法拆解 - 企业高频实操

这一阶段,我们不再停留于"是什么",而是聚焦于"怎么用",尤其是企业开发中最常用的那些场景。

3.1 内存管理:诊断服务器"心脏"状态

场景 1:服务器卡慢,查看内存使用情况

复制代码
# 查看内存整体情况(单位 KB,用 -h 可读)
free -h
# 输出:
#               total        used        free      shared  buff/cache   available
# Mem:           7.6G        1.2G        5.1G        123M        1.3G        6.0G
# Swap:          2.0G         0B         2.0G
# available 是关键:可用的内存(包括可回收的),接近 0 就要报警了。

场景 2:哪个进程吃内存最多?

复制代码
# 按内存使用率排序,显示前10个进程
ps aux --sort=-%mem | head -10
# 或者用 top 命令,交互式查看
top
# 在 top 界面,按 M(大写)可以按内存使用率排序

场景 3:查看某个进程的详细内存映射

复制代码
# 先找到 Java 应用的 PID,假设是 12345
pmap -x 12345
# 会显示该进程占用的各个内存段,用于深度排查内存泄露。

3.2 磁盘管理:给服务器"扩容"

场景 1:磁盘满了,查看磁盘使用情况

复制代码
# 查看磁盘分区使用情况
df -h
# 输出:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/vda1        40G   38G  1.2G  97% /
# 看到根分区使用率 97%,需要清理或扩容

场景 2:哪个目录占了最多空间?

复制代码
# 查看当前目录下各子目录的大小
du -sh * | sort -hr
# 或者进入根目录,逐层排查
cd /
du -sh * | sort -hr
# 发现 /var 目录很大,再进入 /var 继续排查
cd /var
du -sh * | sort -hr
# 最终定位到 /var/log 或 /var/lib/docker 占用了大量空间

场景 3:挂载新硬盘

假设添加了一块新的硬盘 /dev/sdb,想挂载到 /data 目录。

复制代码
# 1. 分区(通常使用 fdisk)
fdisk /dev/sdb
# 输入 n 新建分区,p 选择主分区,1 分区号,默认起始和结束扇区,w 写入保存

# 2. 格式化(创建文件系统)
mkfs.ext4 /dev/sdb1

# 3. 创建挂载点
mkdir /data

# 4. 挂载
mount /dev/sdb1 /data

# 5. 查看挂载结果
df -h

# 6. 设置开机自动挂载(编辑 /etc/fstab)
echo "/dev/sdb1 /data ext4 defaults 0 0" >> /etc/fstab

3.3 进程管理:掌控程序的"生杀大权"

场景 1:启动一个后台服务

复制代码
# 直接在前台运行,会占用终端
./myapp.jar
# 用 & 放到后台运行
./myapp.jar &
# 或者用 nohup 让进程忽略挂断信号,并在后台运行(将输出重定向到 nohup.out)
nohup ./myapp.jar > app.log 2>&1 &

场景 2:找到并杀死占用端口的进程

复制代码
# 1. 查看哪个进程占用了 8080 端口
lsof -i:8080
# 或
netstat -tunlp | grep 8080
# 输出:tcp6       0      0 :::8080                 :::*                    LISTEN      12345/java
# 进程号 (PID) 是 12345

# 2. 结束进程
kill 12345        # 优雅地结束,发送 TERM 信号
kill -9 12345     # 强制结束,发送 KILL 信号,不推荐,除非进程僵死

场景 3:查看进程的树形结构

复制代码
pstree -p 12345  # 查看 12345 进程的父子关系
# 这对理解服务启动链很有帮助,比如 systemd 启动的 Nginx 会 fork 出 worker 进程。

3.4 网络管理:排查连接问题

场景 1:测试网络连通性

复制代码
# ping 一个地址,看是否能通(可能被防火墙禁止)
ping baidu.com

场景 2:查看本机 IP 和路由表

复制代码
# 查看网卡配置
ip addr
# 或
ifconfig

# 查看路由表
route -n
# 或
ip route

场景 3:测试端口是否开放

复制代码
# telnet 测试
telnet 192.168.1.100 8080
# 如果黑屏或显示 Connected,说明端口通;否则显示 Connection refused 或超时

# 更现代的方式,用 nc (netcat)
nc -zv 192.168.1.100 8080

场景 4:查看网络连接状态

复制代码
# 查看当前服务器的所有 TCP 连接
ss -tunap
# -t TCP, -u UDP, -n 不解析域名, -a 所有, -p 显示进程

3.5 软件包管理:高效安装软件

在 CentOS/RHEL 系中,用 yum(或新版 dnf)。在 Debian/Ubuntu 系中,用 apt

场景 1:安装软件

复制代码
# 搜索软件包
yum search nginx
# 安装
yum install -y nginx   # -y 自动确认

场景 2:安装非官方源的软件(以 Redis 为例)

复制代码
# 添加 EPEL 仓库(Extra Packages for Enterprise Linux)
yum install -y epel-release
# 安装 redis
yum install -y redis

场景 3:编译安装(用于需要特定版本或自定义编译选项)

复制代码
# 以安装最新版 Nginx 为例
# 1. 安装编译工具和依赖
yum install -y gcc make pcre-devel zlib-devel openssl-devel

# 2. 下载源码
wget http://nginx.org/download/nginx-1.22.0.tar.gz
tar -xzf nginx-1.22.0.tar.gz
cd nginx-1.22.0

# 3. 配置、编译、安装
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make
make install

# 4. 启动(编译安装的 Nginx 没有 systemd 服务文件,需手动管理)
/usr/local/nginx/sbin/nginx

3.6 服务管理:规范化管理应用

现代 Linux 大多使用 systemd 来管理服务。

场景 1:管理服务(启动、停止、重启、状态)

复制代码
# 操作 docker 服务
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker

# 设置开机自启
systemctl enable docker

# 禁用开机自启
systemctl disable docker

场景 2:创建一个自定义的服务(比如把自己的 Java 应用做成服务)

/etc/systemd/system/ 下创建 myapp.service 文件。

复制代码
[Unit]
Description=My Java Application
After=network.target

[Service]
User=jack
Group=jack
ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
SuccessExitStatus=143
Restart=always

[Install]
WantedBy=multi-user.target

然后启用它:

复制代码
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp

第四阶段:场景融合 - 多技术协作,解决复杂业务

这一阶段,我们将几个知识点串联起来,解决一个实际的企业级问题:如何构建一个高可用的 Java Web 应用环境?

业务流程串联:用户访问 http://yourdomain.com 的整个流程

  1. 用户请求 → 互联网 → DNS 解析 → 你的服务器 IP。

  2. 网络层:服务器的防火墙(iptables/firewalld)放行了 80/443 端口。

  3. 反向代理层:Nginx 监听 80 端口,接收到请求。根据配置,它可能直接返回静态页面,或者将请求转发给后端的 Java 应用。

  4. 应用层:Nginx 将请求转发给运行在 8080 端口的 Tomcat(你的 Spring Boot 应用)。

  5. 应用内部:Tomcat 处理请求,可能需要查询 MySQL 数据库,或者从 Redis 读取缓存数据。

  6. 数据层:MySQL 或 Redis 处理完数据,返回结果给 Tomcat。

  7. 响应返回:Tomcat 生成 HTML/JSON 响应给 Nginx,Nginx 再返回给用户。

技术选型与协作:

  • Nginx :作为入口,解决静态资源处理 (图片、CSS、JS)和负载均衡问题。它高效、轻量,比直接用 Tomcat 处理静态资源好得多。

  • Spring Boot (内嵌 Tomcat):作为业务逻辑处理的核心。

  • MySQL:关系型数据库,存储核心业务数据(用户、订单等)。

  • Redis:内存数据库,作为缓存,存放热点数据(如 Session、商品详情),解决数据库压力。

  • Systemd:管理 Nginx、MySQL、Redis、Java 应用的启动、停止和自启,确保服务器重启后服务能自动恢复。

  • 日志管理 (Logstash/Filebeat):所有服务的日志(Nginx access/error log, Tomcat catalina.out, MySQL error log)统一收集到 Elasticsearch,并通过 Kibana 进行可视化分析和故障排查。


第五阶段:企业级实战 - 从零搭建一个"简易商城"后台

实战项目选型: 我们将使用 Spring Boot + MySQL + Redis + Nginx,在一个全新的 Linux 服务器上,从安装软件到部署应用,完整走一遍企业开发流程。

5.1 环境准备 (Linux)

  1. 安装 JDK

    复制代码
    # 下载或上传 jdk-8u202-linux-x64.tar.gz
    tar -xzf jdk-8u202-linux-x64.tar.gz -C /opt/
    # 配置环境变量
    echo "export JAVA_HOME=/opt/jdk1.8.0_202" >> /etc/profile
    echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
    source /etc/profile
    java -version
  2. 安装 MySQL

    复制代码
    # 下载 MySQL 官方 Yum Repository
    wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
    yum localinstall -y mysql80-community-release-el7-3.noarch.rpm
    # 安装 MySQL 服务器
    yum install -y mysql-community-server
    # 启动并设置自启
    systemctl start mysqld
    systemctl enable mysqld
    # 获取临时密码
    grep 'temporary password' /var/log/mysqld.log
    # 登录并修改密码
    mysql -uroot -p
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123!';
    # 创建数据库
    CREATE DATABASE mall;
  3. 安装 Redis

    复制代码
    yum install -y epel-release
    yum install -y redis
    systemctl start redis
    systemctl enable redis
    # 安全配置:修改 /etc/redis.conf
    # bind 127.0.0.1  # 只允许本机访问
    # requirepass yourpassword  # 设置密码
  4. 安装 Nginx

    复制代码
    yum install -y nginx
    systemctl start nginx
    systemctl enable nginx

5.2 开发规范落地 (代码层面)

假设我们已经有一个 Spring Boot 项目 mall-api.jar

  1. 代码分层:Controller (处理请求) → Service (业务逻辑) → DAO (数据访问) → Model (实体)。

  2. 配置分离 :使用 application-dev.yml(开发)、application-prod.yml(生产)。通过 spring.profiles.active=prod 来切换。数据库密码、Redis 密码等敏感信息放在配置文件中,不硬编码。

  3. 异常处理 :定义全局异常处理器 @ControllerAdvice,统一返回 JSON 格式的异常信息。

  4. 日志规范 :在 application.yml 中配置日志级别、输出路径等。代码中使用 @Slf4j 注解和 log.info("用户 {} 登录成功", userId) 打印日志,避免 System.out.println

5.3 部署与测试

  1. 构建 :在本地使用 Maven 打包 mvn clean package,生成 mall-api.jar

  2. 上传 :使用 scp 命令将 mall-api.jar 上传到服务器的 /opt/apps/mall/ 目录。

  3. 运行

    复制代码
    # 启动应用,并指定生产环境配置
    nohup java -jar /opt/apps/mall/mall-api.jar --spring.profiles.active=prod > /opt/apps/mall/app.log 2>&1 &
  4. 配置 Nginx 反向代理

    编辑 /etc/nginx/conf.d/mall.conf

    复制代码
    server {
        listen       80;
        server_name  your-domain.com;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    
        location /static/ {
            root /opt/apps/mall/;
            expires 30d;
        }
    }

    然后 nginx -t 检查配置,systemctl reload nginx 重载配置。

  5. 测试 :通过 Postman 或浏览器访问 http://your-domain.com/api/test,检查接口是否正常。


第六阶段:复盘升华 - 从"会用"到"用好"

6.1 最佳实践总结

  1. 环境变量 :优先使用 ~/.bashrc/etc/profile.d/*.sh,而不是直接修改 /etc/profile

  2. 文件管理 :使用 rm -rf 前三思,最好用 mv 先移到 /tmp 下观察。

  3. 用户管理 :遵循"最小权限原则",日常使用普通用户,需要 root 权限时用 sudo

  4. 进程管理 :优先使用 kill 而非 kill -9,给进程清理资源的机会。对于常驻进程,一定要做成 systemd 服务。

  5. 网络管理 :云服务器安全组(防火墙)和系统内部防火墙(firewalld)要配合好,别在系统层放行了,却在安全组忘了开端口。

  6. 软件包管理 :能用 yum/apt 安装的,优先用包管理器,便于升级和管理。只有对版本或配置有特殊要求时,才考虑编译安装。

  7. 服务管理:所有应用都应写成 systemd 服务,以便统一管理和监控。

  8. 日志管理 :日志要定期轮转(logrotate),避免单个日志文件过大撑爆磁盘。

6.2 技术演进讲解

  • 文件系统:ext4(传统) → xfs(高性能,Red Hat 7+ 默认)。

  • 初始化系统 :System V init (service 命令) → systemd (systemctl 命令)。

  • 网络配置ifconfig (net-tools) → ip (iproute2),功能更强大,命令更统一。

  • 进程查看pstophtop (更友好的界面,支持鼠标) → glances (更全面的系统监控)。

  • Shell:Bash → Zsh (更丰富的插件和主题,配合 Oh My Zsh)。

  • 容器化 :传统的直接部署 → Docker 容器化部署,实现环境一致、快速扩缩容。

6.3 面试/工作高频问题

  1. kill -9kill -15 有什么区别?
    -15 (TERM) 是终止信号,进程收到后可以做一些清理工作(如关闭文件、释放锁),是"优雅地"退出;-9 (KILL) 是强制终止,进程无法捕获,直接由内核杀死,可能造成数据丢失或资源未释放。

  2. CPU load average (平均负载) 的含义是什么?
    :比如 load average: 2.5, 2.0, 1.8,表示在过去 1、5、15 分钟内,系统中处于运行状态不可中断睡眠状态的进程数平均值。如果这个值长期大于 CPU 核心数,说明系统可能过载。

  3. :如何查找大文件?
    find / -type f -size +100M -exec ls -lh {} \; 或使用 du -ah / | sort -rh | head -10

  4. :如何定位 CPU 飙升的 Java 线程?

    1. top 找到 Java 进程 PID。

    2. top -H -p PID 找到该进程内 CPU 最高的线程 ID (TID),是十进制。

    3. 将 TID 转换成十六进制 printf "%x\n" TID

    4. jstack PID | grep -A 30 十六进制TID 查看该线程的堆栈信息,定位到具体的代码行。

  5. 硬链接软链接 的区别?
    :硬链接是同一个文件的多个入口,指向同一个 inode,删除一个不影响另一个,不能跨文件系统。软链接(符号链接)是一个独立的文件,内容指向另一个文件的路径,类似 Windows 的快捷方式,源文件删除后,软链接就失效了。


结语:Linux 之旅,永无止境

恭喜你,你已经完成了一次从零基础到企业实战的 Linux 系统学习之旅!我们通过"问题驱动"的方式,不仅掌握了每个命令的用法,更重要的是理解了它们在实际工作中扮演的角色和解决的具体问题。

但这仅仅是开始。Linux 的世界博大精深,还有 awksedgrep 三剑客的深入应用,有 iptables 防火墙的复杂配置,有 ansible 等自动化运维工具的集成,更有 Docker、Kubernetes 等云原生技术与 Linux 的深度融合。

记住,你与服务器的每一次交互,都是一次对话。 当你熟练掌握了这门语言,你就能真正地驾驭它,让它成为你最可靠的伙伴,支撑起你所有的技术梦想。

希望这篇博客能成为你 Linux 学习路上的一个坚实脚印。如果你有任何问题或想法,欢迎在评论区留言交流!

相关推荐
Mr.wangh2 小时前
redis面试题总结
java·redis·面试
何妨呀~2 小时前
Docker部署与配置全攻略
运维·docker·容器
wuqingshun3141592 小时前
依赖注入的方式有几种,各是什么?
java·开发语言
the sun342 小时前
从Ubuntu迁移到QEMU驱动开发
linux·驱动开发·ubuntu
犽戾武2 小时前
机械臂 VR 遥操作调试日志记录
linux·服务器·网络
gaize12132 小时前
阿里云轻量适配宝塔
阿里云·云计算
路由侠内网穿透2 小时前
本地部署开源 LLM 应用观测与调试平台 Langfuse 并实现外部访问
运维·服务器·数据库·物联网·开源
SPC的存折2 小时前
1、Ansible之Ansible安装与入门
linux·数据库·ansible
冬夜戏雪2 小时前
实习面经(十二)
java