I needed a shell script that runs every 5 minutes but I only wanted it to do something when a status changes. In this case, I wanted it to log some information to the system log but I didn’t want it to fill up the log with redundant entries. Here’s the pattern I came up with.
My true condition was checking the exit code of a command (e.g. $? -eq 0) but it could be anything. The key is that a temporary file (LOCKFILE) is created for one status and is deleted for the other status. This allows the script to keep track of state between runs. This script only differentiates between two statuses but it wouldn’t be difficult to adapt this to track changes between multiple states (store the current state in LOCKFILE).
Note, the way this is written, the true action will always be executed once after the system is booted.
#!/bin/sh LOCKFILE=/var/lock/mylockfile TAG=mytag if [ some condition is true ] then echo Status 1 if [ ! -e $LOCKFILE ] then logger -t $TAG "Message for status 1" touch $LOCKFILE fi else echo Status 2 if [ -e $LOCKFILE ] then logger -t $TAG "Message for status 2" rm $LOCKFILE fi fi