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

2024-05-23

Hallo,

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

网络上存在多种解决方案,例如:

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

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

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ 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 \
        --user $USER --group $USER \
        -b --make-pidfile \
        --chuid $USER \
        --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 守护进程”吗?


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

下面是一个假设的 Python 服务的新贵配置示例:

description "My service"
author  "Some Dude <[email protected] /cdn-cgi/l/email-protection>"

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。上面的新贵conf说的是在重新启动时启动该服务,如果它死了也重新启动它。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 脚本作为 Linux 服务/守护进程 的相关文章

随机推荐

  • 将属性反序列化到预先存在的对象中

    是否可以使用任何标准序列化程序来反序列化对象属性 而无需创建新对象 问题是 所讨论的对象非常复杂 它们只能由特殊工厂创建 并且它们的类型是在运行时动态生成的 但它们有一些已知的属性 我想将它们存储在外部文件 最好是 xml 但二进制也可以
  • PHP 删除字符最后一个实例之前的所有内容

    有没有办法删除某个字符之前的所有内容 包括最后一个实例 我有多个字符串 其中包含 gt e g the gt cat gt sat gt on gt the gt mat welcome gt home 我需要对字符串进行格式化 以便它们变
  • 使用 kafka java api 的 Avro 序列化器和反序列化器

    Kafka Avro 序列化器和反序列化器无法工作 我尝试使用 kafka 控制台消费者消费消息 我可以看到发布的消息 public class AvroProducer
  • 具有条件连接和非匿名返回的 LINQ 查询

    我有一个针对 SQL Server 数据库的 LINQ 查询 该查询将每行的数据写入一个对象Person 在某些情况下 我想加入其他表并添加更多字段Person对象 同时利用 LINQ 延迟加载 The Person类看起来像这样 publ
  • 将数据从服务传递到活动

    我有自行运行的服务 服务自动启动 我有活动 在此 Activity 按钮中启动该方法DoIt Button setOnClickListener new OnClickListener public void onClick View v
  • jQuery 和面向对象的 JavaScript - 如何?

    我读了this http www sweetvision com 2009 07 07 how to use object oriented programming with jquery and this http archive plu
  • nuxt v2 和 firebase 函数的部署错误

    当我尝试在 firebase 函数中渲染 nuxt 时 出现 用户代码加载失败 无法确定后端规范 错误 其他功能都可以部署 但是无论模式是SSR还是SPA 只有nuxt功能失败 我查看了日志 没有发现任何有用的信息 当我查看 无法确定后端规
  • React Native FlatList 具有不同列数的替代行

    i want to have a FlatList which renders a single item on odd rows and 2 items on even rows 是否可以实现这种布局 抱歉 我还没有代码 FlatList
  • Azure Runbook 输出到电子邮件

    我正在尝试将 VM 状态的输出从 Azure 自动化 Runbook 发送到电子邮件中 我使用以下代码 function Send EMail Param Parameter Mandatory true String EmailTo Pa
  • 用于新 Windows 游戏项目的 OpenGL 或 Direct3D?或者是其他东西?

    我正在 Windows 上启动一个爱好游戏项目 该项目将大量使用 3D 图形效果 它很可能是用 C 编写的 我应该使用 OpenGL 还是 Direct3D 作为我的图形后端 为什么 或者我应该使用现成的图形引擎 例如OGRE 3D htt
  • numpy.empty 给出非空数组

    当我使用创建一个空的 numpy 数组时foo np empty 1 结果数组包含一个 float64 gt gt gt foo np empty 1 gt gt gt foo array 0 gt gt gt type foo 0
  • 在 Oracle 中使用数据透视表的建议

    我需要一份报告 我应该使用数据透视表 报告将按类别分组 使用 case when 语句不好 因为有很多类别 您可以将 Northwind 数据库视为示例 所有类别将显示为列和报告将显示客户在类别中的偏好 我不知道另一个解决方案 并在互联网上
  • 我们可以使用sql列出MS Access数据库中的所有表吗?

    我们可以使用 sql 找到 ms access 中的所有表吗 就像我们在 sql server 中所做的那样 select from sys tables 在sqlite中 SELECT FROM sqlite master where t
  • 如何在 XML 模式中正确使用 unique 和 keyref?

    我有这个 XML 架构 但我不知道如何完成它以实现我的需要 我在网上搜索了很多有关 unique 和 keyref 用法的信息 但我能找到的只是基本示例 这是我的架构
  • 从 elm 代码提交表单

    我有这个框架集划分 这是我的elm逻辑在里面main html import Html exposing import Html Attributes exposing view Model gt Html Msg view model H
  • CSS 动画延迟和关键帧

    我在 CSS 动画上遇到动画延迟问题 我有 3 张图片 我想将其制作为幻灯片 插图是 图像1到图像2需要15秒改变 图像2到图像3需要15秒改变 图像3回到图像1需要30秒 在第一个循环之后 我想让幻灯片结束于图像3 因此图像1到图像2仍然
  • WebSphere Camel JMS、spring、taskExecutor、haninging 线程

    我正在尝试将 Camel 与 WebSphere 集成 除了一件事之外 它工作得很好 场景如下 JMS WMQ gt 路由 转换 gt BEAN 执行 JPA OpenJPA1 2 DB2 提交 为了能够插入WAS事务管理器和mangaed
  • Hashmap 不适用于 int、char [重复]

    这个问题在这里已经有答案了 可能的重复 在 Java 集合中存储原始值 https stackoverflow com questions 2504959 storing primitive values in a java collect
  • pip 是否将软件包安装到我的 conda 环境中?

    如果我使用 conda create 命令创建了一个环境 那么我激活它 conda activate myEnv 现在 如果我想将带有 conda install 的包安装到 myEnv 但该包不在 conda 存储库中 所以我必须使用 p
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python