守护进程(Daemon Process)是 Unix/Linux 系统中在后台长期运行的特殊进程,核心作用是提供系统级服务(如网络服务、定时任务、日志收集等),独立于终端控制、不与用户交互,生命周期通常与操作系统一致(系统启动时启动,关机时终止)。
可以通俗理解为:守护进程是系统的“后台服务员”,默默在后台干活,不需要用户盯着,也不会因为用户关闭终端而停止工作。
一、守护进程的核心特征
- 脱离终端(Terminal):不依赖任何用户终端,即使启动它的终端关闭,进程依然运行(避免终端退出时收到
SIGHUP信号被终止)。 - 在后台运行(无前台交互):进程状态标记为“后台进程”(
ps命令中状态显示为D/R/S,无终端关联),不会占用终端输入输出。 - 生命周期长:通常在系统启动时由
init进程(或systemd等初始化系统)启动,直到系统关机才终止,期间持续提供服务。 - 以超级用户(root)或专用用户身份运行:多数守护进程需要系统权限(如监听 1-1023 端口),或为了安全隔离,使用专用用户(如
nginx、mysql用户)运行。 - 无控制终端(TTY):
ps -ef命令中,守护进程的TTY列通常显示为?,表示无关联终端。
二、常见的守护进程示例
日常使用 Linux 时,很多基础服务都是通过守护进程实现的:
- 网络服务:
nginx(Web 服务器)、sshd(SSH 远程登录服务)、httpd(Apache 服务器); - 数据库服务:
mysqld(MySQL 数据库)、mongod(MongoDB 数据库); - 系统服务:
crond(定时任务服务)、syslogd(日志收集服务)、firewalld(防火墙服务); - 其他:
docker(容器服务)、redis-server(Redis 缓存服务)。
三、守护进程与普通进程的核心区别
| 对比维度 | 守护进程 | 普通进程(如 ls、python script.py) |
|---|---|---|
| 运行位置 | 后台长期运行 | 前台运行(默认),终端关闭则终止 |
| 终端关联 | 无(TTY=?) | 关联启动它的终端(如 TTY1、pts/0) |
| 生命周期 | 与系统一致(长) | 任务完成后立即终止(短) |
| 交互性 | 无(不接收用户输入) | 可与用户交互(如读取终端输入) |
| 启动方式 | 系统初始化(如 systemd)、nohup 命令 | 终端直接执行、脚本调用 |
四、守护进程的创建逻辑(简单原理)
手动编写守护进程时,核心是通过一系列步骤“脱离终端、后台化”,关键步骤包括:
- 创建子进程,父进程退出:父进程退出后,子进程被
init进程(PID=1)收养,脱离原终端控制; - 子进程创建新会话(setsid()):脱离原进程组,成为新会话的首领,彻底与终端解绑;
- 设置工作目录(chdir()):通常切换到根目录(
/),避免占用其他挂载目录(如U盘挂载目录)导致无法卸载; - 重定向文件描述符:将标准输入(0)、标准输出(1)、标准错误(2)重定向到
/dev/null(避免占用终端IO); - 忽略无关信号:如
SIGHUP(终端挂起信号)、SIGINT(Ctrl+C 中断信号),避免被意外终止。
(注:实际开发中,Linux 提供 daemon() 函数可直接将进程转为守护进程,无需手动实现上述步骤。)
五、如何管理守护进程(常用操作)
在 Linux 中,通过 systemd(主流系统如 CentOS 7+、Ubuntu 16+)管理守护进程最常见:
- 启动守护进程:
systemctl start nginx(启动 nginx 守护进程); - 停止守护进程:
systemctl stop nginx; - 查看状态:
systemctl status nginx(可看到是否在运行、PID 等); - 设置开机自启(与系统生命周期绑定):
systemctl enable nginx; - 禁止开机自启:
systemctl disable nginx。
此外,也可通过 nohup 命令将普通进程临时转为“准守护进程”(后台运行,终端关闭不终止):
nohup python my_service.py & # 后台运行 Python 脚本,终端关闭后仍继续执行
总结
守护进程是 Linux 系统的“后台核心服务载体”,核心特点是脱离终端、长期后台运行、提供系统级服务。它与普通进程的本质区别是“是否依赖终端”和“生命周期长度”,日常管理主要通过 systemd 等工具实现启动、停止、开机自启等操作。
770

被折叠的 条评论
为什么被折叠?



