Linux小课堂: 守护进程与初始化进程服务详解
进程基础概念
在 Linux 系统中,运行中的程序称为进程(Process),可通过以下命令查看进程信息:
- 静态查看:
ps -o ppid,pid,tty,cmd- PPID(Parent Process ID):父进程标识符
- PID(Process ID):进程唯一标识符
- TTY:关联的终端设备(如
pts/0) - CMD:进程对应的程序名称
示例输出:
此例中,PPID PID TT CMD 6650 6661 pts/0 bash 6661 27042 pts/0 ps -o ppid,pid,tty,cmdps进程(PID=27042)的父进程是bash(PID=6661),两者均关联终端pts/0
动态查看:top 命令实时监控进程状态
关键细节:
- 进程生命周期受父进程控制(父进程终止时,子进程自动销毁)
- 终端关联进程(如
ps)随终端会话结束而终止
守护进程(Daemon)的核心特性
守护进程是 Linux 中的一类特殊后台进程,其特点包括:
1 ) 脱离终端控制:不与任何终端(如 TTY)关联
2 ) 持久化运行:在后台持续执行任务或等待事件触发,仅在系统关闭时终止,父进程为 PID=1 的初始化进程(仅系统关闭时终止)
3 ) 父进程固定:父进程为 PID=1 的初始化进程(如 systemd)
4 ) 命名规范:名称通常以 d 结尾,表示 daemon(如 systemd、httpd),表示 Daemon
5 ) 服务化角色:多数服务器软件(如 Web 服务、文件共享)以守护进程形式运行,故也称为 Service(服务)
6 ) 后台服务:等待分配任务,为系统或用户提供功能(如网络服务)
7 ) 类比扩展:
- Windows 中的等效概念为 Service(通过任务管理器或“服务管理”界面控制)
- 守护进程在系统启动时自动加载,用户可通过命令手动启停或重启
Linux 初始化进程服务演进
1 ) 系统启动流程
- BIOS/UEFI 启动 → 2. Bootloader 加载内核 → 3. 内核初始化 → 4. 初始化进程启动(如
systemd) → 5. 系统服务初始化
| 初始化服务 | 发行版时期 | 核心工具 |
|---|---|---|
| System V | CentOS 6及之前 | service 命令 |
| systemd | CentOS 7+及主流发行版 | systemctl 命令 |
验证 PID=1 进程:
ps aux | grep '^systemd' # 输出示例:
root 1 0.0 0.1 169000 5000 ? Ss Jan01 0:01 /usr/lib/systemd/systemd
2 ) 新旧初始化进程对比
| 功能 | 新版(systemd) | 旧版(System V) |
|---|---|---|
| 启动服务 | systemctl start <服务名> | service <服务名> start |
| 停止服务 | systemctl stop <服务名> | service <服务名> stop |
| 重启服务 | systemctl restart <服务名> | service <服务名> restart |
| 查看状态 | systemctl status <服务名> | service <服务名> status |
| 重载配置 | systemctl reload <服务名> | service <服务名> reload |
开机自启管理:
| 操作 | systemd 命令 | System V 命令 |
|---|---|---|
| 开机自启 | systemctl enable <服务名> | chkconfig <服务名> on |
| 禁用开机自启 | systemctl disable <服务名> | chkconfig <服务名> off |
| 查看自启服务列表 | systemctl list-unit-files --type=service | chkconfig --list |
| 查看自启状态 | systemctl is-enabled <service> | chkconfig --list <service> |
注意:
- System V 为 CentOS 6 及更早版本的默认初始化服务(如
init进程) - systemd 从 CentOS 7 起成为主流,管理所有守护进程和系统服务
查看所有服务状态:
sudo systemctl list-unit-files --type=service
输出示例:
UNIT FILE STATE
httpd.service enabled
smbd.service disabled
... (共293个服务)
STATE说明:
enabled:开机自启disabled:开机不启动
3 ) 查看系统服务示例
sudo systemctl list-unit-files --type=service
输出示例:
UNIT FILE STATE
httpd.service enabled
mysql.service disabled
... (共 293 个服务)
STATE 字段:
enabled:开机自启disabled:开机不启动
关键命令操作与代码示例
1 ) 方案1
管理守护进程服务
查看 nginx 服务状态
systemctl status nginx 设置 Docker 服务开机自启
systemctl enable docker 重载修改后的配置(不重启服务)
systemctl reload nginx
创建自定义守护进程(NestJS + TypeScript)
以下代码实现一个简单的守护进程,脱离终端独立运行:
// daemon-process.ts
import { spawn } from 'child_process';
import { daemonize } from 'daemonize-process'; // 1. 脱离终端控制
daemonize(); // 2. 持久化任务(示例:每 60 秒日志写入)
setInterval(() => { console.log(`[${new Date().toISOString()}] Daemon is running...`);
}, 60_000); // 3. 捕获异常防止退出
process.on('uncaughtException', (err) => { console.error('Daemon error:', err);
});
启动命令(后台运行):
nohup ts-node daemon-process.ts > /var/log/daemon.log &
注册为 systemd 服务
创建服务配置文件 /etc/systemd/system/custom-daemon.service:
[Unit]
Description=Custom NestJS Daemon Service [Service]
ExecStart=/usr/bin/ts-node /path/to/daemon-process.ts
Restart=always
User=root
WorkingDirectory=/path/to/app [Install]
WantedBy=multi-user.target
启用服务:
systemctl daemon-reload
systemctl enable custom-daemon
systemctl start custom-daemon
2 )方案2
NestJS服务作为systemd守护进程
步骤1:创建NestJS服务
// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); console.log('NestJS守护进程已启动,监听端口3000');
}
bootstrap();
步骤2:配置systemd服务文件
创建 /etc/systemd/system/nest-app.service:
[Unit]
Description=NestJS Daemon Service
After=network.target [Service]
User=nodeuser
WorkingDirectory=/path/to/nest-app
ExecStart=/usr/bin/npm run start:prod
Restart=always
RestartSec=3 [Install]
WantedBy=multi-user.target
步骤3:启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable nest-app # 开机自启
sudo systemctl start nest-app # 立即启动
sudo systemctl status nest-app # 验证状态
核心总结
- 进程是 Linux 中运行程序的实例,通过
ps/top查看。 - 守护进程(Daemon)是后台持久运行、脱离终端的特殊进程,为服务器核心组件。
- 初始化进程服务是系统启动的第一个进程(PID=1):
- 旧版:
System V(CentOS 6 及更早) - 新版:
systemd(CentOS 7+ 及主流发行版),统一管理所有守护进程。
- 旧版:
systemd核心命令:- 服务管理:
systemctl start|stop|restart|reload <服务名> - 自启控制:
systemctl enable|disable <服务名> - 状态查看:
systemctl status <服务名>或systemctl list-unit-files --type=service
- 服务管理:
技术要点凝练
- 守护进程通过脱离终端 + 父进程托管至 PID=1 实现持久化
systemd通过单元文件(.service)定义服务行为(如重启策略、工作目录)- 新旧服务命令需严格区分(如
systemctlvsservice)
