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

2024-10-31 08:38:00
admin
原创
55
摘要:问题描述:你好,我正在尝试让 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用