13

Linuxボックスにimagesという名前のフォルダがあります。このフォルダはウェブサイトに接続されており、サイトの管理者はこのサイトに写真を追加することができます。ただし、画像を追加するときに、すべての画像のサイズをディレクトリに変更するコマンドを実行する必要があります。

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

4

6 に答える 6

25

人々がこのフォルダにコンテンツをアップロードする方法はわかりませんが、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

于 2012-06-09T03:27:09.983 に答える
4

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

たとえば、ファイルまたはディレクトリの変更が検出されたときにcronのようなタスクを実行するために使用できるincron 。

または、独自のファイル通知シェルスクリプトを作成するために使用できるコマンドラインツールのセットであるinotify-tools 。

Wikiの下部にあるinotify-toolsを見ると、さらに多くのツールへの参照と、Python、Perl、Rubyなどの高級言語のサポート(サンプルコード)が表示されます。

于 2012-06-09T02:05:13.033 に答える
3

あなたは見たいかもしれませんinotify

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

于 2012-06-08T22:23:58.900 に答える
2
#!/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
于 2016-06-22T12:11:58.173 に答える
1

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
于 2015-09-06T20:47:54.953 に答える
0

ファイルがHTTPアップロードを介して追加され、サーバーがApacheである場合は、mod_securityを確認することをお勧めします。

これにより、HTTPPOSTを介して行われるすべてのアップロードに対してスクリプトを実行できます。

于 2016-05-13T20:56:52.363 に答える