私の計画は、タイトルが示すとおりのスクリプトを提供することです。以下に説明するアイデアがあります。何かが悪い/ばかげていると思われる場合は、建設的なコメント、改善などに感謝します.
デーモンとして開始したいサービスが 2 つあります。1 つは必須 (キャッシュ サービス)、もう 1 つはオプション (キャッシュ サービスへの http アクセス) です。argparse
モジュールを使用--port
してキャッシュ サービス ポートを取得し、オプション--http-port
で http アクセスを取得します。私はすでにこれを持っていて、うまくいきます。次に、デーモンを開始します。サービスはツイストに基づいているため、リアクター ループを開始する必要があります。これまでのところ、2 つの異なるプロセスが必要です。1 つはサービス用で、もう 1 つは http アクセス用です (ただし、単一の非同期プロセスで実行できることはわかっています)。
ツイスト サービスの開始はリアクター ループ (まだ使用していないため、シェル スクリプトではなく Python コード) を介して行われるため、サブプロセス (プロセスを開始するにはコマンド ライン コマンドが必要) よりもtwistd
使用の方が優れていると思います。os.fork
. os.fork
デーモンとタッチservice.pid
とファイルを起動するために使用できますhttp.pid
が、os.fork が子に対して 0 を返すため、子 pid にアクセスする方法がわかりません。
したがって、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
私はそれを実行します:
./run.py 8001 # with main service only
また:
./run.py 8001 --http-port 8002 # with additional http
システムのシャットダウンは、単一のシェル スクリプトを介して実行されます。
#!/bin/bash
function close {
f="$1.pid"
if [ -f "$f" ]
then
kill -s SIGTERM `cat "$f"`
fi
}
close http
close service