Linux进程与服务管理完全指南:systemd/systemctl、ps/top/kill实操+后台/守护进程详解

7 阅读8分钟

一、系统服务管理核心:systemd 与 systemctl(现代 Linux 必备)

1. 为什么要用 systemd?

systemd 是目前 Ubuntu、CentOS、Fedora 等主流 Linux 发行版的默认初始化系统,替代了传统的 SysV init。它的优势很直观:

  • 并行启动服务,开机速度比传统方式快 50% 以上;

  • 按需激活服务,不用一直占用系统资源;

  • 统一管理服务、挂载点、定时任务,不用记多个命令;

  • 自带日志系统(journald),排查问题更方便。

简单说,systemd 是服务管理的 “后台框架”,systemctl 是操作这个框架的 “命令行工具” —— 就像电影院的放映机和遥控器,前者负责运转,后者负责操控。

2. systemctl 高频命令(实战必备)

(1)服务启停与重启

\ 启动服务(示例:Nginx)

systemctl start nginx

\ 停止服务

systemctl stop nginx

\ 重启服务(先停后启,适合修改配置后)

systemctl restart nginx

\ 重载配置(不中断服务,推荐优先用)

systemctl reload nginx

\ 不确定服务是否支持reload?用这个自动适配

systemctl reload-or-restart nginx

(2)开机自启管理

生产环境必备功能,避免服务器重启后服务失联:

\ 启用开机自启

systemctl enable nginx

\ 禁用开机自启

systemctl disable nginx

\ 启用并立即启动(一步到位)

systemctl enable --now nginx

\ 检查是否开机自启(输出enabled/disabled)

systemctl is-enabled nginx

(3)服务状态查询

排查服务故障的核心命令,能看到运行状态、进程 ID、最近日志:

\ 查看单个服务详情(最常用)

systemctl status nginx

\ 只判断是否在运行(输出active/inactive)

systemctl is-active nginx

\ 查看所有正在运行的服务

systemctl list-units --type=service

\ 查看所有失败的服务(快速定位问题)

systemctl --failed --type=service

(4)自定义服务配置(进阶实操)

如果需要将自己的应用(如 Java 程序、脚本)注册为系统服务,按以下步骤:

  1. 创建服务配置文件(优先级:/etc/systemd/system/ > /usr/lib/systemd/system/):
vim /etc/systemd/system/myapp.service
  1. 写入配置(以 Spring Boot 应用为例):
\[Unit]

Description=我的Spring Boot应用   服务描述

After=network.target   网络启动后再启动本服务

Wants=mysql.service   弱依赖MySQL,MySQL启动失败不影响本服务

\[Service]

User=appuser   运行服务的用户

WorkingDirectory=/opt/myapp   应用目录

ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar app.jar   启动命令

Restart=always   进程退出时自动重启

RestartSec=5   重启间隔5PrivateTmp=true   独立临时目录,提高安全性

\[Install]

WantedBy=multi-user.target   多用户模式下生效(类似传统运行级别3
  1. 生效配置并启动:
systemctl daemon-reload   修改配置后必须执行

systemctl enable --now myapp

systemctl status myapp   验证状态

3. 日志查询(搭配 journald)

systemd 集成的日志系统,不用单独装 rsyslog:

\ 实时查看服务日志(类似tail -f)

journalctl -u myapp -f

\ 查看最近200条日志

journalctl -u myapp -n 200 --no-pager

\ 按时间筛选(2025年11月22日之后的日志)

journalctl -u myapp --since "2025-11-22"

二、进程查询与控制:ps/top/kill 命令实操

1. ps 命令:静态查看进程(快照式)

ps(Process Status)用于查看当前系统的进程快照,适合快速排查特定进程。

常用参数组合:

命令功能适用场景
ps -ef查看所有进程的详细信息(用户、PID、父进程 ID 等)全局排查进程
ps -p 1234查看指定 PID(1234)的进程验证某个进程是否运行
ps -C nginx按进程名筛选(如 nginx)快速找到目标服务进程
ps -ef --sort=-%cpu按 CPU 使用率倒序排列定位 CPU 占用高的进程
ps -ef --sort=-%mem按内存使用率倒序排列定位内存泄漏进程

输出字段解析(以 ps -ef 为例):

  • PID:进程唯一 ID(操作进程的核心标识);

  • PPID:父进程 ID(谁启动了这个进程);

  • UID:进程所属用户(如 root、appuser);

  • C:CPU 使用率(最近统计周期的占比);

  • STIME:进程启动时间;

  • CMD:启动进程的命令(如 /java、/usr/sbin/nginx)。

示例:查找 nginx 进程并查看详细信息

ps -ef | grep nginx

2. top 命令:动态监控进程(实时更新)

top 是 “动态版 ps”,默认每 3 秒更新一次,适合实时观察系统资源占用情况。

基础用法:

\ 启动top(默认全局监控)

top

\ 每2秒更新一次,更新5次后退出

top -d 2 -n 5

\ 只监控指定用户(如appuser)的进程

top -u appuser

\ 只监控PID为12345678的进程

top -p 1234,5678

交互操作(启动 top 后按以下按键):

  • q:退出 top;

  • k:终止进程(输入 PID 后按回车,再输入 9 强制终止);

  • r:调整进程优先级(输入 PID 和新优先级,范围 - 20~19,-20 最高);

  • u:切换到指定用户的进程视图;

  • f:自定义显示字段(如添加 / 删除内存占用、进程状态等);

  • o:按指定字段排序(如按 CPU 排序选 “% CPU”)。

顶部状态栏解读(关键信息):

  • load average:1/5/15 分钟系统负载(如 0.09、0.06、0.10),负载值超过 CPU 核心数则可能卡顿;

  • %Cpu(s):us(用户空间占用)、sy(内核空间占用)、id(空闲率),id 越高资源越充裕;

  • MiB Mem:物理内存总大小、已用、空闲、缓存占用情况。

3. kill 命令:终止进程(强制结束异常进程)

kill 通过 PID 向进程发送信号,常用信号如下:

  • 15(默认):优雅终止(进程清理资源后退出);

  • 9:强制终止(立即杀死进程,不清理资源,用于无响应进程);

  • 1:重启进程(部分服务支持)。

常用命令:

\ 优雅终止PID为1234的进程

kill 1234

\ 强制终止PID为1234的进程(推荐优先用这个)

kill -9 1234

\ 终止所有nginx进程(结合ps使用)

kill -9 \$(ps -ef | grep nginx | grep -v grep | awk '{print \$2}')

\ 查看所有支持的信号

kill -l

三、后台进程与守护进程:区别与实操

1. 核心区别

类型后台进程守护进程
父进程终端进程(如 bash)init 进程(PID=1,systemd 就是 init 进程)
生命周期终端关闭则进程退出不受终端影响,系统关机才退出
终端关联依赖启动终端无终端关联(TTY 显示 “?”)
适用场景临时后台运行(如长时间下载)长期运行的服务(如 Nginx、MySQL)

2. 后台进程操作(临时任务)

(1)直接后台运行

在命令末尾加&,进程会在后台运行,终端可继续操作:

\ 后台运行wget下载(终端关闭则下载停止)

wget https://example.com/largefile.iso &

(2)查看后台进程

\ 查看当前终端的后台进程(jobs编号≠PID)

jobs

\ 显示后台进程的PID(推荐用这个)

ps -ef | grep \[命令关键词]

(3)前后台切换

\ 将后台进程切换到前台(%1表示jobs编号为1的进程)

fg %1

\ 将前台进程切换到后台(先按Ctrl+Z暂停,再执行bg)

Ctrl+Z

bg %1

(4)避免终端关闭导致进程退出

nohup命令(no hang up,不挂断),进程会忽略终端关闭信号:

\ 后台运行脚本,输出日志到nohup.out

nohup sh myscript.sh &

\ 自定义日志输出路径

nohup sh myscript.sh > /var/log/myscript.log 2>&1 &

3. 守护进程操作(长期服务)

守护进程是 “脱离终端的后台进程”,最推荐的方式是通过systemd 注册为系统服务(前文 “自定义服务配置” 已讲),此外也可以用nohup + &模拟,但稳定性不如 systemd。

实操案例:将 Python 脚本注册为守护进程

  1. 编写脚本(/opt/script/monitor.py):
import time

while True:

    with open('/var/log/monitor.log', 'a') as f:

        f.write(f"\[{time.strftime('%Y-%m-%d %H:%M:%S')}] 服务运行中...\n")

    time.sleep(60)   每分钟输出一次日志
  1. 创建 systemd 服务文件(/etc/systemd/system/monitor.service):
\[Unit]

Description=自定义监控脚本守护进程

After=network.target

\[Service]

User=root

WorkingDirectory=/opt/script

ExecStart=/usr/bin/python3 monitor.py

Restart=always

RestartSec=5

\[Install]

WantedBy=multi-user.target
  1. 启动并设置开机自启:
systemctl daemon-reload

systemctl enable --now monitor

systemctl status monitor

\ 查看日志验证

tail -f /var/log/monitor.log

四、常见问题排查(避坑指南)

  1. systemctl 启动服务失败:用systemctl status 服务名查看日志,重点看 “Failed” 提示,常见原因:配置文件语法错误、依赖服务未启动、权限不足。

  2. kill 不掉进程:用ps -ef | grep 进程名确认 PID 是否正确,若提示 “operation not permitted”,加sudo(如sudo kill -9 1234)。

  3. 后台进程终端关闭后退出:改用nohup + &或注册为 systemd 服务,避免直接用&

  4. top 显示 CPU 使用率 100%:按P排序 CPU 占用,找到高占用进程,用kill -9 PID终止,或排查程序是否有死循环。

(注:文档部分内容可能由 AI 生成)