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

Linux守护进程详解

什么是守护进程?

守护进程(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守护进程。

相关文章:

  • 【信息系统项目管理师-案例真题】2022下半年案例分析答案和详解
  • 算法的数学基础
  • 泛微OA编写后端Rest接口
  • 消息队列-持续更新中
  • leetcode刷题记录(一百零八)——322. 零钱兑换
  • 【Python项目】基于Django的医疗领域用户问答意图识别系统
  • HTML应用指南:利用GET请求获取全国泸溪河门店位置信息
  • 如何利用 Vue 的生命周期钩子进行初始化和清理操作?
  • 第30篇 基于ARM A9处理器用C语言实现中断<六>
  • 文本分类与情感分析算法
  • nodejs npm install、npm run dev运行的坎坷之路
  • 华为昇腾服务器固件Firmware、驱动Drive、CANN各自的作用与联系?
  • 下载或者引入库
  • 14.7 LangChain Experimental 模块解析:解锁 Auto-GPT 开发新范式
  • 【Python】03-Python语法入门
  • 如何通过Origins公链推动边缘计算的物联网应用
  • 【Spring中事务的传播行为有哪些?】
  • go 并发 gorouting chan channel select Mutex sync.One
  • 大语言模型:从开发到运行的深度解构
  • WPF 中显示图形的方式深度解析
  • 权威访谈丨国家疾控局就《世界卫生组织大流行协定》答记者问
  • 改造老旧小区、建立“一张图”,五部委将多举措支持城市更新
  • 牛市早报|年内首次存款利率下调启动,5月LPR今公布
  • MiniMax发布新一代语音大模型
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等
  • 完善劳动关系协商协调机制,《共同保障劳动者合法权益工作指引》发布