It should be triggered via cron or systemd timer.
I run it with crond (on synology) twice a minute:
* * * * * /volume1/bin/watch.sh /volume2/shared/upload * * * * * sleep 30; /volume1/bin/watch.sh /volume2/shared/upload
At the end of the script I run synoindex.
#!/bin/sh
##################################################
# Name: watch.sh
# Author: krisko
# Description: Watch file/folder for change and trigger some action
# Date: 20200109
##################################################
usage() {
cat << EOT
Watch file/folder for change and trigger some action
NOTE: this won't work if the change size is smaller than your blocksize (typically 4k)!
USAGE: $0 (OPTION)
OPTIONS:
-h Show this help
PATH Absolute path to file/folder
EOT
exit 0
}
# call usage if needed
[[ ! -n $1 ]] || [[ $1 == "-h" ]] && usage
# file/folder to watch
WATCH=$1
# logfile to store info
LOG=/tmp/watch_${WATCH##*/}
# return current size
getsize() {
du -s $1 | awk '{print $1}'
}
[[ -f ${LOG}.pending ]] && { echo "INFO: another instance already waiting for change, exiting..."; exit 0; }
# check if we have valid input
[[ -f $WATCH ]] || [[ -d $WATCH ]] || { echo "ERROR: invalid file specified, use -h for help."; exit 1; }
# create logfile if it does not exist
[[ ! -f $LOG ]] && getsize $WATCH > $LOG || LOGGED=$(cat $LOG)
CURRENT=$(getsize $WATCH)
[[ $LOGGED -eq $CURRENT ]] && { echo "INFO: nothing changed"; exit 0; }
# when change detected, w8 for folder stabilization and proceed
touch ${LOG}.pending
while [[ $LOGGED -ne $CURRENT ]]; do
LOGGED=$CURRENT
sleep 2
CURRENT=$(getsize $WATCH)
done
rm ${LOG}.pending
# update log
echo $CURRENT > $LOG
# run your favorite command
synoindex -R $WATCH
exit 0
#################################################
# TODO/Changelog # Author # Description
#################################################
# 1.0.0 20200109 # krisko # Genesis
#################################################
Pekny script, Krisko.
ReplyDeleteJa sam by som ho lepsie nenapisal.