2

[編集]

デバッグする必要があるリモート サーバーに Python アプリがあります。アプリをローカルで実行すると、監視する必要があるデバッグ情報 (Python トレースバックを含む) が出力されます。

jeremyのおかげで、tail -Fを使用して出力ファイルを監視し、彼のコードを調べたところ、彼のコマンドの次のバリエーションが見つかりました。

ssh root@$IP 'nohup python /root/python/run_dev_server.py &>> /var/log/myapp.log &'

これにより、必要なもの、ログイン情報、python トレースバックがほぼ正確に取得されますが、必要な python からの印刷を使用して表示される情報は取得されません。

だから私も彼のコマンドを試しました:

ssh root@$IP 'nohup python /root/python/run_dev_server.py 2>&1 >> /var/log/myapp.log &'

印刷からのプログラムの出力とログ情報をファイルに記録しますが、すべてのトレースバックが失われるため、python 例外をデバッグできません。

アプリによって生成されたすべての情報を取得する方法はありますか?

ご提案いただきありがとうございます。

4

1 に答える 1

2

次のようなことをお勧めします。

/usr/bin/nohup COMMAND  ARGS 2>&1 >> /var/log/COMMAND.log &
/bin/echo $! > /var/run/COMMAND.pid

nohup は、端末/ssh セッションが閉じられた後もプロセスを維持します。>> は、後で「tail -f」を実行できるように、すべての stdout と stderr を /var/log/COMMAND.log に保存します。

スタック トレースの出力 (標準出力に出力するか、電子メールで送信するなどの操作を行うことができます) を取得するには、Python コードに次の行を追加します。

    システムをインポート
    トレースバックのインポート
    _old_excepthook = sys.excepthook
    def myexcepthook(exctype, value, tb):
            # if exctype == KeyboardInterrupt: # キーボード イベントを処理する
            # 今のところ stdout に出力しますが、ここで電子メールまたは何かを送信できます。
            print traceback.print_tb(tb);
            _old_excepthook(exctype, value, traceback)
    sys.excepthook = myexcepthook

これにより、すべての例外がキャッチされます(キーボード割り込みを含むため、注意してください)

于 2012-11-02T20:24:35.083 に答える