Skip to content
Snippets Groups Projects
Name Last commit Last update
..
LICENSE
README.md
onfilechange.sh

onfilechange

A Shell script that watches a given file or multiple files. If one of the watched file changes then a given command will be exxecuted. It loops permanently; you need to stop it by Ctrl + C and/ or can use it as systemd watcher daemon.

It uses stats for wide compatibility but prefers inotifywatch to check a file change.

licence: Free software GNU GPL 3.0

Source: https://git-repo.iml.unibe.ch/open-source/onfilechange

Installation

  • Copy the bash script somewhere you like.
  • set execute permissions chmod 0755 onfilechange.sh

Usage

Parameters
    -c [command]
        command to execute on a file change
    -f [filename(s)]
        filenames to watch; separate multiple files with space and put all in quotes
    -h
        show this help
    -i
        force inotifywait command
    -s
        force stats command
    -v
        verbose mode; enable showing debug output
    -w [integer]
        for stats mode: wait time in seconds betweeen each test or on missing file; default: 5 sec

Test on command line

To make a test on commandline touch a testfile touch /tmp/mytestfile. The start the script with enabled debugging (-d) in a 2nd terminal:

/usr/local/bin/onfilechange.sh -v -f "/tmp/mytestfile" -c 'echo "hello"'

Each time you touch the testfile it should show "hello".

Use as systemd service

With running the script as a service can be helpful if you administrate servers and habe developer teams with limited access. Instead of giving sudo permissions you can watch a touchfile to execute something specific as root, i.e. restart Apache httpd. In the real world this file would be touched during an automated deploy process.

Below is just an example service watching a dummy file in /tmp directory.

In /etc/systemd/system/ create a service config file onfilechange-demo.service

[Unit]
Description=Onfilechange edemo
Wants=multi-user.target

[Service]
ExecStart=/usr/local/bin/onfilechange.sh -f "/tmp/mytestfile" -c 'systemctl restart apache2'
Restart=on-failure
RestartSec=5s
SyslogIdentifier=onfilechange
User=root
Group=root
Type=simple

[Install]
WantedBy=multi-user.target

Check if the service exists systemctl status onfilechange-demo. If so you can start and stop it with systemctl [start|stop] onfilechange-demo

To start the service on reboot you additionally need to enable it: systemctl enable onfilechange-demo.