当前位置: 首页 > 面试题库 >

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

慕佑运
2023-03-14
问题内容

哈o

我试图让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 \
        --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 <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。上面的新贵conf所说的是在重新启动时启动此服务,如果该服务终止,也将其重新启动。

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



 类似资料:
  • 问题内容: 我有一个脚本,该脚本每隔X次运行一次我的PHP脚本: 如何将其作为守护程序启动? 问题答案: 要将其作为完整的守护程序从Shell运行,您需要使用并重定向其输出。您可以将输出重定向到日志文件,也可以将其丢弃。假设您的脚本名为myscript.sh,请使用以下命令: 这会将进程与当前的shell(stdin,stdout和stderr)完全分开。如果要将输出保留在日志文件中,请用/ pa

  • 问题内容: 我有一个简单的Python脚本充当守护程序。我试图创建systemd脚本,以便能够在启动过程中启动此脚本。 当前的systemd脚本: node.py: 包含循环。 我尝试使用运行该服务。不幸的是,服务从未完成说明序列-我必须按Ctrl + C。脚本正在运行,但是状态为激活,一段时间后变为停用状态。现在我正在使用(但是在我尝试不使用它之前,症状是相似的)。 我应该为脚本实现一些其他功能

  • 问题内容: 我已经编写了一个Python脚本,该脚本检查特定的电子邮件地址并将新的电子邮件传递给外部程序。如何获得此脚本以执行24/7,例如在Linux中将其转换为守护程序或服务。我是否还需要一个永无休止的循环,还是仅需多次重新执行代码就可以完成? 问题答案: 您在这里有两个选择。 进行适当的 cron作业 来调用您的脚本。Cron是GNU / Linux守护程序的通用名称,该守护程序会根据您设置

  • 问题内容: 我需要将php脚本作为守护进程运行(等待说明并执行操作)。cron工作不会为我做这件事,因为需要在指令到达后立即采取措施。我知道由于内存管理问题,PHP并不是守护进程的最佳选择,但是由于种种原因,在这种情况下我必须使用PHP。我遇到了libslack的一个名为Daemon的工具(http://libslack.org/daemon),它似乎可以帮助我管理守护进程,但是最近5年没有任何更

  • 我有一个简单的Python脚本作为守护程序工作。我正在尝试创建systemd脚本,以便能够在启动期间启动此脚本。 当前systemd脚本: node.py: < code>run包含< code>while True循环。 我尝试使用< code > system CTL start zebra-node . service 运行此服务。不幸的是,服务从来没有完成状态序列-我必须按下Ctrl C。

  • 问题内容: 使Perl脚本作为守护程序在Linux中运行的简单方法是什么? 目前,这是在CentOS上。我希望它从系统启动,然后从系统关闭,因此一些集成也不错,但是我总是可以向添加一个自定义行。 问题答案: 最简单的方法是使用Proc :: Daemon。 或者,您可以执行Proc :: Daemon的所有操作: 分叉一个孩子并退出父进程。 成为会话负责人(将程序与控制终端分离)。 分叉另一个子进