Linux – Trigger commands and tasks during file system changes

In this tutorial, we will be showing you how to run tasks/scripts when the file system creates an event.

Overview

We will be doing this something called incrontab, as the name suggests it is similar to crontab

You may be wondering what a filesystem event is and why this is useful, let me explain.

So when a file is created/modified/deleted/opened it will send a signal to the OS but as we don’t usually have anything installed to capture these events they go unnoticed.

in my experience this is useful for following things:

  • You want to email someone edits a file
  • You are using an SFTP server you want to move the file
  • You want to restart a service as soon as a config file has been edited.

Installing

Log into your Linux box then run:

Ubuntu:

sudo apt install incron

Centos/Red Hat/Amazon Linux:

sudo yum install incron

Setting Up

Once this is installed we can run the following:

incrontab -e

Below is the structure of the command you will need to place inside incrontab -e

<path> <mask> <command>
  • <path> is file/folder you are getting incron to monitor for changes
  •  <mask> is the event incron should be looking for
  • <command> this is the command that you want to run.

Incron has quite a few events they are quite self-explanatory:

  • IN_ACCESS           File was accessed (read) (*)
  • IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
  • IN_CLOSE_WRITE      File opened for writing was closed (*)
  • IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
  • IN_CREATE           File/directory created in watched directory (*)
  • IN_DELETE           File/directory deleted from watched directory (*)
  • IN_DELETE_SELF           Watched file/directory was itself deleted
  • IN_MODIFY           File was modified (*)
  • IN_MOVE_SELF        Watched file/directory was itself moved
  • IN_MOVED_FROM       File moved out of watched directory (*)
  • IN_MOVED_TO         File moved into watched directory (*)
  • IN_OPEN             File was opened (*)

There are also variables you can use:

  • $$   dollar sign
  • $@   watched filesystem path (such are /tmp/)
  • $#   event-related file name
  • $%   event flags (textually)
  • $&   event flags (numerically)

With the events and variables out the way we can construct the command I will show you an example then explain it.

So the example is this(extra points if you can figure out what this is running)

/data/test.txt IN_MODIFY echo "$$ $@ $# $% $&"

This example is equivalent to running when /data/test.txt modified.

echo "$ /data test.txt IN_MODIFY 2"

 

Note: If you find that incron is not running your script/task, you may need to provide the full path of the program

Below is an example of using a python script when a file is created.

/data IN_CLOSE_WRITE /usr/bin/python /upload.py $#

As you can see I am providing the full path to the python interpreter as incron cannot find it.