web-dev-qa-db-ja.com

ディレクトリにファイルが作成されるたびにpythonスクリプトを実行するにはどうすればよいですか?

だから、私はこれをやや単純なタスクにしようとしていますが、まだ成功していません。私はそれが今変わることを望んでいます。

目標:

/var/www/lager-scanner/filer/pluk_script.pyに新しいファイルがあるたびに/var/www/lager-scanner/filer/Nav/FromNavを実行し、これをwww-dataユーザーとして実行します。

それを行う方法を教えてくれる人がいますか?

/var/www内のすべてのフォルダーは、www-dataユーザーおよびグループが所有し、775権限を持っています。

5
Folkmann

だまされていないが、 この質問 で受け入れられている答えでは、ファイルが任意のディレクトリに追加または作成されるたびにスクリプト(または任意のコマンド)を実行する方法が説明されています。あなたの場合、唯一必要なイベントトリガーは次のとおりです。

-e create

さらに、ファイルへのパスを引数として使用していないため、--formatセクションをスキップできます。

バックグラウンドで実行するスクリプトは次のとおりです。

#!/bin/bash
DIR="/var/www/lager-scanner/filer/Nav/FromNav"
inotifywait -m -r -e create "$DIR" | while read f

do
    # you may want to release the monkey after the test :)
    echo monkey
    # <whatever_command_or_script_you_liketorun>
done

説明

リンクされた質問で説明されているように:

-e create

ディレクトリ内に新しいファイルcreatedが表示されます。

オプション:

-m -r 

コマンドを無期限に(「モニター」)実行し、ディレクトリ内で再帰的に実行することです。

this によると、pyinotifyを使用することは最適なオプションではありません。

編集

あなたはそれが機能しないことを述べたコメントで、andターゲットフォルダがリモートであることを述べました。まったく同じではありませんが、問題は this に関連しているようです。
変更はカーネルには見えません。完全にリモートで発生します。

(テスト済み)回避策は、リモートフォルダーをローカルにマウントすることです。

5
Jacob Vlijm

これは、PyPIのinotifyページの例の一部を削除したものです。
https://pypi.python.org/pypi/inotify )開始するには:

import inotify.adapters
import os

notifier = inotify.adapters.Inotify()
notifier.add_watch('/home/student')

for event in notifier.event_gen():
    if event is not None:
        # print event      # uncomment to see all events generated
        if 'IN_CREATE' in event[1]:
             print "file '{0}' created in '{1}'".format(event[3], event[2])
             os.system("your_python_script_here.py")

Inotifyオブジェクトを作成し、add_watch()メソッドを使用して監視するディレクトリを追加します。次に、event_gen()メソッドを使用してInotifyオブジェクトからイベントジェネレーターを作成します。最後に、そのジェネレーターを反復処理します

監視対象ディレクトリに影響するファイル操作により、1つ以上のイベントが生成されるようになりました。各イベントは、4つの値を持つタプルの形式を取ります。

  • _INOTIFY_EVENTタプル(わかりやすくするために以下の出力では省略)
  • イベントを説明する文字列のリスト
  • 影響を受けるディレクトリの名前
  • 影響を受けるファイルの名前

最初のprintステートメントのコメントを外して上記の例を実行し、監視対象ディレクトリに「new」ファイルを作成すると、次の出力が得られます。

((...)、['IN_CREATE']、 '/ home/student'、 'new')
 file 'new'は '/home/student'[.____。に作成されました。 ]((...)、['IN_ISDIR'、 'IN_OPEN']、 '/ home/student'、 '')
((...)、['IN_ISDIR'、 'IN_CLOSE_NOWRITE'/home/student '、' ')
((...)、[' IN_OPEN ']、'/home/student '、' new ')
((...)、[' IN_ATTRIB ']、'/home/student '、' new ')
((...)、[' IN_CLOSE_WRITE ']、'/home/student '、' new ')

新しいファイルが作成されると「IN_CREATE」イベントが発生するため、ここで実行したいコードを追加します。

1
quizdog