1

python-daemonを使用して、次のように出力する簡単なスクリプトを作成しましたsys.stdout

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import daemon
import sys
import time


def main():
    with daemon.DaemonContext(stdout=sys.stdout):
        while True:
            print "matt daemon!!"
            time.sleep(3)


if __name__ == '__main__':
    main()

スクリプトは、1つの大きな欠陥を除いて、期待どおりに機能します。シェルに入力しているときに入力が中断されます。

(daemon)modocache $ git clomatt daemon!!
matt daemon!!ne
matt daemon!! https://github.com/schacon/cowsay.git
(daemon)modocache $ 

出力を邪魔にならない方法で表示する方法はありますか?私は次のようなものを望んでいます:

(daemon)modocache $ git clo
matt daemon!! # <- displayed on new line
(daemon)modocache $ git clo # <- what I had typed so far is displayed on a new line

これがばかげた質問である場合は、すみません。シェルが一般的にどのように機能するかについてはあまり詳しくありません。

編集:明確化

このスクリプトをデーモン化して実行したい理由は、天気の更新を邪魔にならない方法でコンソールに出力するなど、シェル内からシェルユーザーに更新を提供したいからです。これを達成するためのより良い方法があれば、私に知らせてください。ただし、目的は、ブロックせずに、端末内から(たとえば、Growl通知を介してではなく)情報を表示することです。

4

4 に答える 4

2

デーモンプロセスは、定義上、バックグラウンドで実行する必要があります。したがって、ログファイルに書き込む必要があります。

したがって、出力をログファイルにリダイレクトするか(シェルリダイレクトまたはsysロギングデーモンに渡す)、Pythonコードでログファイルに書き込むようにします。

アップデート:

man write
man wall

http://linux.die.net/man/1/write、http://linux.die.net/man/1/wall _ _

于 2012-05-07T14:33:21.603 に答える
2

デーモンのログ ファイルに書き込むことは、おそらくベスト プラクティスです。しかし、stderr に書き込んで、織り交ぜられた行で上記の望ましい動作を行うことはできませんか?

于 2012-05-07T14:44:01.233 に答える
2

「即時」通知である必要がなく、ユーザーが次にコマンドを実行するまで待つことができる場合は、あらゆる種類のものをbashシェルプロンプトに焼き込むことができます。たとえば、私がいるディレクトリの時刻と git リポジトリのステータスを教えてくれます。

「通常のユーザー」シェル プロンプトのシェル変数はPS1であるため、bash PS1またはbash prompt customisationをグーグル検索すると興味深い例がいくつか得られます。

ここにいくつかのリンクがあります:

通常、任意のスクリプトの出力をプロンプト文字列に含めることができます。ただし、待ち時間の長いコマンドは、評価されるまでプロンプト文字列の出力が遅れることに注意してください。そのため、情報をキャッシュすることをお勧めします。(たとえば、天気の Web サイトから天気を表示したい場合は、bashプロンプトを出して、プロンプトが表示されるたびに Web ページを取得しないでください!)

于 2012-05-07T14:53:26.833 に答える
1

loggingライブラリ (標準ライブラリの一部) を見てみましょう。これにより、システムの状態に応じて、デバッグ データとランタイム データをコンソールまたはファイル (または任意の場所) にルーティングできます。
エラー、デバッグ、情報など、いくつかのログ機能を提供します。それぞれ異なる構成が可能です。

ロギングに関するドキュメントを参照してください - リンク

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
于 2012-05-07T15:35:44.193 に答える