0

Python os.execl* 関数を使用して、セルフ プロセス (web2py を実行) を bind ip address などの別のパラメーターに置き換えたいと考えています。実際に見つけたインスタンスを置き換えることは成功しましたが、元のプロセスをKILLするのではなく、新しい子プロセスを作成するだけでした。たとえば、元の web2py プロセスは 10.1.1.1:8000 で実行されています。次に、ページのコントローラーで実行され、

os.execl('python', 'python', 'web2py.py', '--ip=10.1.1.2', '--port=8000', '--password=')

これで、10.1.1.2:8000 で Web ページを開くことができます。しかし、同じプロセスで再び 10.1.1.1:8000 に戻すと、. 新しいプロセスは、ポートが別のプロセスによって使用されていると不平を言います。

自分でweb2pyサービスを「更新」する別の方法はありますか?

4

1 に答える 1

1

os.execl現在のプロセスを置き換えていますが、開いているポートを保持しています。「ポートは別のプロセスで使用されています」というエラー メッセージは正しくありません。実際には現在のプロセスで使用されています。

execUnix では、fd が で close-on-exec とマークされていない限り、開いているファイル記述子は への呼び出し全体で継承されますFD_CLOEXEC。これはhttp://bugs.python.org/issue12107で問題として指摘されています。

プロセスを再実行する前にポートを閉じるよう web2py に指示するか、fcntlモジュールを使用して fd を close-on-exec としてマークする必要があります。

fcntl.fcntl(socket, fcntl.F_SETFD, fcntl.fcntl(socket, fcntl.F_GETFD) | fcntl.FD_CLOEXEC)
于 2012-07-23T09:47:34.187 に答える