启动2个守护程序的python脚本

2024-10-02 10:33:32 发布

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

我的计划是提供一个脚本,正如标题所述。我有一个想法,我将在下面详述。如果你觉得某件事听起来不好/很愚蠢,我会很感激你的任何建设性意见、改进等

有两个服务我想作为守护进程启动。一个是必需的(缓存服务),一个是可选的(对缓存服务的http访问)。我使用argparse模块获取{}以获取缓存服务端口,使用可选的--http-port获取http访问。我已经有了这个,而且很管用。现在我想启动守护进程。服务是基于twisted的,所以他们必须启动反应堆回路。到目前为止,我希望有两个不同的进程:一个用于服务,另一个用于http访问(尽管我知道它可能在单个异步进程中完成)。在

由于启动twisted服务是通过reactor循环完成的(这是python代码,而不是shell脚本,因为我还没有使用twistd),所以我认为使用os.fork比子进程(需要一个命令行命令来启动进程)好。我可以使用os.fork启动守护进程并触摸service.pid和{}文件,但我不知道如何访问子pid,因为os.fork操作系统返回子级的0。在

所以chld PID就是我缺少的。此外,如果任何东西看起来不合逻辑或过于复杂,请对此发表评论。在

我当前的代码如下:

#!/usr/bin/python
import argparse
import os

from twisted.internet import reactor

parser = argparse.ArgumentParser(description='Run PyCached server.')
parser.add_argument('port', metavar='port', type=int,
    help='PyCached service port')
parser.add_argument('--http-port', metavar='http-port', type=int, default=None,
    help='PyCached http access port')
args = parser.parse_args()

def dumpPid(name):
    f = open(name + '.pid', 'w')
    f.write(str(os.getpid()))
    f.flush()
    f.close()

def erasePid(name):
    os.remove(name + '.pid')

def run(name, port, factory):
    dumpPid(name)
    print "Starting PyCached %s on port %d" % (name, port)
    reactor.listenTCP(port, factory)
    reactor.run()
    erasePid(name)
    print "Successfully stopped PyCached %s" % (name,)

# start service (required)
fork_pid = os.fork()
if fork_pid == 0:
    from server.service import PyCachedFactory
    run('service', args.port, PyCachedFactory())
else:
    # start http access (optional)
    if args.http_port:
        fork_pid = os.fork()
        if fork_pid == 0:
            from server.http import PyCachedSite
            addr = ('localhost', args.port)
            run('http', args.http_port, PyCachedSite(addr))
        else:
            pass

我用的是:

^{pr2}$

或者:

./run.py 8001 --http-port 8002 # with additional http

系统关闭通过单个shell脚本完成:

#!/bin/bash

function close {
    f="$1.pid"
    if [ -f "$f" ]
    then
        kill -s SIGTERM `cat "$f"`
    fi    
}

close http
close service

Tags: runnameimporthttpparserclose进程os
1条回答
网友
1楼 · 发布于 2024-10-02 10:33:32

Since starting twisted service is done via reactor loop (which is python code, not a shell script, since I don't use twistd yet), I think that using os.fork is better than subprocess (which would need a command line command to start the process).

你应该用twisted。如果没有,那么您应该编写一个Python脚本来启动守护进程。然后应该使用subprocess模块(或reactor.spawnProcess)启动子进程。在

使用os.fork而不立即执行os.exec*函数之一的操作被破坏。由os.fork创建的父级和子级之间共享大量状态。你不能确定这种分享不会破坏某些东西(我可以告诉你,它会打破一些扭曲的东西)。在

以下是一些关于fork而不是exec问题的讨论链接,这些链接可以帮助您更好地了解这是一个多么麻烦的领域。在

相关问题 更多 >

    热门问题