温馨提示×

linux如何守护进程

小樊
45
2026-08-20 13:27:36
栏目: 智能运维

在 Linux 中,守护进程(Daemon)通常是后台运行、无终端、生命周期长的进程。下面从概念 → 常见实现方式 → 推荐做法给你一个完整说明。


一、什么是守护进程

守护进程一般具备以下特点:

  • 在后台运行(不占用终端)
  • 父进程是 init / systemd(PID 1)
  • 脱离终端(tty)
  • 通常无标准输入
  • 输出重定向到日志或 /dev/null

示例:

ps -ef | grep nginx

二、传统方式:手动创建守护进程(fork + setsid)

原理

通过以下步骤脱离终端:

  1. fork() 创建子进程
  2. 父进程退出
  3. 子进程调用 setsid() 创建新会话
  4. 再次 fork()(可选)
  5. 重定向标准输入/输出/错误
  6. 改变工作目录
  7. 重设文件权限掩码

示例(C 语言)

#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>

void daemonize() {
    pid_t pid;

    pid = fork();
    if (pid < 0) exit(1);
    if (pid > 0) exit(0);   // 父进程退出

    setsid();               // 创建新会话

    pid = fork();
    if (pid < 0) exit(1);
    if (pid > 0) exit(0);   // 再次 fork

    chdir("/");             // 改变工作目录
    umask(0);               // 重置文件权限掩码

    freopen("/dev/null", "r", stdin);
    freopen("/dev/null", "w", stdout);
    freopen("/dev/null", "w", stderr);
}

int main() {
    daemonize();
    while (1) {
        sleep(10);
    }
}

三、Shell 方式:简单后台运行(不推荐生产)

./my_program &

nohup ./my_program > app.log 2>&1 &

⚠️ 缺点:

  • 不自动重启
  • 系统重启后失效
  • 不是严格意义上的守护进程

四、现代推荐方式:systemd(✅ 最常用)

1️⃣ 创建 service 文件

sudo vim /etc/systemd/system/mydaemon.service

2️⃣ 示例配置

[Unit]
Description=My Daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/mydaemon
Restart=always
User=myuser
WorkingDirectory=/usr/local/bin
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

3️⃣ 常用命令

sudo systemctl daemon-reload
sudo systemctl start mydaemon
sudo systemctl enable mydaemon
sudo systemctl status mydaemon

✅ 优点:

  • 自动重启
  • 开机自启
  • 日志管理(journalctl)
  • 安全、标准

五、使用 supervisor(适合多进程)

sudo apt install supervisor

配置:

[program:mydaemon]
command=/usr/local/bin/mydaemon
autostart=true
autorestart=true
stdout_logfile=/var/log/mydaemon.log

六、不同方式对比

方式 是否推荐 说明
fork + setsid 底层原理,现代很少手写
nohup + & ⚠️ 临时测试
systemd ✅✅✅ 生产环境首选
supervisor 多进程管理

七、常见守护进程示例

  • sshd
  • nginx
  • cron
  • dockerd

八、如何判断一个进程是否是守护进程?

ps -ef | grep mydaemon

守护进程通常:

  • 父进程是 1
  • 没有 tty(?

如果你愿意,可以告诉我:

  • ✅ 你用的是 CentOS / Ubuntu / Debian
  • ✅ 是 Shell / Python / C / Java
  • ✅ 是否需要 开机自启 + 自动重启

我可以给你完全可复制的配置示例

0