进程和端口管理
进程和端口管理
简介
在 Linux 系统的日常运维中,进程管理和端口查看是最基础也是最重要的技能之一。无论是部署 .NET 应用、排查服务故障,还是进行性能优化,都需要熟练掌握进程查看、端口检测、信号处理和后台任务管理等操作。
Linux 中的 ps 命令是 Process Status 的缩写,用于列出系统中当前运行的进程快照。如果需要动态地显示进程信息,可以使用 top 或 htop 命令。要对进程进行监测和控制,首先必须了解当前进程的情况,包括进程运行状态、资源占用、父子关系等信息。
特点
优点
缺点
一、ps 命令 - 进程快照查看
参数选项
# 常用参数说明
a 显示所有进程(包括其他用户的进程)
-a 显示同一终端下的所有程序
-A 显示所有进程(等同 -e)
c 显示进程的真实名称
-N 反向选择
-e 等同 "-A"
e 显示环境变量
f 显示程序间的父子关系(树形)
-H 显示树状结构
r 显示当前终端的进程
T 显示当前终端的所有程序
u 指定用户的所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的进程
-C<命令> 列出指定命令的状况
--lines<行数> 每页显示的行数
--width<字符数> 每页显示的字符数
--help 显示帮助信息
--version 显示版本信息常用方式
# 显示所有当前进程(推荐使用)
ps -ef
# BSD 风格显示所有进程(包含资源占用)
ps aux
# 显示所有当前进程
ps -ax
# 根据用户过滤进程
ps -u username
# 根据 CPU 使用率排序
ps -aux --sort -pcpu | less
# 根据内存使用率排序
ps -aux --sort -pmem | less
# 查询前 10 个 CPU 和内存占用最高的进程
ps -aux --sort -pcpu,+pmem | head -n 10
# 通过进程名过滤
ps -C getty
# 带格式显示的进程名过滤
ps -f -C getty
# 根据线程来过滤进程
ps -L 1213
# 树形显示进程
ps -axjf
# 或者使用
pstree
# 显示安全信息
ps -eo pid,user,args
# 格式化输出 root 用户创建的进程
ps -U root -u root u
# 自定义输出列
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | headps 输出字段说明
| 字段 | 说明 |
|---|---|
| USER | 进程所属用户 |
| PID | 进程 ID |
| %CPU | CPU 使用率 |
| %MEM | 内存使用率 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 物理内存大小(KB) |
| TTY | 终端类型 |
| STAT | 进程状态 |
| START | 进程启动时间 |
| TIME | 占用 CPU 的累计时间 |
| COMMAND | 启动命令 |
进程状态说明
| 状态码 | 说明 |
|---|---|
| D | 不可中断的睡眠状态(通常为 IO 操作) |
| R | 正在运行或可运行(在运行队列中) |
| S | 可中断的睡眠状态(等待某个事件完成) |
| T | 被暂停(job control 或被调试器跟踪) |
| Z | 僵尸进程(已终止但未被父进程回收) |
| < | 高优先级进程 |
| N | 低优先级进程 |
| L | 有页面被锁定在内存中 |
| s | 会话领导者(session leader) |
| l | 多线程进程 |
| + | 在前台进程组中 |
二、top 命令 - 实时进程监控
top 命令可以动态地显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器。
# 启动 top
top
# 显示指定用户的进程
top -u username
# 指定刷新间隔(秒)
top -d 2
# 显示指定进程
top -p 1234,5678
# 批处理模式(适合管道处理)
top -b -n 1 > top_output.txttop 交互操作
| 按键 | 功能 |
|---|---|
| h | 显示帮助 |
| k | 终止一个进程 |
| r | 重新设置进程优先级 |
| s | 改变刷新间隔 |
| P | 按 CPU 使用率排序(默认) |
| M | 按内存使用率排序 |
| T | 按时间/累计时间排序 |
| c | 切换显示完整命令行 |
| f | 添加或删除显示字段 |
| 1 | 显示每个 CPU 的使用情况 |
| q | 退出 top |
三、htop 命令 - 增强版进程监控
htop 是 top 的增强版本,提供了更直观的界面和更丰富的交互功能。
# 安装 htop
yum install -y epel-release
yum install -y htop
# 启动 htop
htop
# 显示树形结构
htop -t
# 显示指定用户的进程
htop -u username
# 显示指定 PID
htop -p 1234,5678htop 交互操作
| 按键 | 功能 |
|---|---|
| F1 | 帮助 |
| F2 | 设置 |
| F3 | 搜索进程 |
| F4 | 过滤进程 |
| F5 | 树形视图 |
| F6 | 排序 |
| F7 | 降低优先级(增加 nice 值) |
| F8 | 提高优先级(降低 nice 值) |
| F9 | 发送信号/终止进程 |
| F10 | 退出 |
四、kill 命令 - 发送信号
kill 命令用于向进程发送信号,默认发送 SIGTERM(15)信号。
常用信号列表
| 信号编号 | 信号名称 | 说明 |
|---|---|---|
| 1 | SIGHUP | 挂起信号,通常用于重新加载配置 |
| 2 | SIGINT | 中断信号,等同于 Ctrl+C |
| 9 | SIGKILL | 强制终止,进程无法捕获或忽略 |
| 15 | SIGTERM | 优雅终止(默认信号),进程可以捕获 |
| 18 | SIGCONT | 继续执行暂停的进程 |
| 19 | SIGSTOP | 暂停进程,进程无法捕获或忽略 |
| 20 | SIGTSTP | 终端暂停信号,等同于 Ctrl+Z |
kill 使用示例
# 优雅终止进程(发送 SIGTERM)
kill 1234
# 强制终止进程(发送 SIGKILL)
kill -9 1234
# 重新加载进程配置(发送 SIGHUP)
kill -HUP 1234
# 暂停进程
kill -STOP 1234
# 继续执行暂停的进程
kill -CONT 1234
# 终止指定名称的所有进程
killall nginx
# 使用 pkill 按名称终止进程
pkill -f "dotnet MyApp.dll"
# 按用户终止所有进程
pkill -u username.NET 应用的优雅关闭
# 对于 .NET 应用,建议使用 SIGTERM 优雅关闭
kill -15 $(pgrep -f "MyApp.dll")
# 等待 10 秒后检查是否已关闭
sleep 10
if pgrep -f "MyApp.dll" > /dev/null; then
echo "进程未响应,强制终止"
kill -9 $(pgrep -f "MyApp.dll")
fi五、nice 和 renice - 进程优先级管理
Linux 通过 nice 值来控制进程的优先级,nice 值范围从 -20(最高优先级)到 19(最低优先级),默认为 0。
# 查看 Nice 值
ps -eo pid,ni,comm
# 以指定 nice 值启动进程
nice -n 10 dotnet MyApp.dll
# 修改运行中进程的 nice 值
renice -n 5 -p 1234
# 修改某个用户所有进程的 nice 值
renice -n 5 -u username
# 提高 .NET 应用的优先级(需要 root 权限)
renice -n -5 -p $(pgrep -f "MyApp.dll")六、端口查看
ss 命令(推荐)
ss 是 iproute2 工具集的一部分,用于显示 socket 统计信息,速度比 netstat 更快,是现代 Linux 推荐使用的端口查看工具。
# 显示所有 TCP 连接
ss -t
# 显示所有 TCP 监听端口
ss -tl
# 显示所有 UDP 连接
ss -u
# 显示所有 UDP 监听端口
ss -ul
# 显示端口对应的进程信息(需要 root 权限)
ss -tlnp
# 显示所有已建立的 TCP 连接
ss -t state established
# 查看指定端口的连接
ss -tlnp | grep :8080
# 显示所有 socket 统计
ss -s
# 解析服务名称
ss -tlr
# 常用组合命令
ss -antlpss 输出说明
| 字段 | 说明 |
|---|---|
| Netid | socket 类型(tcp/udp/raw等) |
| State | 连接状态 |
| Recv-Q | 接收队列中的数据量 |
| Send-Q | 发送队列中的数据量 |
| Local Address:Port | 本地地址和端口 |
| Peer Address:Port | 远端地址和端口 |
netstat 命令
netstat 是传统的网络统计工具,在新版系统中已被标记为废弃,但仍然广泛使用。
# 列出所有端口
netstat -a
# 列出所有 TCP 端口
netstat -at
# 列出所有 UDP 端口
netstat -au
# 只显示监听端口
netstat -l
# 只显示监听 TCP 端口
netstat -lt
# 只显示监听 UDP 端口
netstat -lu
# 只显示监听 UNIX 端口
netstat -lx
# 显示 PID 和进程名
netstat -p
# 以数字形式显示地址和端口
netstat -n
# 常用组合:显示所有监听的 TCP 端口及进程
netstat -tlnp
# 找出程序运行的端口
netstat -ap | grep ssh
# 找出运行在指定端口的进程
netstat -an | grep ':80'
# 按各个协议进行统计
netstat -s
# 显示路由表
netstat -r
# 持续监控(每秒刷新)
netstat -clsof 命令
lsof(List Open Files)可以列出当前系统打开的文件和网络连接,是排查端口占用问题的利器。
# 安装 lsof
yum install -y lsof
# 查看指定端口被哪个进程占用
lsof -i :8080
# 查看指定进程打开的所有网络连接
lsof -p 1234
# 查看指定用户的所有网络连接
lsof -u username
# 查看所有 TCP 连接
lsof -i tcp
# 查看所有监听端口
lsof -i -P -n | grep LISTEN
# 查看 IPv4 相关的网络连接
lsof -i 4
# 查看指定进程 ID 打开的所有文件
lsof -p 1234
# 查看指定目录下被打开的文件
lsof +D /var/log/
# 杀掉占用指定端口的所有进程
kill -9 $(lsof -t -i :8080)常见端口排查场景
# 场景1:排查端口被占用问题
lsof -i :5000
# 或者
ss -tlnp | grep :5000
# 场景2:查看 .NET 应用监听的端口
ss -tlnp | grep dotnet
# 场景3:统计各种连接状态的数量
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
# 场景4:查看 TIME_WAIT 连接数
netstat -ant | grep TIME_WAIT | wc -l
# 场景5:查看某个 IP 的连接数
netstat -ant | grep 192.168.1.100 | wc -l
# 场景6:查看连接数最多的 IP
netstat -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10七、后台任务管理
bg 和 fg 命令
# 将当前正在运行的前台进程暂停(Ctrl+Z)
# 然后将其放到后台继续运行
bg
# 将后台进程调回前台
fg
# 查看当前会话的所有后台任务
jobs
# 将指定的后台任务调到前台(job 编号为 1)
fg %1
# 终止后台任务
kill %1nohup 命令
nohup 用于让命令在退出终端后继续运行,并将输出重定向到 nohup.out 文件。
# 后台运行命令(退出终端后不中断)
nohup dotnet MyApp.dll --urls http://*:5000 &
# 指定输出文件
nohup dotnet MyApp.dll --urls http://*:5000 > app.log 2>&1 &
# 查看后台运行的进程
jobs -l
# 查看进程
ps -ef | grep MyAppdisown 命令
如果忘记使用 nohup 启动进程,可以使用 disown 将进程从当前 shell 的作业列表中移除。
# 启动一个长时间运行的任务
dotnet MyApp.dll &
# Ctrl+Z 暂停
# 将其放到后台
bg
# 从当前 shell 移除,使其在 shell 退出后继续运行
disown -h %1
# 查看所有后台任务
jobs -l八、systemd 服务管理
systemd 是现代 Linux 系统的初始化系统和服务管理器,大多数系统服务都通过 systemd 进行管理。
systemctl 基本操作
# 启动服务
systemctl start nginx
# 停止服务
systemctl stop nginx
# 重启服务
systemctl restart nginx
# 重新加载配置(不中断服务)
systemctl reload nginx
# 查看服务状态
systemctl status nginx
# 设置开机启动
systemctl enable nginx
# 取消开机启动
systemctl disable nginx
# 查看是否开机启动
systemctl is-enabled nginx
# 查看所有已启动的服务
systemctl list-units --type=service --state=running
# 查看服务失败信息
systemctl --failed创建自定义 systemd 服务
为 .NET 应用创建 systemd 服务文件,实现自动管理和开机启动。
# 创建服务文件
vi /etc/systemd/system/myapp.service[Unit]
Description=My .NET Application
After=network.target
[Service]
Type=notify
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dll --urls http://*:5000
Restart=always
RestartSec=10
SyslogIdentifier=myapp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target# 重新加载 systemd 配置
systemctl daemon-reload
# 启动服务
systemctl start myapp
# 设置开机启动
systemctl enable myapp
# 查看服务状态
systemctl status myapp
# 查看服务日志
journalctl -u myapp -f
# 查看最近的 100 行日志
journalctl -u myapp -n 100 --no-pagersystemd 服务类型说明
| Type | 说明 | 适用场景 |
|---|---|---|
| simple | 默认类型,ExecStart 启动的进程就是主进程 | 大多数简单服务 |
| forking | ExecStart 启动的进程会产生子进程并退出 | 传统守护进程 |
| notify | 进程启动完成后通过 sd_notify 通知 systemd | 支持 sd_notify 的应用 |
| oneshot | 执行一次性任务,完成后进程退出 | 初始化脚本 |
| idle | 类似 simple,但等待所有任务完成后才执行 | 低优先级任务 |
九、journalctl 日志查看
journalctl 是 systemd 的日志管理工具,可以查看系统和服务的日志。
# 查看所有日志
journalctl
# 查看指定服务的日志
journalctl -u myapp
# 实时查看日志
journalctl -u myapp -f
# 查看最近 100 行日志
journalctl -u myapp -n 100
# 查看指定时间的日志
journalctl --since "2024-01-01" --until "2024-01-02"
journalctl --since "1 hour ago"
# 查看内核日志
journalctl -k
# 按优先级查看日志
journalctl -p err
# 查看指定 PID 的日志
journalctl _PID=1234
# 以 JSON 格式输出
journalctl -u myapp -o json十、常用运维组合命令
# 查找占用 CPU 最高的前 10 个进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -11
# 查找占用内存最高的前 10 个进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -11
# 统计 httpd 进程的数量
ps -ef | grep httpd | grep -v grep | wc -l
# 查看所有僵尸进程
ps -eo pid,ppid,stat,cmd | grep -E "^[[:space:]]*[0-9]+[[:space:]]+[0-9]+[[:space:]]+[^[:space:]]*Z"
# 查找并终止所有僵尸进程的父进程
ps -eo pid,ppid,stat,cmd | grep -E "Z" | awk '{print $2}' | xargs kill -9
# 查看系统资源使用概况
free -h && echo "---" && df -h && echo "---" && uptime
# 查看所有 TCP 连接状态统计
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
# 监控 .NET 应用的内存使用
watch -n 2 "ps -eo pid,rss,cmd | grep dotnet | sort -k2 -rn"
# 快速查看系统负载
uptime
# 查看某个进程的详细信息
cat /proc/1234/status总结
进程和端口管理是 Linux 运维的核心技能。掌握 ps、netstat、lsof、systemctl 等命令可以快速定位服务问题和端口冲突。
关键知识点
- 部署类主题的核心不是“装成功”,而是“稳定运行、可排障、可回滚”。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
适用场景
- 当你准备把《进程和端口管理》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
落地建议
- 固定版本号与镜像标签,避免“latest”带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
复盘问题
- 如果把《进程和端口管理》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《进程和端口管理》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《进程和端口管理》最大的收益和代价分别是什么?
