inotifywaitで分割を試してください。デフォルトでは、FTPサーバーでファイルが作成されるとファイルが分割されます。
#!/bin/bash
TARGET=/home/test-directory/incoming
SPLITTED=/home/test-directory/incoming/splitted
PROCESSED=/home/test-directory/incoming/processed
LOGFILE=/var/log/inotify-ftp.log
inotifywait -m -e create -e moved_to --format "%f" $TARGET \
| while read FILENAME
do
echo Detected $FILENAME >> $LOGFILE
echo Splitting $FILENAME >> $LOGFILE
split -d -l 1000 "$TARGET/$FILENAME" "$SPLITTED/$FILENAME"
#/usr/bin/split -d -l 1000 /home/test-directory/incoming/test-file.csv /home/test-directory/incoming/splitted/test-file.csv
mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
echo Completed splitting $FILENAME >> $LOGFILE
done
したがって、以下のコードは単独で実行しても機能します。上記のスクリプトは同じことを行う必要がありますが、長さが数百行しかない最初のパーティションファイルを生成します。
#/usr/bin/split -d -l 1000 /home/test-directory/incoming/test-file.csv /home/test-directory/incoming/splitted/test-file.csv
どうしたの?
答え1
これは、ファイル長がゼロで生成されたためです。スプリットがファイルサイズを特定し、スプリット方法を決定しますが、ftpサーバーにはファイルサイズを増やすための競合状態があります。
分割が読み取りを開始する前にファイルが完全に到着するのを待つメカニズムを用意することは賢明でしょう。通常、統計ファイルは前の1分間に増加が停止するまで繰り返されます。
答え2
すでに説明したように他の場所でcreate
追加されたコンテンツを参照せずにファイルが生成されると、イベントが開始されます。ファイル転送サービスがファイルを閉じるまでイベントが実行されないようにイベントを変更inotifywait
します。create
close_write
inotifywait -m -e close_write -e moved_to --format "%f" "$TARGET"
また、プロセスが完全に転送されたファイルと途中で中断されたファイルを区別できるように、いくつかのエラー処理機能を構築する必要があります。これは、ファイルの内容を検証したり、tmp
送信が成功したときに送信者がファイル名を変更したときに削除されたサフィックスを使用してファイルを転送することができます。
最後に、良いコーディング方法で変数を使用するたびに二重引用符で囲む必要があることに注意してください。