3

TL; DRバージョン:Pasterに停止デーモンを要求すると、プロセスIDの追跡に使用する独自のファイルの読み取りに失敗します。

長いバージョン

WindowsVistaのPython2.7.1でPaster(pastescript 1.7.3)を実行しています。

私の最初の驚きは、単純なWebサイトを運営していることです。

>paster serve development.ini
Starting server in PID 15184.
serving on http://127.0.0.1:5000

同じディレクトリにpaster.pidファイルが見つかると思っていましたが、見つかりませんでした。奇数。気にしないで、そのプロセスを強制終了してやり直すことで、明示的にしましょう。

>paster serve development.ini --pid-file=my.pid
Starting server in PID 20884.
serving on http://127.0.0.1:5000

今回は、my.pidというファイルを作成します。別のコマンドウィンドウで、次のように入力できます。

 >type my.pid
 20884

Webサイトは正常に提供されており、タスクマネージャーはPID20884で実行されているPythonプロセスがあることを確認しています。

それでは、デーモンのステータスについて報告するように牧師に依頼しましょう。

>paster serve development.ini --status --pid-file=my.pid
PID None in my.pid is not running

>type my.pid
20884

奇数。my.pid内のPIDはNone、そうではないのに、であると主張します。

シャットダウンしましょう。

>paster serve --stop-daemon --pid-file=my.pid
PID in my.pid is not valid (deleting)

>type my.pid
The system cannot find the file specified.

そのため、my.pidを読み取ろうとしましたが、読み取れず、フラストレーションを感じて削除しました。

その間、デーモンは実行を続けます。

パスターデーモンを手動で強制終了する必要があります。これは、@LennartRegebroが同様の詳細ではない質問で推奨していることです。テストの一環としてこれを自動化したいので、よりクリーンなソリューションを見つけたいと思っています。

助言がありますか?

4

1 に答える 1

2

貼り付けスクリプトのソースコード(serve.py)から、PID読み取りメソッドで:

pid = read_pidfile(pidfile)
if pid:
    try:
        os.kill(int(pid), 0)
        return pid
    except OSError, e:
        if e.errno == errno.EPERM:
            return pid
return None

POSIX互換プラットフォームでは、シグナルとして0を指定すると、プロセスが動作しているかどうかがチェックされます。

ただし、Windowsでは、killシステムコールはありません。代わりにPythonが使用TerminateProcessします。os.killパスタスクリプトから行を削除するか、 Cygwin(Windows上のPOSIXレイヤー)やLinuxなどのPOSIX互換プラットフォームを使用します。

于 2011-06-24T09:03:23.627 に答える