#!/bin/sh # # # putlock -- create one or more lockfiles, based on rtc # cleanup() { if [ "$LOCKFILES" != "" ]; then rm $LOCKFILES fi trap - $trapsignals if [ "$cmdpid" != "" ]; then kill $cmdpid >/dev/null 2>&1 fi if [ "$alarmpid" != "" ]; then kill $alarmpid >/dev/null 2>&1 fi } setalarm() { trap sigalrmhandler 14 sleep $1 && kill -s 14 $$ & alarmpid=$! } sigalrmhandler() { if [ "$silent" = "no" ]; then echo $program: alarm clock >&2 fi alarmpid='' if [ "$cmdpid" != '' ]; then kill -ALRM $cmdpid fi exit 1 } program=`basename $0` trapsignals="0 1 2 3 15" TIMEOUT=10 options=`getopt dt: $*` || exit 1 set -- $options while true; do opt=$1 case $opt in -d) set -x shift ;; -t) TIMEOUT=$2 shift 2 ;; --) shift break ;; -*) echo $program: unknown option: $opt 1>&2 exit 1 ;; *) break ;; esac done # # Check parameters ... # if [ "$#" '<' 1 ]; then echo usage: $program '[] [...]' 1>&2 exit 1 fi # # ... capture some signals and set clock. # trap 'cleanup; exit' $trapsignals setalarm $TIMEOUT # # Put the lockfiles # for file in $*; do lock=$file.lock while (! ln -s $file $lock >/dev/null 2>&1); do sleep 1 done LOCKFILES="$LOCKFILES $lock" done # # Turn off the alarm and wait for input, send ok to caller # and wait for termination. # kill $alarmpid echo OK while read line; do x=x # do nothing done exit 0