FreeBSD manual
download PDF document: lockf.1.pdf
LOCKF(1) FreeBSD General Commands Manual LOCKF(1)
NAME
lockf - execute a command while holding a file lock
SYNOPSIS
lockf [-knsw] [-t seconds] file command [arguments]
lockf [-s] [-t seconds] fd
DESCRIPTION
The lockf utility acquires an exclusive lock on a file, creating it if
necessary, and removing the file on exit unless explicitly told not to.
While holding the lock, it executes a command with optional arguments.
After the command completes, lockf releases the lock, and removes the
file unless the -k option is specified. BSD-style locking is used, as
described in flock(2); the mere existence of the file is not considered
to constitute a lock.
lockf may also be used to operate on a file descriptor instead of a file.
If no command is supplied, then fd must be a file descriptor. The
version with a command may also be used with a file descriptor by
supplying it as a path /dev/fd/N, where N is the desired file descriptor.
The -k option is implied when a file descriptor is in use, and the -n and
-w options are silently ignored. This can be used to lock inside a shell
script.
If the lockf utility is being used to facilitate concurrency between a
number of processes, it is recommended that the -k option be used. This
will guarantee lock ordering, as well as implement a performance enhanced
algorithm which minimizes CPU load associated with concurrent unlink,
drop and re-acquire activity. It should be noted that if the -k option
is not used, then no guarantees around lock ordering can be made.
The following options are supported:
-k Causes the lock file to be kept (not removed) after the
command completes.
-s Causes lockf to operate silently. Failure to acquire the
lock is indicated only in the exit status.
-n Causes lockf to fail if the specified lock file does not
exist. If -n is not specified, lockf will create file if
necessary.
-t seconds Specifies a timeout for waiting for the lock. By default,
lockf waits indefinitely to acquire the lock. If a timeout
is specified with this option, lockf will wait at most the
given number of seconds before giving up. A timeout of 0
may be given, in which case lockf will fail unless it can
acquire the lock immediately. When a lock times out,
command is not executed.
-w Causes lockf to open file for writing rather than reading.
This is necessary on filesystems (including NFSv4) where a
file which has been opened read-only cannot be exclusively
locked.
In no event will lockf break a lock that is held by another process.
process.
EX_CANTCREAT The lockf utility was unable to create the lock file, e.g.,
because of insufficient access privileges.
EX_UNAVAILABLE
The -n option is specified and the specified lock file does
not exist.
EX_USAGE There was an error on the lockf command line.
EX_OSERR A system call (e.g., fork(2)) failed unexpectedly.
EX_SOFTWARE The command did not exit normally, but may have been
signaled or stopped.
EXAMPLES
The first job takes a lock and sleeps for 5 seconds in the background.
The second job tries to get the lock and timeouts after 1 second (PID
numbers will differ):
$ lockf mylock sleep 5 & lockf -t 1 mylock echo "Success"
[1] 94410
lockf: mylock: already locked
The first job takes a lock and sleeps for 1 second in the background.
The second job waits up to 5 seconds to take the lock and echoes the
message on success (PID numbers will differ):
$ lockf mylock sleep 1 & lockf -t 5 mylock echo "Success"
[1] 19995
Success
[1]+ Done lockf mylock sleep 1
Lock a file and run a script, return immediately if the lock is not
available. Do not delete the file afterward so lock order is guaranteed.
$ lockf -t 0 -k /tmp/my.lock myscript
Protect a section of a shell script with a lock, wait up to 5 seconds for
it to become available. Note that the shell script has opened the lock
file /tmp/my.lock, and lockf is performing the lock call exclusively via
the passed in file descriptor (9). In this case -k is implied, and -w
has no effect because the file has already been opened by the shell.
This example assumes that `>' is implemented in the shell by opening and
truncating /tmp/my.lock, rather than by replacing the lock file.
(
lockf -s -t 5 9
if [ $? -ne 0 ]; then
echo "Failed to obtain lock"
exit 1
fi
echo Start
# Do some stuff
echo End
) 9>/tmp/my.lock
SEE ALSO
FreeBSD 14.2-RELEASE November 25, 2023 FreeBSD 14.2-RELEASE