2012-06-08 8 views
10

私は自分のlinuxボックスにimagesという名前のフォルダを持っています。 このフォルダーはWebサイトに接続されており、サイトの管理者はこのサイトに画像を追加することができます。しかし、ピクチャが追加されると、ディレクトリのすべてのピクチャのサイズ変更を実行するコマンドが必要になります。ファイルが追加されたときにシェルコマンドを実行します

要するに、新しいファイルが特定の場所に追加されたときに、サーバーに特定のコマンドを実行させる方法を知りたいと思います。

+0

http://stackoverflow.com/questions/10366411/linux-triggering-shell-command-on-file-save –

答えて

22

私はどのように人々がこのフォルダにコンテンツをアップロードしているのかわかりませんが、あなたはinotifyでディレクトリを監視するよりも技術的に何かを使いたいかもしれません。

プロトコルがFTPで、FTPサーバーのログにアクセスできる場合は、アップロードを成功させるためにそのログを調べることをお勧めします。このようなイベントトリガのアプローチは、従来のcronによるポーリングアプローチよりも高速で、信頼性が高く、負荷が小さく、inotifyを使用するものより移植性が高くデバッグが容易です。

これを処理する方法は、もちろんFTPサーバーによって異なります。私は1つは、そのログのような行が含ま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" 

vsftpdは正常にファイルを保存したときUPLOADラインにのみ追加されます。あなたは、このようなシェルスクリプトでこれを解析することができます:

#!/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というログを生成します。ここでghotis作業

を使用して

+0

これは完璧です。実際には、PHP/HTMLアップロードボタンを使用しています。しかし、私はアップロードページのためにアクセスファイルをApacheからスキャンすることができます。 – Cripto

+1

ここでは、ログファイルの末尾にあるスクリプトをトリガーするために何をしているのかわかりません。 –

+1

@JasonGray、あなたは 'tail'の' -F'オプションに精通していますか? ['man tail'](http://www.freebsd.org/cgi/man.cgi?query=tail)を参照してください。 '-F'は' tail'をファイルが成長するまで待ってからstdoutに送ります。したがって、

'do something'
の部分の「引き金」は単に新しいコンテンツをファイルに追加するだけです。このスクリプトは起動時に1回実行され、実行され続けます。起動方法はあなた次第で、オペレーティングシステムやディストリビューションによって異なります。 – ghoti

3

あなたはinotify

で見たいと思うかもしれませんinotifyをAPIはファイルシステムイベントを監視するためのメカニズムを提供します。 Inotifyは、個々のファイルを監視したり、ディレクトリを監視するために使用できます。ディレクトリが監視されると、inotifyはディレクトリ自体のイベントとディレクトリ内のファイルを返します。ジョンのよう

4

inotify APIが出発点である、しかし、あなたは、ファイルの通知タスクを実行するには、このAPIを使用するいくつかのツールに興味があるかもしれませんコメント:

たとえばincronのために実行するために使用することができcron-ファイルやディレクトリの変更が検出されたときに同様のタスクを実行します。

またはinotify-toolsこれは、独自のファイル通知シェルスクリプトを構築するために使用できる一連のコマンドラインツールです。

inotify-toolsのWiki Pakeの下部を見ると、さらに多くのツールやPython、Perl、Rubyexample code)などの高水準言語のサポートへの参照が表示されます。

0

は、私は、ユーザーの空き容量を取得するためにやったことです:

#!/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 
0

ファイルはHTTPのアップロードを介して追加され、サーバーがApacheのであれば、あなたが望む可能性がある場合mod_securityをチェックする。

HTTP POSTを使用してアップロードするたびにスクリプトを実行できます。

0
#!/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 
関連する問題