Use of flock command for whole script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Use of flock command for whole script
# 8  
Old 09-29-2016
As long as you just have a single script that wants to be sure that only one copy of it is running at a time, you can use the shell's no clobber option to create a lock file something like:
Code:
#!/bin/bash
IAm=${0##*/}
LockFile="/tmp/$IAm.lock"

# Set lock and verify that no other copy of this code is already running...
set -C	# set no clobber option

# Create the lock file...  This will fail if the lock file already exists.
if ! echo "PID $$ holds the lock." > "$LockFile"
then	echo "$IAm: Another $IAm is already running." >&2
	cat "$LockFile" >&2
	echo "$IAm: Aborting!" >&2
	exit 1
fi

# We now hold an exclusive lock to the lock file (as long as other processes
# wanting to create this lock file also use set -C when trying to create this
# lock file).
set +C	# clear no clobber option

# Set up to remove the lock file when we're done.
trap 'rm -f "$LockFile"' EXIT

echo "$IAm: $$ running."
sleep 60
echo "$IAm: $$ quitting."

This should work with any POSIX conforming shell.

Just be aware that if you use kill -9 to kill this script, you'll have to manually remove the lock file before you can start another instance of this script.
These 2 Users Gave Thanks to Don Cragun For This Post:
# 9  
Old 09-30-2016
Best practice: remove the lock if more than one day old
Code:
find "$LockFile" -prune -mtime +0 -exec rm -f {} \; -exec echo Deleted old {} \;


Last edited by MadeInGermany; 09-30-2016 at 07:45 PM..
# 10  
Old 09-30-2016
If a lock file as proposed by Don Cragun exists, you could also check if the process is still running, e.g. like
Code:
read A PID REST <"$LockFile"
if ! lsof -p$PID >/dev/null; then  rm $LockFile; fi

This User Gave Thanks to RudiC For This Post:
# 11  
Old 09-30-2016
Quote:
Originally Posted by RudiC
If a lock file as proposed by Don Cragun exists, you could also check if the process is still running, e.g. like
Code:
read A PID REST <"$LockFile"
if ! lsof -p$PID >/dev/null; then  rm $LockFile; fi

On many UNIX systems, /tmp is wiped clean during the boot process. The above code works great in this case.

But, if /tmp is not wiped clean by a reboot on your system, there is a small chance that your script could have been killed by a SIGKILL signal (preventing removal of the lock file), having a system reboot, having some other process be started with the PID your script was using on a prior boot, and then having the above code kill the wrong process. Even though the chance is small, on a system that doesn't clear /tmp on every boot, I prefer manual intervention if a lock file is left around when it shouldn't be there.

I don't know if CentOS V6 normally clears /tmp on boot, nor if you have changed the default CentOS boot sequence to keep /tmp as it was or to clear /tmp as part of your local both sequence.
This User Gave Thanks to Don Cragun For This Post:
# 12  
Old 09-30-2016
Absolutely. It was just an example that would need serious refinement.
Login or Register to Ask a Question

Previous Thread | Next Thread

7 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Execute ssh command with additional terminal command to any remote user not working script

Hello i am having an issue with bash script and this is the code now=$(cat hosts1.txt | awk '{print $2;}') while read n ;do ssh root@$now 'useradd test1; echo -e "test1\ntest1" | passwd test1 && echo "test1 ALL=(ALL:ALL) ALL" >> /etc/sudoers' When i execute only part with cat, it... (8 Replies)
Discussion started by: tomislav91
8 Replies

2. Shell Programming and Scripting

Flock preventing function to work

Hi i have a script that check pings and i use flock to so the script wont run multipul times : its not the whole script but this is the idea : ( flock -x -w 3 200 || exit 1 /usr/sbin/fping -c$count -i$interval -a $hosts > $FILE1 2>&1 ) 200>/var/lock/.myscript.exclusivelock now i... (4 Replies)
Discussion started by: batchenr
4 Replies

3. Shell Programming and Scripting

Help using Flock (file lock)

Hello, I have been working on using "flock"/file lock to prevent two instances of a bash script from being executed. Below is a simplified version of what I have to illustrate the flock part. It works as it is set up there below however the piece I am trying to figure out is how to get it to... (2 Replies)
Discussion started by: infrared013
2 Replies

4. UNIX for Advanced & Expert Users

Semaphore - lockfile/flock

Hi, I have a process which can run one instance at a time. Currently we have multiple scripts trying to kickoff this process. I wanted to implement the semaphore mechanism to achieve this. I was going through few examples. The below code seems to be reasonable solution. ... (5 Replies)
Discussion started by: tostay2003
5 Replies

5. Shell Programming and Scripting

SH script, variable built command fails, but works at command line

I am working with a sh script on a solaris 9 zone (sol 10 host) that grabs information to build the configuration command line. the variables Build64, SSLopt, CONFIGopt, and CC are populated in the script. the script includes CC=`which gcc` CONFIGopt=' --prefix=/ --exec-prefix=/usr... (8 Replies)
Discussion started by: oly_r
8 Replies

6. Shell Programming and Scripting

Need help! command working ok when executed in command line, but fails when run inside a script!

Hi everyone, when executing this command in unix: echo "WM7 Fatal Alerts:", $(cat query1.txt) > a.csvIt works fine, but running this command in a shell script gives an error saying that there's a syntax error. here is content of my script: tdbsrvr$ vi hc.sh "hc.sh" 22 lines, 509... (4 Replies)
Discussion started by: 4dirk1
4 Replies

7. Shell Programming and Scripting

can anyone help with shell script command about searching word with grep command?

i want to search in the current directory all the files that contain one word for example "hello" i want to achieve it with the grep command but not with the grep * (2 Replies)
Discussion started by: aintour
2 Replies
Login or Register to Ask a Question