0

システムの起動時や終了時など、ファイルを永遠に読み取らなければなりません。ファイル イベントに基づいて、Python スクリプトはアクションを実行する必要があります。しかし、私のpythonスクリプトがそうしていないのは不思議です。

ステップ1:crontabと起動時に、次のようになります

tail -f /var/tmp/event.log | python /var/tmp/event.py &

ステップ 2: 他のアプリケーションがファイル /var/tmp/event.log に行をダンプしています。たとえば、

java -cp Java.jar Main.main | tee -a /var/tmp/event.log

or

echo "tst" >> /var/tmp/event.log

or

otherapps | tee -a /var/tmp/event.log

ステップ 3: python event.py はコマンドをリッスンして実行するループを持っていますが、それらの実行は行われていません

import sys, time, os
while True:
  line = sys.stdin.readline()
  if line:
    if "runme.sh" in line:
      os.system("/var/tmp/runme.sh")
    if "killfirefox.sh" in line:
      os.system("/var/tmp/killfirefox.sh")
    if "shotemail.sh" in line:
      os.system("/var/tmp/shotemail.sh")
    if "scan.sh" in line:
      os.system("/var/tmp/scan.sh")
    if "screenshot.sh" in line:
      os.system("/var/tmp/screenshot.sh")

  else:
    time.sleep(1)

私が間違っていることは何ですか?event.log ファイルが行ごとに正しいコマンドを持っていることを確認しましたが、手動echo "runme.sh" | python /var/tmp/event.pyでも機能しますが、起動時/crontab モードを使用しているときに機能しないのはなぜですか?

4

1 に答える 1

1

おそらく、tail コマンドの出力がバッファリングされているためです。bash でパイプに書き込むと、出力はすぐに他のコマンドに送信されず、バッファリングされてから後で出力されます。たとえば、ls -l | more大きなディレクトリで実行してみてください。moreリストを出力する前に、顕著な遅延が見られます。

これを回避する方法はいくつかあります。次のように使用できますstdbuf(詳細については、こちらを参照してください)。

stdbuf -i0 -e0 -o0 tail -f /var/tmp/event.log | python /var/tmp/event.py

これを試して、うまくいくかどうかを確認してください。より洗練された解決策は、読み取る出力がある場合にのみ書き込まれる一時ファイルを使用することです。これは、Python スクリプトまたは名前付きパイプによって監視されます。

于 2013-09-17T12:56:38.533 に答える