Linuxボックスにimagesという名前のフォルダがあります。このフォルダはウェブサイトに接続されており、サイトの管理者はこのサイトに写真を追加することができます。ただし、画像を追加するときに、すべての画像のサイズをディレクトリに変更するコマンドを実行する必要があります。
つまり、新しいファイルが特定の場所に追加されたときに、サーバーに特定のコマンドを実行させる方法を知りたいのです。
人々がこのフォルダにコンテンツをアップロードする方法はわかりませんが、inotifyでディレクトリを監視するよりも技術的な方法を使用することをお勧めします。
プロトコルがFTPであり、FTPサーバーのログにアクセスできる場合は、アップロードが成功するかどうかを監視するために、そのログを調整することをお勧めします。この種のイベントトリガーアプローチは、従来のcronを使用したポーリングアプローチよりも高速で信頼性が高く、負荷が少なく、inotifyを使用するものよりも移植性が高くデバッグが容易です。
もちろん、これを処理する方法はFTPサーバーによって異なります。次のような行がログに含まれているvsftpdを実行しているものがあります。
Fri May 25 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16"
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644"
このUPLOAD
行は、vsftpdがファイルを正常に保存した場合にのみ追加されます。次のようなシェルスクリプトでこれを解析できます。
#!/bin/sh
tail -F /var/log/vsftpd.log | while read line; do
if echo "$line" | grep -q 'OK UPLOAD:'; then
filename=$(echo "$line" | cut -d, -f2)
if [ -s "$filename" ]; then
# do something with $filename
fi
fi
done
HTTPアップロードツールを使用している場合は、そのツールに受信ファイルの記録に使用するテキストログファイルがあるかどうかを確認してください。ある種のロガー関数を追加することを考慮していない場合は、可能なログが生成されますtail
。
Johnがコメントしたように、inotify
APIは出発点ですが、このAPIを使用してファイル通知タスクを実行するいくつかのツールに興味があるかもしれません。
たとえば、ファイルまたはディレクトリの変更が検出されたときにcronのようなタスクを実行するために使用できるincron 。
または、独自のファイル通知シェルスクリプトを作成するために使用できるコマンドラインツールのセットであるinotify-tools 。
Wikiの下部にあるinotify-toolsを見ると、さらに多くのツールへの参照と、Python、Perl、Rubyなどの高級言語のサポート(サンプルコード)が表示されます。
あなたは見たいかもしれませんinotify
inotify APIは、ファイルシステムイベントを監視するためのメカニズムを提供します。Inotifyは、個々のファイルを監視したり、ディレクトリを監視したりするために使用できます。ディレクトリが監視されると、inotifyはディレクトリ自体とディレクトリ内のファイルのイベントを返します。
#!/bin/bash
tail -F -n0 /var/log/vsftpd.log | while read line; do
if echo "$line" | grep -q 'OK UPLOAD:'; then
filename=$(echo $line | cut -d, -f2 |awk '{print $1}')
filename="${filename%\"}"
filename="${filename#\"}"
#sleep 1s
if [ -s $filename ]; then
# do something with $filename
echo $filename
fi
fi
done
ghotisworkを使用する
ユーザーに空き領域を確保するために私が行ったことは次のとおりです。
#!/bin/bash
tail -F -n 1 /var/log/vsftpd.log | while read line; do
if echo "$line" | grep -q 'OK LOGIN:'; then
pid=$(sed 's/.*\[\([^]]*\)\].*/\1/g' <<< "$line")
#the operator '<<<' doesnt exist in dash so use bash
if [[ $pid != *"pid"* ]]; then
echo -e "Disk 1: Contains Games:\n" > /home/vftp/"$pid"/FreeSpace.txt; df -h /media/Disk1/ >> /home/vftp/"$pid"/FreeSpace.txt
echo -e "\r\n\r\nIn order to read this properly you need to use a text editor that can read *nix format files" >> /home/vftp/"$pid"/FreeSpace.txt
fi
echo "checked"
# awk '{ sub("\r$", ""); print }' /home/vftp/"$pid"/FreeSpace.txt > /home/vftp/"$pid"/FreeSpace.txt
fi
done
ファイルがHTTPアップロードを介して追加され、サーバーがApacheである場合は、mod_securityを確認することをお勧めします。
これにより、HTTPPOSTを介して行われるすべてのアップロードに対してスクリプトを実行できます。