デバッグ:コンソール出力とUpstartスクリプト


16

Pythonコードでトレースバックを見つけるために、どのようにupstartスクリプトの出力をターミナルに送信しますか?かつてほんの数秒であったトレースバックなしで、私は永遠に物事をするようになりました。エラーを追跡するために、いくつかのファイル書き込み呼び出しを行う必要があります。トレースバックで2番目に見つけたのは、数分でした。これは悲惨です。これは数週間続いていますが、うんざりです。これについて話してください。私は再びデバッガなしでアセンブリを使用しているように感じます。

回答:


27

Upstart 1.4以降を使用している場合はconsole log、Upstartジョブに投入すると、stdout / stderrへのすべての出力がになり/var/log/upstart/<job>.logます。その後tail -f /var/log/upstart/<job>.log &、ターミナルに出力を表示させることができます。


パーティーには少し遅れたが、この答えは私を救った:)また、upstart confファイルに特別な設定をしなくても、この方法でうまくいくように見える。私の側では、これが受け入れられた答えになるはずです。
rslite

upstart管理サービスログがにあることを知りませんでした/var/log/upstart。本当に便利です、ありがとう。
フランシスコ

2

Upstart Cookbookには、デバッグ手法に関するセクション全体があります。最も簡単な--debug方法は、カーネル引数に追加することです。これにより、upstartの冗長性が高まり、すべてがsyslogにダンプされます。はい、デバッグは複雑です。これは、並列化されたinitシステムを作成するために必要な正味の複雑さを反映しています。改善の余地があると確信しています。


2
クックブックでは、デバッグ環境を新しいユーザーに適切に説明していません。以前にも同様の説明を見たことがあります。不足している、または教祖の仮定があります。コミュニティに追加して、始めたばかりの人にとっては非常にイライラします。アセンブリを除き、エラーが発生するコード行を提供しなかったプログラミング環境に遭遇したことはありません。アセンブリを使用すると、ホイールを再発明することができます。
bambuntu

さて、あなたは何を提案しますか?開いているドキュメントです。あなたがそこに提示されているものよりも飛躍的なデバッグ技術を持っているなら、それを追加してください。OPの問題は、選択した追加ランタイム内で基本的なUNIXパラダイムを管理する方法を理解していないことと、それがデプロイされているコンテキストの結果です。Pythonまたは[ここに豪華なランタイム言語を挿入]基本的なランタイムであるUNIXを無視してください。
ペペラキ

2

pythonデーモンを作成すると、すべての例外をキャッチして、ログファイルにスローします。デバッグだけでなく、本番でも使用しています。毎朝実行する小さなスクリプトがあり、ログに動揺する何かを探します。

もちろん、デーモンを実行し続けるのにも役立ちます。

いくつかのサンプルコード(面白くない部分を削除します):

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename=LOG_FILE,
                    filemode='w')
    logging.info("Sincrod inicializado")
    if not DEBUG:
        daemonize()
    while True:
        try:
            actua()
        except:
            logging.error(sys.exc_info())
        if (datetime.datetime.now().hour > NOITE_EMPEZA\
         and datetime.datetime.now().hour < NOITE_REMATA):
            time.sleep(INTERVALO_NOITE)
        else:
            time.sleep(INTERVALO_DIA)

ここで、actua()は実際のデーモンです(ログにも書き込みます)。また、設定ファイルにDEBUG変数があります。これがTrueの場合、コンソールで実行されるようにデーモンをフォークしません。

デーモン

デーモンは、Windowsサービスに相当するUNIXです。これらは、他のプロセスから独立したバックグラウンドで実行されるプロセスです。つまり、彼らの父親は通常initであり、どのttyからも切り離されています。それらは独立しているため、出力を配置するための事前定義された場所はありません。

デーモンを作成するためのPythonライブラリとスニペットがたくさんあります。上記の例では、Steinar KnutsensバージョンとJeff Kuncesバージョンのアイデアを組み合わせた独自の関数を使用しています。それは可能な限り単純です、私は二度フォークすることに注意してください。

def daemonize():
    """Forks this process creating a daemon and killing the original one"""
    if (not os.fork()):
        # get our own session and fixup std[in,out,err]
        os.setsid()
        sys.stdin.close()
        sys.stdout = NullDevice()
        sys.stderr = NullDevice()
        if (not os.fork()):
            # hang around till adopted by init
            ppid = os.getppid()
            while (ppid != 1):
                time.sleep(0.5)
                ppid = os.getppid()
        else:
            # time for child to die
            os._exit(0)
    else:
        # wait for child to die and then bail
        os.wait()
        sys.exit()

まぁ、いいよ。すでにsyslogにログを記録しているので、デーモンメッセージを除外してコンソールにダンプするだけです。なぜこれが新興企業に特有なのかわかりませんか?SysV initでも同じ問題が発生します。
ペペラキ

実のところ、私のサーバーのほとんどは8.04を実行しているので、新興企業ではありません。しかし、それは新興企業にも有効です。OPは、upstartでのみ動作するメソッドではなく、upstartでpythonスクリプトをデバッグする方法を尋ねていました。私はsyslogではなく特定のファイルにログを記録していますが、ここでの「トリック」はすべての例外をキャッチし、スタックトレースをそのファイルにダンプしています。
ハビエルリベラ

まあ、それはコンテキストに基づいて標準出力を管理しているだけですか?私は、ttyに接続されているか、デーモンとして機能しているかに関係なく、同等のロギング詳細度を持つ多くのUNIXデーモンを知っています。これがRubyの場合、例外が出力に使用する基本クラスメソッドをオーバーライドまたは装飾します。Pythonでも同様のことができると確信しています。適切なスタック交換についてこの質問をする方が良いかもしれません。これはより基本的なUNIXデーモンのコーディング/設計の問題であり、あなたが述べたように、initスクリプトとは関係ありません。
ペペラキ

私はまだ専門用語に精通しています。デーモンとは、バックグラウンドで実行される特定のスクリプトを意味すると思います。あなたのコードでは、actua()の代わりにスクリプトを置いて、そのスクリプト呼び出しのコールバックを取得しますか?とにかく、ファイルの代わりにコンソールにチャネルする方法はありますか?
bambuntu

1
スタンドアロンの意味でのデーモンは通常、起動されたttyから切り離され、stdin、stdout、およびstdinの元のファイルハンドルを閉じ、initの子です。そのため、特定の場所に例外を出力する場合は、例外の出力方法を確認し、そこから例外を送信します。linfo.org/daemon.html。繰り返しますが、これは新興企業とは関係ありません。あなたのプログラムが真のデーモンモードで正常に機能して取得し、その後、それを成り上がり移動します。
ペペラキ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.