本文目录导读:

在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+& - 生产环境:使用
supervisor或systemd - 开发调试:使用
screen或tmux - 需要复杂控制:使用
python-daemon库
选择哪种方案取决于你的具体需求和环境。