python开发linux服务_Python脚本作为Linux服务/守护程序

Hallo,

I'm trying to let a python script run as service (daemon) on (ubuntu) linux.

On the web there exist several solutions like:

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.

However as I want to integrate my python script specifically with ubuntu linux my solution is a combination with an init.d script

#!/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

and in 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)

My question now is if this approach is correct. Do I have to handle any additional signals? Will it be a "well-behaved Unix daemon process"?

解决方案

Assuming your daemon has some way of continually running (some event loop, twisted, whatever), you can try to use upstart.

Here's an example upstart config for a hypothetical Python service:

description "My service"

author "Some Dude "

start on runlevel [234]

stop on runlevel [0156]

chdir /some/dir

exec /some/dir/script.py

respawn

If you save this as script.conf to /etc/init you simple do a one-time

$ sudo initctl reload-configuration

$ sudo start script

You can stop it with stop script. What the above upstart conf says is to start this service on reboots and also restart it if it dies.

As for signal handling - your process should naturally respond to SIGTERM. By default this should be handled unless you've specifically installed your own signal handler.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值