私は自分のlinuxボックスにimagesという名前のフォルダを持っています。 このフォルダーはWebサイトに接続されており、サイトの管理者はこのサイトに画像を追加することができます。しかし、ピクチャが追加されると、ディレクトリのすべてのピクチャのサイズ変更を実行するコマンドが必要になります。ファイルが追加されたときにシェルコマンドを実行します
要するに、新しいファイルが特定の場所に追加されたときに、サーバーに特定のコマンドを実行させる方法を知りたいと思います。
私は自分のlinuxボックスにimagesという名前のフォルダを持っています。 このフォルダーはWebサイトに接続されており、サイトの管理者はこのサイトに画像を追加することができます。しかし、ピクチャが追加されると、ディレクトリのすべてのピクチャのサイズ変更を実行するコマンドが必要になります。ファイルが追加されたときにシェルコマンドを実行します
要するに、新しいファイルが特定の場所に追加されたときに、サーバーに特定のコマンドを実行させる方法を知りたいと思います。
私はどのように人々がこのフォルダにコンテンツをアップロードしているのかわかりませんが、あなたは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作業
を使用して
これは完璧です。実際には、PHP/HTMLアップロードボタンを使用しています。しかし、私はアップロードページのためにアクセスファイルをApacheからスキャンすることができます。 – Cripto
ここでは、ログファイルの末尾にあるスクリプトをトリガーするために何をしているのかわかりません。 –
@JasonGray、あなたは 'tail'の' -F'オプションに精通していますか? ['man tail'](http://www.freebsd.org/cgi/man.cgi?query=tail)を参照してください。 '-F'は' tail'をファイルが成長するまで待ってからstdoutに送ります。したがって、
'do something'の部分の「引き金」は単に新しいコンテンツをファイルに追加するだけです。このスクリプトは起動時に1回実行され、実行され続けます。起動方法はあなた次第で、オペレーティングシステムやディストリビューションによって異なります。 – ghoti
あなたはinotify
で見たいと思うかもしれませんinotifyをAPIはファイルシステムイベントを監視するためのメカニズムを提供します。 Inotifyは、個々のファイルを監視したり、ディレクトリを監視するために使用できます。ディレクトリが監視されると、inotifyはディレクトリ自体のイベントとディレクトリ内のファイルを返します。ジョンのよう
はinotify
APIが出発点である、しかし、あなたは、ファイルの通知タスクを実行するには、このAPIを使用するいくつかのツールに興味があるかもしれませんコメント:
たとえばincronのために実行するために使用することができcron-ファイルやディレクトリの変更が検出されたときに同様のタスクを実行します。
またはinotify-toolsこれは、独自のファイル通知シェルスクリプトを構築するために使用できる一連のコマンドラインツールです。
inotify-toolsのWiki Pakeの下部を見ると、さらに多くのツールやPython、Perl、Ruby(example code)などの高水準言語のサポートへの参照が表示されます。
は、私は、ユーザーの空き容量を取得するためにやったことです:
#!/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をチェックする。
HTTP POSTを使用してアップロードするたびにスクリプトを実行できます。
#!/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
http://stackoverflow.com/questions/10366411/linux-triggering-shell-command-on-file-save –