Cripto Cripto - 2 years ago 58
Bash Question

Run a shell command when a file is added

I have a folder named images on my linux box.
This folder is connected to a website and the admin of the site has the ability to add pictures to this site. However, when a picture is added, I want a command to run resizing all of the pictures a directory.

In short, I want to know how I can make the server run a specific command when a new file is added to a specific location.

Answer Source

I don't know how people are uploading content to this folder, but you might want to use something lower-tech than monitoring the directory with inotify.

If the protocol is FTP and you have access to your FTP server's log, I suggest tailing that log to watch for successful uploads. This sort of event-triggered approach will be faster, more reliable, and less load than a polling approach with traditional cron, and more portable and easier to debug than something using inotify.

The way you handle this will of course depend on your FTP server. I have one running vsftpd whose logs include lines like this:

Fri May 25 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client ""
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "", "/path/to/", 8395136 bytes, 845.75Kbyte/sec
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "", "/path/to/ 644"

The UPLOAD line only gets added when vsftpd has successfully saved the file. You could parse this in a shell script like this:


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

If you're using an HTTP upload tool, see if that tool has a text log file it uses to record incoming files. If it doesn't consider adding some sort of logger function to it, so it'll produce logs that you can tail.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download