Ubuntu – How to run a script when a directory is changed by another user

bashcommand linefilesysteminotifyscripts

I know has been a bit of discussion about topics similar to this. But here is what I am basically trying to do.

I have a watch directory called watched and whenever a file is added to that directory, I want to trigger a script called syncbh.sh which will take files out of that directory and upload them to a remote server.

The caveat is that files are created in the watched directory by one user (user2), but the script is executed by another (user1).

I've tried using incron to accomplish this, but keep running into a major problem because while the script can be executed manually by user1 with root privileges, the incron daemon is never actually automatically triggered by a file creation event by the other user2.

I've thought about whether inoticoming would be a better alternative, but I'm unclear about how the syntax of this works. If there a better way to accomplish this, or if I end up using inoticoming what would the command syntax be to ask it to watch /home/user1/watched directory and execute the script /usr/local/bin/syncbh.sh if a file is created/modified within that directory?

Any help would be much appreciated.

Best Answer

Using inoticoming:

You can put a script in /etc/init.d/ that runs inoticoming at boot time.

  1. Create a new folder to hold the inoticoming log / last pid for the watched folder: sudo mkdir -p /var/log/inoticoming/watched/

  2. Create a script inoticoming_watched in /etc/init.d/:

* Remember to change <path_to_folder> and <path_to_script> to match the full path of the watched folder and the full path of the script to execute

#!/bin/sh

case "${1}" in
    start)
        inoticoming --logfile '/var/log/inoticoming/watched/inoticoming.log' --pid-file '/var/log/inoticoming/watched/inoticoming_last_pid.txt' <path_to_folder> <path_to_script> \;
    ;;

    stop)
        kill -15 $(< /var/log/inoticoming/watched/inoticoming_last_pid.txt tee)
    ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
    ;;

    *)
    echo "Usage: ${0} {start|stop|restart}"
    exit 1
    ;;
esac
  1. Mark the script as executable: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Make sure that the script called by inoticoming_watched is executable.

  3. Update rc.d to make the service inoticoming_watched start at boot time: sudo update-rc.d inoticoming_watched defaults

You can check the inoticoming log in /var/log/inoticoming/watched.

Related Question