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

2024-05-29 04:39:17 发布

您现在位置:Python中文网/ 问答频道 /正文

你好

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

在web上有几种解决方案,如:

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

A well-behaved Unix daemon process is tricky to get right, but the required steps are much the same for every daemon program. A DaemonContext instance holds the behaviour and configured process environment for the program; use the instance as a context manager to enter a daemon state.

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守护进程”吗?


Tags: theimportecho脚本eventsignalfooubuntu
2条回答

假设您的守护进程有某种持续运行的方式(一些事件循环、twisted等等),那么您可以尝试使用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 conf说的是在重新启动时启动这个服务,如果它死了也重新启动它。

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

洛顿的回答很好。这里有一个轻微的改进,仅仅因为我花了大量的时间调试。我需要做一个新的答案,这样我可以正确的格式。

我花了很多时间调试的其他几点:

  1. 当失败时,首先检查/var/log/upstart/.log
  2. 如果脚本使用python-daemon实现守护进程,则不使用“expect daemon”节。没有“期望”的工作。我不知道为什么。(如果有人知道为什么-请张贴!)
  3. 另外,继续检查“initctl status script”以确保您已启动(启动/运行)。(并在更新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

相关问题 更多 >

    热门问题