十二月 21, 2025
41 分钟阅读

初级 DevOps 工程师面试题与答案

interview
career-advice
job-search
entry-level
初级 DevOps 工程师面试题与答案
Milad Bonakdar

Milad Bonakdar

作者

用实用问题准备 Linux 排障、Git、CI/CD、Docker、云基础、Terraform、监控、Kubernetes 和 Bash 面试重点。


快速要点

初级 DevOps 面试通常会看你是否能冷静排障、解释软件交付流程,并谨慎使用接近生产环境的工具。常见范围包括 Linux 服务和日志、Git、CI/CD、Docker、云基础、Terraform、监控、Kubernetes、配置管理和 Bash。

使用这份指南时,不要只背答案,也要练习思路:先检查什么、看哪些日志、什么时候回滚、什么时候需要更多上下文。


Linux 基础

1. 解释一下作为 DevOps 工程师,你每天都会用到的常用 Linux 命令。

答案: DevOps 工作中必不可少的 Linux 命令:

# 文件操作
ls -la                    # 列出文件详细信息
cd /var/log              # 切换目录
cat /etc/hosts           # 显示文件内容
tail -f /var/log/app.log # 实时跟踪日志文件
grep "error" app.log     # 搜索特定模式

# 进程管理
ps aux | grep nginx      # 列出进程
top                      # 监控系统资源
kill -9 1234            # 强制终止进程
systemctl status nginx   # 检查服务状态
systemctl restart nginx  # 重启服务

# 文件权限
chmod 755 script.sh      # 更改文件权限
chown user:group file    # 更改所有者
ls -l                    # 查看权限

# 磁盘使用情况
df -h                    # 磁盘空间使用情况
du -sh /var/log          # 目录大小
free -h                  # 内存使用情况

# 网络
netstat -tulpn           # 显示监听端口
curl https://api.com     # 发送 HTTP 请求
ping google.com          # 测试连接
ssh user@server          # 远程登录

稀有度: 非常常见 难度: 简单


2. 如何排查 Linux 上无法启动的服务?

答案: 系统性的故障排除方法:

# 1. 检查服务状态
systemctl status nginx
# 查找错误消息

# 2. 检查日志
journalctl -u nginx -n 50
# 或者
tail -f /var/log/nginx/error.log

# 3. 检查配置语法
nginx -t

# 4. 检查端口是否已被占用
netstat -tulpn | grep :80
# 或者
lsof -i :80

# 5. 检查文件权限
ls -l /etc/nginx/nginx.conf
ls -ld /var/log/nginx

# 6. 检查磁盘空间
df -h

# 7. 尝试手动启动以获取更多详细信息
nginx -g 'daemon off;'

# 8. 检查 SELinux/AppArmor(如果已启用)
getenforce
ausearch -m avc -ts recent

常见问题:

  • 配置语法错误
  • 端口已被占用
  • 权限被拒绝
  • 缺少依赖项
  • 磁盘空间不足

稀有度: 非常常见 难度: 中等


使用 Git 进行版本控制

3. 解释一下基本的 Git 工作流程和常用命令。

答案: 日常 DevOps 任务的 Git 工作流程:

# 初始化仓库
git init
git clone https://github.com/user/repo.git

# 检查状态
git status
git log --oneline

# 基本工作流程
git add .                    # 暂存更改
git commit -m "添加功能"  # 提交更改
git push origin main         # 推送到远程

# 分支
git branch feature-x         # 创建分支
git checkout feature-x       # 切换分支
git checkout -b feature-y    # 创建并切换

# 合并
git checkout main
git merge feature-x

# 拉取最新更改
git pull origin main

# 撤销更改
git reset --hard HEAD        # 放弃本地更改
git revert abc123           # 恢复特定提交

# 储藏更改
git stash                    # 暂时保存更改
git stash pop               # 恢复储藏的更改

# 查看差异
git diff                     # 未暂存的更改
git diff --staged           # 暂存的更改

最佳实践:

  • 编写清晰的提交消息
  • 经常提交,定期推送
  • 使用功能分支
  • 推送前先拉取
  • 提交前审查更改

稀有度: 非常常见 难度: 简单


4. 如何解决 Git 中的合并冲突?

答案: 冲突解决的步骤:

# 1. 尝试合并
git merge feature-branch
# 自动合并 file.txt
# CONFLICT (content): file.txt 中存在合并冲突

# 2. 检查存在冲突的文件
git status
# 未合并的路径:
#   both modified:   file.txt

# 3. 打开存在冲突的文件
cat file.txt
# <<<<<<< HEAD
# 当前分支内容
# =======
# 传入分支内容
# >>>>>>> feature-branch

# 4. 编辑文件以解决冲突
# 删除冲突标记并保留所需的更改

# 5. 暂存已解决的文件
git add file.txt

# 6. 完成合并
git commit -m "解决合并冲突"

# 替代方案:中止合并
git merge --abort

冲突标记:

  • <<<<<<< HEAD - 你当前的分支
  • ======= - 分隔符
  • >>>>>>> branch-name - 传入的更改

稀有度: 常见 难度: 简单-中等


CI/CD 基础

5. 什么是 CI/CD,为什么它很重要?

答案: CI/CD 代表持续集成和持续部署/交付。

持续集成 (CI):

  • 每次提交时自动构建和测试代码
  • 尽早发现错误
  • 确保代码正确集成

持续部署 (CD):

  • 测试通过后自动部署到生产环境
  • 更快的发布周期
  • 减少手动错误
Loading diagram...

优点:

  • 更快的反馈循环
  • 减少集成问题
  • 自动化测试
  • 一致的部署
  • 更快的产品上市时间

稀有度: 非常常见 难度: 简单


6. 解释一下使用 GitHub Actions 的基本 CI/CD 流水线。

答案: GitHub Actions 工作流程示例:

# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    
    steps:
    - name: 检出代码
      uses: actions/checkout@v4
    
    - name: 设置 Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '20'
    
    - name: 安装依赖
      run: npm ci
    
    - name: 运行测试
      run: npm test
    
    - name: 构建应用程序
      run: npm run build
    
    - name: 运行 linter
      run: npm run lint

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: 部署到生产环境
      run: |
        echo "正在部署到生产环境..."
        # 在此处添加部署命令

关键概念:

  • 触发器: 何时运行流水线(推送、PR、计划任务)
  • 作业: 可以并行运行的独立任务
  • 步骤: 作业中的单个命令
  • 工件: 在作业之间传递的文件

稀有度: 非常常见 难度: 中等


Docker & 容器化

7. 什么是 Docker,为什么我们使用容器?

答案: Docker 是一个用于在容器中开发、交付和运行应用程序的平台。

容器 vs 虚拟机:

  • 容器共享宿主机操作系统内核(轻量级)
  • 虚拟机包含完整的操作系统(重量级)
  • 容器在几秒钟内启动
  • 更好的资源利用率

优点:

  • 一致性: 到处都是相同的环境
  • 隔离: 应用程序互不干扰
  • 可移植性: 可以在任何地方运行
  • 效率: 轻量级且快速
# Dockerfile 示例
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

稀有度: 非常常见 难度: 简单


8. 解释一下常用的 Docker 命令。

答案: 必不可少的 Docker 命令:

# 镜像
docker pull nginx:latest          # 下载镜像
docker images                     # 列出镜像
docker rmi nginx:latest          # 删除镜像
docker build -t myapp:1.0 .      # 构建镜像

# 容器
docker run -d -p 80:80 nginx     # 运行容器
docker ps                         # 列出正在运行的容器
docker ps -a                      # 列出所有容器
docker stop container_id          # 停止容器
docker start container_id         # 启动容器
docker restart container_id       # 重启容器
docker rm container_id            # 删除容器

# 日志和调试
docker logs container_id          # 查看日志
docker logs -f container_id       # 跟踪日志
docker exec -it container_id bash # 进入容器
docker inspect container_id       # 详细信息

# 清理
docker system prune              # 删除未使用的数据
docker volume prune              # 删除未使用的卷

# Docker Compose
docker compose up -d             # 启动服务
docker compose down              # 停止服务
docker compose logs -f           # 查看日志

稀有度: 非常常见 难度: 简单


9. 为包含数据库的 Web 应用程序编写 Docker Compose 文件。

答案: 多容器应用程序示例:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
      - DB_NAME=myapp
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    restart: unless-stopped

volumes:
  postgres_data:

关键概念:

  • services: 定义容器
  • depends_on: 服务依赖关系
  • volumes: 持久数据存储
  • environment: 环境变量
  • ports: 端口映射
  • restart: 重启策略

稀有度: 常见 难度: 中等


云基础

10. 解释一下 IaaS、PaaS 和 SaaS 之间的区别。

答案: 云服务模型:

IaaS (基础设施即服务):

  • 提供:虚拟机、存储、网络
  • 你管理:操作系统、运行时、应用程序
  • 示例:AWS EC2、Azure VMs、Google Compute Engine
  • 用例:完全控制基础设施

PaaS (平台即服务):

  • 提供:运行时环境、数据库、中间件
  • 你管理:应用程序和数据
  • 示例:AWS Elastic Beanstalk、Heroku、Google App Engine
  • 用例:专注于代码,而不是基础设施

SaaS (软件即服务):

  • 提供:完整的应用程序
  • 你管理:用户数据和设置
  • 示例:Gmail、Salesforce、Office 365
  • 用例:即用型应用程序
Loading diagram...

稀有度: 常见 难度: 简单


11. DevOps 工程师应该了解哪些基本的 AWS 服务?

答案: 必不可少的 AWS 服务:

计算:

  • EC2: 虚拟机
  • Lambda: 无服务器函数
  • ECS/EKS: 容器编排

存储:

  • S3: 对象存储
  • EBS: EC2 的块存储
  • EFS: 共享文件存储

网络:

  • VPC: 虚拟私有云
  • Route 53: DNS 服务
  • CloudFront: CDN
  • ELB: 负载均衡

数据库:

  • RDS: 托管关系数据库
  • DynamoDB: NoSQL 数据库

DevOps 工具:

  • CodePipeline: CI/CD 服务
  • CodeBuild: 构建服务
  • CloudWatch: 监控和日志记录
  • IAM: 访问管理

示例:使用 AWS CLI 启动 EC2 实例:

aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-group-ids sg-0123456789abcdef0 \
  --subnet-id subnet-0123456789abcdef0 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServer}]'

稀有度: 非常常见 难度: 中等


基础设施即代码

12. 什么是基础设施即代码 (IaC),为什么它很重要?

答案: IaC 是通过代码而不是手动流程来管理基础设施。

优点:

  • 版本控制: 跟踪基础设施更改
  • 可重现性: 创建相同的环境
  • 自动化: 减少手动错误
  • 文档: 代码充当文档
  • 一致性: 到处都是相同的配置

流行的 IaC 工具:

  • Terraform: 多云配置
  • Ansible: 配置管理
  • CloudFormation: AWS 特定的
  • Pulumi: 基于代码的 IaC

Terraform 示例:

# main.tf
provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "WebServer"
    Environment = "Production"
  }
}

resource "aws_security_group" "web_sg" {
  name        = "web-sg"
  description = "允许 HTTP 流量"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

稀有度: 非常常见 难度: 中等


13. 解释一下基本的 Terraform 工作流程。

答案: Terraform 工作流程步骤:

# 1. 初始化 Terraform
terraform init
# 下载提供程序和模块

# 2. 格式化代码
terraform fmt
# 格式化 .tf 文件

# 3. 验证配置
terraform validate
# 检查语法

# 4. 计划更改
terraform plan
# 显示将要创建/修改/销毁的内容

# 5. 应用更改
terraform apply
# 创建/更新基础设施
# 提示确认

# 6. 查看状态
terraform show
# 显示当前状态

# 7. 销毁基础设施
terraform destroy
# 删除所有资源

Terraform 文件结构:

project/
├── main.tf          # 主要配置
├── variables.tf     # 输入变量
├── outputs.tf       # 输出值
├── terraform.tfvars # 变量值
└── .terraform/      # 提供程序插件

变量示例:

# variables.tf
variable "instance_type" {
  description = "EC2 实例类型"
  type        = string
  default     = "t2.micro"
}

variable "environment" {
  description = "环境名称"
  type        = string
}

# terraform.tfvars
environment = "production"
instance_type = "t2.small"

稀有度: 常见 难度: 中等


监控 & 日志记录

14. 你会监控 Web 应用程序的哪些指标?

答案: 关键监控指标:

应用程序指标:

  • 响应时间/延迟
  • 请求速率(每秒请求数)
  • 错误率(4xx、5xx 错误)
  • 吞吐量

系统指标:

  • CPU 使用率
  • 内存使用率
  • 磁盘 I/O
  • 网络 I/O

基础设施指标:

  • 容器/pod 状态
  • 服务可用性
  • 负载均衡器运行状况

Prometheus 查询示例:

# 平均响应时间
rate(http_request_duration_seconds_sum[5m])
/ rate(http_request_duration_seconds_count[5m])

# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))

# CPU 使用率
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

警报阈值:

  • 响应时间 > 500ms
  • 错误率 > 1%
  • CPU 使用率 > 80%
  • 内存使用率 > 85%
  • 磁盘使用率 > 90%

稀有度: 常见 难度: 中等


15. 如何集中来自多个服务器的日志?

答案: 集中式日志记录架构:

Loading diagram...

常用技术栈 (ELK):

  • Elasticsearch: 存储和索引日志
  • Logstash/Fluentd: 收集和处理日志
  • Kibana: 可视化和搜索日志

Filebeat 配置示例:

# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  fields:
    app: myapp
    environment: production

output.elasticsearch:
  hosts: ["elasticsearch:9200"]
  index: "app-logs-%{+yyyy.MM.dd}"

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

最佳实践:

  • 使用结构化日志记录 (JSON)
  • 包含关联 ID
  • 设置保留策略
  • 有策略地建立索引
  • 监控日志量

稀有度: 常见 难度: 中等


Kubernetes 基础

16. 什么是 Kubernetes,它的基本组件是什么?

答案: Kubernetes 是一个容器编排平台,可以自动部署、扩展和管理容器化应用程序。

基本组件:

控制平面:

  • API 服务器: 所有命令的入口点
  • etcd: 用于集群数据的键值存储
  • 调度器: 将 pod 分配给节点
  • 控制器管理器: 维护所需状态

工作节点:

  • kubelet: 管理节点上的 pod
  • kube-proxy: 网络路由
  • 容器运行时: 通过 containerd 或 CRI-O 等 CRI 运行时运行容器
Loading diagram...

基本 Kubernetes 对象:

1. Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

2. Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

3. Service:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

常用 kubectl 命令:

# 获取资源
kubectl get pods
kubectl get deployments
kubectl get services

# 描述资源
kubectl describe pod nginx-pod

# 从文件创建
kubectl apply -f deployment.yaml

# 删除资源
kubectl delete pod nginx-pod

# 查看日志
kubectl logs nginx-pod

# 在 pod 中执行命令
kubectl exec -it nginx-pod -- /bin/bash

# 端口转发
kubectl port-forward pod/nginx-pod 8080:80

稀有度: 非常常见 难度: 简单


配置管理

17. 解释一下 Ansible 基础知识并编写一个简单的 playbook。

答案: Ansible 是一种无代理配置管理工具,它使用 SSH 来配置服务器。

关键概念:

  • 清单: 要管理的服务器列表
  • Playbook: 定义任务的 YAML 文件
  • 模块: 可重用的工作单元
  • 角色: 有组织的任务集合

清单文件:

# inventory.ini
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com

[all: vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa

简单 Playbook:

# playbook.yml
---
- name: 设置 Web 服务器
  hosts: webservers
  become: yes
  
  vars:
    app_port: 8080
    app_user: webapp
  
  tasks:
    - name: 更新 apt 缓存
      apt:
        update_cache: yes
        cache_valid_time: 3600
    
    - name: 安装所需软件包
      apt:
        name:
          - nginx
          - python3
          - git
        state: present
    
    - name: 创建应用程序用户
      user:
        name: "{{ app_user }}"
        shell: /bin/bash
        create_home: yes
    
    - name: 复制 nginx 配置
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: 重启 nginx
    
    - name: 确保 nginx 正在运行
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: 部署应用程序
      git:
        repo: https://github.com/example/app.git
        dest: /var/www/app
        version: main
      become_user: "{{ app_user }}"
  
  handlers:
    - name: 重启 nginx
      service:
        name: nginx
        state: restarted

模板示例:

# templates/nginx.conf.j2
server {
    listen {{ app_port }};
    server_name {{ ansible_hostname }};
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

运行 Playbook:

# 检查语法
ansible-playbook playbook.yml --syntax-check

# 试运行(检查模式)
ansible-playbook playbook.yml --check

# 运行 playbook
ansible-playbook -i inventory.ini playbook.yml

# 使用特定标签运行
ansible-playbook playbook.yml --tags "deploy"

# 限制到特定主机
ansible-playbook playbook.yml --limit webservers

Ansible 角色结构:

roles/
└── webserver/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    ├── files/
    ├── vars/
    │   └── main.yml
    └── defaults/
        └── main.yml

使用角色:

---
- name: 设置基础设施
  hosts: all
  become: yes
  
  roles:
    - common
    - webserver
    - monitoring

Ad-hoc 命令:

# Ping 所有主机
ansible all -i inventory.ini -m ping

# 在所有主机上运行命令
ansible all -i inventory.ini -a "uptime"

# 安装软件包
ansible webservers -i inventory.ini -m apt -a "name=nginx state=present" --become

# 复制文件
ansible all -i inventory.ini -m copy -a "src=/local/file dest=/remote/file"

# 重启服务
ansible webservers -i inventory.ini -m service -a "name=nginx state=restarted" --become

稀有度: 常见 难度: 中等


脚本编写 & 自动化

18. 编写一个 bash 脚本来自动化一个常见的 DevOps 任务。

答案: Bash 脚本编写对于 DevOps 中的自动化至关重要。

示例 1:备份脚本

#!/bin/bash

# 带有轮换的数据库备份脚本
set -e  # 出错时退出
set -u  # 访问未定义的变量时退出

# 配置
DB_NAME="myapp"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
LOG_FILE="/var/log/mysql_backup.log"

# 用于记录消息的函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 用于发送通知的函数
send_notification() {
    local status=$1
    local message=$2
    
    # 发送到 Slack
    curl -X POST -H 'Content-type: application/json' \
        --data "{\"text\":\"Backup ${status}: ${message}\"}" \
        "$SLACK_WEBHOOK_URL"
}

# 如果备份目录不存在,则创建它
mkdir -p "$BACKUP_DIR"

# 启动备份
log "Starting backup of database: $DB_NAME"

# 执行备份
if mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    log "Backup completed successfully: $BACKUP_FILE"
    
    # 获取文件大小
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "Backup size: $SIZE"
    
    # 删除旧备份
    log "Removing backups older than $RETENTION_DAYS days"
    find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
    
    # 上传到 S3(可选)
    if command -v aws &> /dev/null; then
        log "Uploading backup to S3"
        aws s3 cp "$BACKUP_FILE" "s3://my-backups/mysql/" --storage-class GLACIER
    fi
    
    send_notification "SUCCESS" "Database $DB_NAME backed up successfully ($SIZE)"
else
    log "ERROR: Backup failed"
    send_notification "FAILED" "Database $DB_NAME backup failed"
    exit 1
fi

log "Backup process completed"

示例 2:运行状况检查脚本

#!/bin/bash

# 服务运行状况检查脚本
SERVICES=("nginx" "mysql" "redis")
ENDPOINTS=("http://localhost:80" "http://localhost:8080/health")
ALERT_EMAIL="[email protected]"

check_service() {
    local service=$1
    
    if systemctl is-active --quiet "$service"; then
        echo "✓ $service is running"
        return 0
    else
        echo "✗ $service is NOT running"
        return 1
    fi
}

check_endpoint() {
    local url=$1
    local response=$(curl -s -o /dev/null -w "%{http_code}" "$url")
    
    if [ "$response" -eq 200 ]; then
        echo "✓ $url is healthy (HTTP $response)"
        return 0
    else
        echo "✗ $url is unhealthy (HTTP $response)"
        return 1
    fi
}

check_disk_space() {
    local threshold=80
    local usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
    
    if [ "$usage" -lt "$threshold" ]; then
        echo "✓ Disk usage: ${usage}%"
        return 0
    else
        echo "✗ Disk usage critical: ${usage}%"
        return 1
    fi
}

# 主运行状况检查
echo "=== System Health Check ==="
echo "Date: $(date)"
echo

failed_checks=0

# 检查服务
echo "Checking services..."
for service in "${SERVICES[@]}"; do
    if ! check_service "$service"; then
        ((failed_checks++))
    fi
done
echo

# 检查端点
echo "Checking endpoints..."
for endpoint in "${ENDPOINTS[@]}"; do
    if ! check_endpoint "$endpoint"; then
        ((failed_checks++))
    fi
done
echo

# 检查磁盘空间
echo "Checking disk space..."
if ! check_disk_space; then
    ((failed_checks++))
fi
echo

# 报告结果
if [ $failed_checks -eq 0 ]; then
    echo "All checks passed!"
    exit 0
else
    echo "Failed checks: $failed_checks"
    # 发送警报电子邮件
    echo "Health check failed. $failed_checks issues detected." | \
        mail -s "Health Check Alert" "$ALERT_EMAIL"
    exit 1
fi

示例 3:部署脚本

#!/bin/bash

# 应用程序部署脚本
APP_NAME="myapp"
APP_DIR="/var/www/$APP_NAME"
REPO_URL="https://github.com/example/myapp.git"
BRANCH="main"
BACKUP_DIR="/var/backups/deployments"

deploy() {
    echo "Starting deployment of $APP_NAME"
    
    # 创建备份
    echo "Creating backup..."
    BACKUP_FILE="${BACKUP_DIR}/${APP_NAME}_$(date +%Y%m%d_%H%M%S).tar.gz"
    tar -czf "$BACKUP_FILE" -C "$APP_DIR" .
    
    # 拉取最新代码
    echo "Pulling latest code from $BRANCH..."
    cd "$APP_DIR" || exit 1
    git fetch origin
    git checkout "$BRANCH"
    git pull origin "$BRANCH"
    
    # 安装依赖项
    echo "Installing dependencies..."
    npm ci --production
    
    # 运行数据库迁移
    echo "Running migrations..."
    npm run migrate
    
    # 构建应用程序
    echo "Building application..."
    npm run build
    
    # 重启应用程序
    echo "Restarting application..."
    pm2 restart "$APP_NAME"
    
    # 运行状况检查
    echo "Performing health check..."
    sleep 5
    if curl -f http://localhost:3000/health > /dev/null 2>&1; then
        echo "✓ Deployment successful!"
        return 0
    else
        echo "✗ Health check failed. Rolling back..."
        rollback "$BACKUP_FILE"
        return

面试中不一定需要展示完整脚本。更重要的是说明错误处理、退出码、日志记录,以及如何在安全环境中测试自动化。

出现频率: 非常常见
难度: 中等


总结

准备一个小型端到端项目:Git 仓库、测试、CI workflow、Dockerfile、简单部署环境,以及一些日志或指标。对初级岗位来说,能清楚说明安全排障步骤,比机械背诵命令更有价值。

Newsletter subscription

真正有效的每周职业建议

将最新见解直接发送到您的收件箱

您的下一次面试只差一份简历

在几分钟内创建一份专业、优化的简历。无需设计技能——只有经过验证的结果。

创建我的简历

分享这篇文章

让面试回访翻倍

根据职位描述定制简历的候选人获得的面试机会是其他人的2.5倍。使用我们的AI为每一份申请即时自动定制您的简历。