Linux守护进程详解

embedded/2025/2/24 4:02:38/

什么是守护进程?

守护进程(Daemon)是指在后台运行的进程,通常用于执行系统级的任务,如日志记录、定时任务、网络服务等。守护进程不与用户直接交互,且在系统启动时自动运行。

创建守护进程的基本步骤

  1. 创建子进程并退出父进程
  2. 创建新的会话并设置进程组ID
  3. 设置文件权限掩码
  4. 关闭不必要的文件描述符
  5. 处理信号
  6. 执行任务

使用 systemd 创建守护进程

systemd 是现代Linux系统中常用的初始化系统和服务管理器,可以方便地创建和管理守护进程。

安装 systemd

大多数现代Linux发行版默认已经安装了 systemd,但如果没有安装,可以使用包管理器进行安装:

# Debian/Ubuntu
sudo apt-get install systemd# CentOS/RHEL
sudo yum install systemd

创建 systemd 服务单元文件

  1. 创建服务单元文件

    /etc/systemd/system/ 目录下创建一个新的服务单元文件,例如 mydaemon.service

    sudo nano /etc/systemd/system/mydaemon.service
    
  2. 编辑服务单元文件

    在文件中添加以下内容:

    [Unit]
    Description=My Custom Daemon
    After=network.target[Service]
    ExecStart=/usr/bin/python3 /path/to/your/script.py
    Restart=always
    User=yourusername
    Group=yourgroupname
    Environment=PYTHONUNBUFFERED=1[Install]
    WantedBy=multi-user.target
    

    解释:

    • Description:服务的描述。
    • After:指定服务启动的顺序,这里表示在网络服务启动后启动。
    • ExecStart:指定启动服务的命令。
    • Restart:指定服务退出后是否自动重启。
    • UserGroup:指定运行服务的用户和组。
    • Environment:设置环境变量。
  3. 重新加载 systemd 配置

    sudo systemctl daemon-reload
    
  4. 启动服务

    sudo systemctl start mydaemon.service
    
  5. 设置开机自启动

    sudo systemctl enable mydaemon.service
    
  6. 检查服务状态

    sudo systemctl status mydaemon.service
    

使用 systemd 日志

systemd 提供了强大的日志管理功能,可以使用 journalctl 命令查看日志:

sudo journalctl -u mydaemon.service

使用 supervisord 创建守护进程

supervisord 是一个进程控制系统,允许其用户监控和控制一组进程。

安装 supervisord

# Debian/Ubuntu
sudo apt-get install supervisor# CentOS/RHEL
sudo yum install supervisor

配置 supervisord

  1. 创建配置文件

    /etc/supervisor/conf.d/ 目录下创建一个新的配置文件,例如 mydaemon.conf

    sudo nano /etc/supervisor/conf.d/mydaemon.conf
    
  2. 编辑配置文件

    在文件中添加以下内容:

    [program:mydaemon]
    command=/usr/bin/python3 /path/to/your/script.py
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/mydaemon.err.log
    stdout_logfile=/var/log/mydaemon.out.log
    user=yourusername
    

    解释:

    • command:指定启动服务的命令。
    • autostart:指定服务是否在 supervisord 启动时自动启动。
    • autorestart:指定服务退出后是否自动重启。
    • stderr_logfilestdout_logfile:指定标准错误和标准输出的日志文件。
    • user:指定运行服务的用户。
  3. 重新加载 supervisord 配置

    sudo supervisorctl reread
    sudo supervisorctl update
    
  4. 启动服务

    sudo supervisorctl start mydaemon
    
  5. 检查服务状态

    sudo supervisorctl status mydaemon
    

使用 nohup 创建守护进程

nohup 是一个简单的工具,可以使进程忽略挂起(SIGHUP)信号,从而在用户退出登录后继续运行。

使用 nohup

  1. 运行脚本

    nohup /usr/bin/python3 /path/to/your/script.py > /var/log/mydaemon.out.log 2>&1 &
    

    解释:

    • nohup:使进程忽略挂起信号。
    • > /var/log/mydaemon.out.log:将标准输出重定向到日志文件。
    • 2>&1:将标准错误重定向到标准输出。
    • &:将进程放到后台运行。
  2. 查看日志

    tail -f /var/log/mydaemon.out.log
    

总结

创建和管理守护进程有多种方法,systemd 是现代Linux系统中最常用的方法,提供了强大的功能和灵活的配置选项。supervisord 也是一个不错的选择,特别适用于需要精细控制进程的场景。nohup 则适用于简单的后台运行需求。

选择哪种方法取决于你的具体需求和系统的配置。希望这篇文章能帮助你更好地理解和使用Linux守护进程。


http://www.ppmy.cn/embedded/164742.html

相关文章

HDLBits ——> Building Larger Circuits

是滴,你没看错,最近在学习这玩意。没办法,又被换方向了。 hdlbits刷题链接参考答案链接 基本上这5个弄懂了,后面就可以独立写写简单的东西啦! count1k 构建一个计数器,其计数范围从0到999(包…

常用 Webpack Plugin 汇总

一、HtmlWebpackPlugin ⭐⭐⭐⭐⭐ 作用 自动生成 HTML 文件,并将打包后的 JavaScript、CSS 等资源自动注入到生成的 HTML 文件中。当打包文件名包含哈希值时,能避免手动引入资源的繁琐。 使用场景 单页或多页应用开发中,只要需生成 HTML…

线性模型 - Softmax 回归(参数学习)

本文,我们来学习Softmax 回归的参数学习,在开始之前,我们先了解一下“损失函数”、“风险函数”和“目标函数”这三个核心概念。 一、损失函数、风险函数、目标函数 1. 损失函数(Loss Function) 定义: 损…

力扣——划分字母区间

题目链接: 链接 题目描述: 思路: 要找到每一个字母的最大位置end,也是这一段的结尾位置在这个最大位置内的字母,如果存在某个字母的最大位置 更大,就更新end为更大的如果遍历到end,就说明这一…

深研究:与Dify建立研究自动化应用

许多个人和团队面临筛选各种网页或内部文档的挑战,以全面概述一个主题。那么在这里我推荐大家使用Dify,它是一个用于LLM应用程序开发的低代码,开源平台,它通过自动化工作流程的多步搜索和有效汇总来解决此问题,仅需要最小的编码。 在本文中,我们将创建“ Deepresearch”…

AI大模型(DeepSeek)科研应用、论文写作、数据分析与AI绘图学习

【介绍】 在人工智能浪潮中,2024年12月中国公司研发的 DeepSeek 横空出世以惊艳全球的姿态,成为 AI领域不可忽视的力量!DeepSeek 完全开源,可本地部署,无使用限制,保护用户隐私。其次,其性能强大&#xff…

【matlab代码】基于故障概率加权与多模态滤波的AUV多源融合导航

多模态容错滤波仿真,以AUV为背景。订阅专栏后可查看完整代码,如有程序定制需求,可联系作者。 文章目录 创新点MATLAB仿真代码运行结果说明创新点 贝叶斯故障概率模型 融合SINS/DVL/GPS历史残差,计算实时故障概率 P fault P_{\text{fault}}

TCP fast open

TCP Fast Open 复用 Cookie 快速恢复会话,减少 1 个 RTT 的延迟 传统 TCP 三次握手需 1.5 RTT才能传输应用数据,导致 HTTP 请求延迟较高 TCP Fast Open:为了解决传统 TCP 握手中的延迟问题,通过允许在首次 SYN 握手阶段携带应用数…