Python 脚本作为 Linux 服务/守护进程

2024-10-31 08:38:00
admin
原创
83
摘要:问题描述:你好,我正在尝试让 python 脚本在 (ubuntu) Linux 上作为服务(守护进程)运行。网络上有几种解决方案,例如:http://pypi.python.org/pypi/python-daemon/一个行为良好的 Unix 守护进程很难正确运行,但每个守护程序所需的步骤大致相同。Dae...

问题描述:

你好,

我正在尝试让 python 脚本在 (ubuntu) Linux 上作为服务(守护进程)运行。

网络上有几种解决方案,例如:

http://pypi.python.org/pypi/python-daemon/

一个行为良好的 Unix 守护进程很难正确运行,但每个守护程序所需的步骤大致相同。DaemonContext 实例保存程序的行为和配置的进程环境;使用该实例作为上下文管理器进入守护进程状态。

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

然而,因为我想将我的 python 脚本与 ubuntu linux 专门集成,所以我的解决方案是与 init.d 脚本相结合

#!/bin/bash

WORK_DIR="/var/lib/foo"
DAEMON="/usr/bin/python"
ARGS="/opt/foo/linux_service.py"
PIDFILE="/var/run/foo.pid"
USER="foo"

case "$1" in
  start)
    echo "Starting server"
    mkdir -p "$WORK_DIR"
    /sbin/start-stop-daemon --start --pidfile $PIDFILE \n        --user $USER --group $USER \n        -b --make-pidfile \n        --chuid $USER \n        --exec $DAEMON $ARGS
    ;;
  stop)
    echo "Stopping server"
    /sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose
    ;;
  *)
    echo "Usage: /etc/init.d/$USER {start|stop}"
    exit 1
    ;;
esac

exit 0

在python中:

import signal
import time
import multiprocessing

stop_event = multiprocessing.Event()

def stop(signum, frame):
    stop_event.set()

signal.signal(signal.SIGTERM, stop)

if __name__ == '__main__':
    while not stop_event.is_set():
        time.sleep(3)

我现在的问题是这种方法是否正确。我是否需要处理任何其他信号?它会是一个“行为良好的 Unix 守护进程”吗?


解决方案 1:

假设你的守护进程有某种持续运行的方式(某些事件循环、扭曲等等),你可以尝试使用upstart

以下是假设的 Python 服务的 upstart 配置示例:

description "My service"
author  "Some Dude <blah@foo.com>"

start on runlevel [234]
stop on runlevel [0156]

chdir /some/dir
exec /some/dir/script.py
respawn

如果你将其保存为 script.conf,那么/etc/init你只需执行一次

$ sudo initctl reload-configuration
$ sudo start script

你可以用 来停止它stop script。上面的 upstart 配置项表示在系统重启时启动此服务,并且如果服务死机了也重新启动它。

至于信号处理 - 您的进程应该自然响应SIGTERM。默认情况下,除非您专门安装了自己的信号处理程序,否则应该处理此问题。

解决方案 2:

Rloton 的答案很好。这里只是做了一点改进,因为我花了很多时间进行调试。我需要做一个新的答案,这样我才能正确格式化。

另外还有几点我花了很长时间才调试出来:

  1. 当失败时,首先检查/var/log/upstart/.log

  2. 如果您的脚本使用python-daemon实现了守护进程,则不要使用“expect daemon”节。没有“expect”可以工作。我不知道为什么。(如果有人知道原因 - 请发帖!)

  3. 另外,请继续检查“initctl 状态脚本”以确保您已启动(启动/运行)。(并在更新 conf 文件时重新加载)

这是我的版本:

description "My service"
author  "Some Dude <blah@foo.com>"

env PYTHON_HOME=/<pathtovirtualenv>
env PATH=$PYTHON_HOME:$PATH

start on runlevel [2345]
stop on runlevel [016]

chdir <directory>

# NO expect stanza if your script uses python-daemon
exec $PYTHON_HOME/bin/python script.py

# Only turn on respawn after you've debugged getting it to start and stop properly
respawn
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用