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

2024-10-31 08:38:00
admin
原创
218
摘要:问题描述:你好,我正在尝试让 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用