Python脚本后台运行如何守护进程

wen 实用脚本 2

本文目录导读:

Python脚本后台运行如何守护进程

  1. 使用系统自带的nohup命令
  2. 使用supervisor进程管理工具
  3. 使用systemd服务
  4. 使用Python的daemon库
  5. 手动实现守护进程
  6. 使用screen/tmux会话
  7. 推荐方案

在Linux系统中,有多种方法可以让Python脚本以守护进程方式后台运行,以下是几种常用方案:

使用系统自带的nohup命令

最简单的守护进程方式:

# 基本用法
nohup python3 script.py > output.log 2>&1 &
# 解释:
# nohup:忽略挂断信号
# > output.log:重定向标准输出
# 2>&1:重定向错误输出到标准输出
# &:后台运行

查看进程:

ps aux | grep script.py

使用supervisor进程管理工具

安装supervisor:

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

创建配置文件 /etc/supervisor/conf.d/your_script.conf

[program:your_script]
command=python3 /path/to/script.py
directory=/path/to/script
user=your_user
autostart=true
autorestart=true
stderr_logfile=/var/log/your_script.err.log
stdout_logfile=/var/log/your_script.out.log

启动管理:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start your_script

使用systemd服务

创建服务文件 /etc/systemd/system/your_script.service

[Unit]
Description=Your Python Script
After=network.target
[Service]
Type=simple
User=your_user
WorkingDirectory=/path/to/script
ExecStart=/usr/bin/python3 /path/to/script.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

启用和管理:

sudo systemctl daemon-reload
sudo systemctl enable your_script.service
sudo systemctl start your_script.service
sudo systemctl status your_script.service

使用Python的daemon库

安装daemonize:

pip install python-daemon

脚本示例:

import daemon
import time
import logging
def run():
    logging.basicConfig(filename='/var/log/daemon.log', level=logging.INFO)
    while True:
        logging.info("Daemon is running...")
        time.sleep(10)
if __name__ == "__main__":
    with daemon.DaemonContext():
        run()

手动实现守护进程

import os
import sys
import time
def daemonize():
    # 第一次fork
    pid = os.fork()
    if pid > 0:
        sys.exit(0)  # 父进程退出
    # 创建新会话
    os.setsid()
    # 第二次fork
    pid = os.fork()
    if pid > 0:
        sys.exit(0)
    # 修改工作目录
    os.chdir('/')
    # 设置文件权限掩码
    os.umask(0)
    # 关闭文件描述符
    sys.stdout.flush()
    sys.stderr.flush()
    # 重定向标准文件描述符到/dev/null
    devnull = os.open('/dev/null', os.O_RDWR)
    os.dup2(devnull, sys.stdin.fileno())
    os.dup2(devnull, sys.stdout.fileno())
    os.dup2(devnull, sys.stderr.fileno())
# 使用
if __name__ == "__main__":
    daemonize()
    # 你的主逻辑
    while True:
        # 执行任务
        time.sleep(10)

使用screen/tmux会话

# 安装
sudo apt-get install screen  # 或 tmux
# 使用screen
screen -S mysession
python3 script.py
# Ctrl+A, D 分离会话
# 重新连接
screen -r mysession
# 使用tmux
tmux new -s mysession
python3 script.py
# Ctrl+B, D 分离
# 重新连接
tmux attach -t mysession

推荐方案

  • 简单需求:使用 nohup + &
  • 生产环境:使用 supervisorsystemd
  • 开发调试:使用 screentmux
  • 需要复杂控制:使用 python-daemon

选择哪种方案取决于你的具体需求和环境。

抱歉,评论功能暂时关闭!