当前位置: 首页 > article >正文

守护进程和nuhup、的区别

1. & 运行的进程 VS 守护进程

方式终端关闭后是否存活进程归属典型用途
command &否(默认),除非 nohupdisown仍属于当前 Shell临时后台任务
nohup command &(但仍可能受 SIGTERM 影响)仍属于当前用户的会话长时间运行任务
setsid command独立于终端守护进程
systemdsystemd 监管服务器服务

2. 让进程更接近守护进程

如果只是用 &,进程仍然是当前 Shell 的子进程,可能在终端关闭时收到 SIGHUP 信号而退出。

(1) 使用 nohup

nohup my_script.sh & 
  • nohup(No Hang Up)阻止 SIGHUP 影响进程,使其在终端关闭后仍运行。
  • 但进程仍在当前会话,如果用户 logout,可能仍会被终止。

(2) 使用 disown

my_script.sh & disown 
  • disown 让进程脱离 Shell 的作业控制,即使退出 Shell 也不会终止。
  • 但进程仍是当前会话的一部分,仍可能因 SIGTERM 退出。

(3) 使用 setsid 让进程完全独立

setsid my_script.sh 
  • setsid 让进程脱离终端,并创建新的会话(Session)。
  • 不会受 SIGHUP、终端关闭、Shell 退出影响,更接近真正的守护进程。

(4) 完整的守护进程方式(C 代码示例)

如果要创建真正的 Daemon(守护进程),通常需要:

  1. 创建新会话 (setsid()),脱离控制终端。
  2. 更改工作目录,避免锁定文件系统。
  3. 重定向标准输入/输出/错误,避免影响终端。
  4. 后台运行(fork 退出父进程),确保不会占用 Shell。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

void daemonize() {
    pid_t pid = fork();
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {  // 让父进程退出,子进程成为孤儿进程
        exit(EXIT_SUCCESS);
    }

    setsid();  // 创建新会话,脱离终端

    // 重定向标准输入、标准输出、标准错误
    int fd = open("/dev/null", O_RDWR);
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    close(fd);

    while (1) {
        sleep(10);  // 模拟长期运行的任务
    }
}

int main() {
    daemonize();
    return 0;
}
  • 这样进程真正独立,不会因终端关闭而退出。
  • 运行后可以用 ps aux | grep my_program 看到它仍在运行。

3. 如何管理守护进程?

如果想要更好的管理方式,可以使用:

  • systemd(推荐):写 systemd service 配置,自动管理守护进程。
  • supervisord:轻量级守护进程管理工具。
  • cron:用 @reboot 让进程开机自启。

http://www.kler.cn/a/525444.html

相关文章:

  • Leetcode:350
  • 【Redis】 String 类型的介绍和常用命令
  • CentOS 7 搭建lsyncd实现文件实时同步 —— 筑梦之路
  • MySQL备忘录
  • 正则表达式入门
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.20 极值追踪:高效获取数据特征的秘诀
  • 【高内聚】设计模式是如何让软件更好做到高内聚的?
  • JavaWeb学习-SpringBotWeb开发入门(HTTP协议)
  • 1.2 基于深度学习的底层视觉技术
  • 基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)
  • 如何创建一个 Vue 3 项目
  • eniops库中reduce函数使用方法
  • C#Object类型的索引,序列化和反序列化
  • 层次聚类构建层次结构的簇
  • 智能工厂能耗管理:Python助力节能增效
  • 真正的智能与那只蝴蝶
  • 后盾人JS--闭包明明白白
  • 人工智能 - 1
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.21 索引宗师:布尔索引的七重境界
  • sem_init的概念和使用案例
  • ollama的setup.exe和ollama-windows-amd64.zip区别
  • 网易有道开源 “子曰 - o1” 推理模型
  • Python动量策略实战:大幅跑赢市场的底层逻辑
  • 跑腿小程序/智能派单/系统派单/同城配送/校园跑腿/预约取件/用户端+骑手端【全开源】
  • 多线程进阶(一命通关)
  • 抠图神器,全离线使用,支持win和mac