ファイルが変更されたときにコマンドを実行する


9

.csvファイルを特定のフォルダー/ tmp / data_uploadに毎日アップロードしていて、古いファイルが新しいファイルに置き換えられるシナリオがあります。

データがアップロードされたら、Pythonスクリプトを実行する必要があります。このために、cronジョブを作成し、ファイルの変更を監視するというアイデアがあります。私はinotifyを使ってみましたが、Unixドメインにはあまり慣れていません。どうやってやるの?

/ tmp / data_uploadなどのアップロードフォルダー内のファイルの日付が変更されたら、スクリプトtest.pyを実行する必要があります。


eradman.com/entrprojectを見て、自分で試したことはありませんが、関連しているようです。
OO

ちなみに、Pythonにはinotifyライブラリが用意されています。例については、ここで私の回答の1つを参照してください。askubuntu.com
Sergiy Kolodyazhnyy

回答:


10

ファイルの変更を監視してスクリプトを実行するincrond(inotify cronデーモン)が必要になる場合があります。

Incrondは、新しいファイルの追加、変更、削除などを監視できます。これは、いくつかの例を使用してincrondが監視できるイベントを示す記事です。

あなたのケースの例、あなた/etc/incron.d/data_uploadは内容でファイルを作成するかもしれません

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 

2
これは理論的には質問に答える可能性がありますが、答えの本質的な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
ジェラルドシュナイダー、

思い出していただきありがとうございます。リンクのコンテキストを追加しました。
ビクトリア朝

回答ありがとうございます。incrontabをインストールした後の手順を確認するために、shoudl incrontab -eをrootとして実行してから、この行を含め /tmp/data_upload IN_CREATE,IN_MODIFY test.py ますか?チェックしたら、新しいファイルをアップロードしたらtest.pyファイルを実行する必要がありますか?test.pyファイルはどこに置くべきですか?これに絶対パスを指定する必要がありますか?
Alex

1
私は、スクリプトの絶対パスを配置する方が良いと思います。スクリプトが機能していない場合は、cronまたはシステムログを確認することもできます
victoroloan

コードブロックで参照しているファイルを文書化できますか。Incrondの構文に慣れていない人(私のような)は、コマンドラインで実行する必要があるコマンドを参照していると思うかもしれません
Ferrybig


0

watchexechttps://crates.io/crates/watchexec必要な正確に何のような)コマンドラインユーティリティの音、私はそれをインストールすると信じるが、それはかもしれので、あなたが、あなたのマシンにインストール錆・ビルド・ツールを持っている必要があるだろう合意を壊すもの


1
錆びて書かれたソフトウェアを使用するのは大好きです。2004年に放棄されたわけではないことを知っているからです。それはほとんど新しいものでなければなりません。
Nathaniel Pisarski、

0

私の一般的なアプローチは、古典的なUnix findユーティリティをいじることです。たとえば、次のコマンド

find /tmp/upload_data/*.csv -mtime -1 -exec /home/myname/test.py

は1日以内に変更されたすべての.csvファイルを検索し、見つかった場合/tmp/upload_dataはを実行しますtest.py。もちろん、test.pyファイルが他のディレクトリにある場合は、それに応じてパスを更新する必要があります。

cron1日に複数回ジョブを実行する場合は、mminオプションを使用してfind、変更後の最大時間を分単位で指定できます。例えば、

find /tmp/upload_data/*.csv -mmin -60 -exec /home/myname/test.py

.csv60分以内に変更されたファイルを検索します。cronが1時間ごとにジョブを実行する場合に便利です。

2つの公平な警告が表示されます。1つ目は、.csv完全に削除したファイルをキャッチしないことです。これらを個別に確認することをお勧めします。次に、これをテストする時間がありませんでした。私のコードには、自分でデバッグしなければならないタイプミスがあると思ってください。


1
-cmd構文は何ですか?IIRC find-exec cmd ;...
D.ベンノーブル

私はこの質問を投稿する前にこれを試しましたが、これはcronジョブの2番目、3番目の連続実行では正しく機能しません
Alex

@D。ベン・ノブル:その通りです。find-internalコマンドとシェルコマンドを混在させました。修繕。訂正ありがとうございます!
トーマスブランケン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.