添加文件时运行shell命令

时间:2012-06-08 22:19:28

标签: linux bash shell cron

我的linux盒子上有一个名为images的文件夹。 此文件夹已连接到网站,网站管理员可以将图片添加到此网站。但是,当添加图片时,我想要一个命令来运行调整目录中所有图片的大小。

简而言之,我想知道在将新文件添加到特定位置时,如何使服务器运行特定命令。

6 个答案:

答案 0 :(得分:23)

我不知道人们如何将内容上传到此文件夹,但您可能希望使用比使用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"

仅当vsftpd成功保存文件时才会添加UPLOAD行。您可以在这样的shell脚本中解析它:

#!/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的日志。

答案 1 :(得分:4)

John赞评inotify API是一个起点,但您可能对使用此API执行文件通知任务的一些工具感兴趣:

例如incron,可用于在检测到文件或目录更改时运行类似cron的任务。

inotify-tools这是一组可用于构建自己的文件通知shell脚本的命令行工具。

如果您查看Wiki pake底部的inotify-tools,您将看到对更高级别语言(如Python,Perl或Rubyexample code)的更多工具和支持的引用。

答案 2 :(得分:3)

您可能需要查看inotify

  

inotify API提供了一种监视文件系统事件的机制。 Inotify可用于监视单个文件或监视目录。监视目录时,inotify将返回目录本身以及目录内文件的事件。

答案 3 :(得分:0)

使用ghotis工作

以下是我为获得用户空间所做的工作:

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

答案 4 :(得分:0)

如果通过HTTP上传添加文件,并且您的服务器是apache,则可能需要检查mod_security。

它使您可以为通过HTTP POST进行的每次上传运行脚本。

答案 5 :(得分: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