1

我正在使用 Twisted 教程中的以下脚本(稍作修改):

from twisted.application import internet, service
from twisted.internet import reactor, protocol, defer
from twisted.protocols import basic
from twisted.web import client

class FingerProtocol(basic.LineReceiver):

    def lineReceived(self, user):
        d = self.factory.getUser(user)

        def onError(err):
            return "Internal server error"
        d.addErrback(onError)

        def writeResponse(message):
            self.transport.write(message + "\r\n")
            self.transport.loseConnection()
        d.addCallback(writeResponse)

class FingerFactory(protocol.ServerFactory):
    protocol = FingerProtocol

    def __init__(self, prefix):
        self.prefix = prefix

    def getUser(self, user):
        return client.getPage(self.prefix + user)

application = service.Application('finger', uid=1, gid=1)
factory = FingerFactory(prefix="http://livejournal.com/~")
internet.TCPServer(7979, factory).setServiceParent(
    service.IServiceCollection(application))

我保存finger_daemon.tac并运行

twistd -y finger_daemon.tac \ 
    -l /home/me/twisted/finger.log \
    --pidfile=/home/me/twisted/finger.pid

但当然它不会绑定到 79,因为它是一个特权端口。我也尝试使用 sudo 运行,没有区别。

然后我尝试将TCPServer端口更改为 7979,然后在运行时连接到守护程序

telnet 127.0.0.1 7979

我得到Connection Refused错误。这里具体是怎么回事?守护进程应该如何在 Twisted 中工作?

4

1 回答 1

1

当我运行此代码时,我看到以下日志消息:

2013-10-02 23:50:34-0700 [-] failed to set uid/gid 1/1 (are you root?) -- exiting.

然后twistd退出。所以你需要这样做sudo twistd,然后增加一大堆python路径管理问题......

为什么要设置uidandgid参数?你想以daemon用户身份运行它吗?你不需要为了守护进程而这样做。只需删除uid=1, gid=1参数即可Application使其对我有用。

于 2013-10-03T06:53:10.133 回答