LOCKF(1) | General Commands Manual | LOCKF(1) |
lockf
— execute a
command while holding a file lock
lockf |
[-knsw ] [-t
seconds] file
command [arguments] |
lockf |
[-s ] [-t
seconds] fd |
The lockf
utility acquires an exclusive
lock on a file, creating it if necessary,
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
-s
lockf
to operate silently. Failure to
acquire the lock is indicated only in the exit status.-n
lockf
to fail if the specified lock
file does not exist. If -n
is not specified, lockf
will create
file if necessary.-t
secondslockf
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
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.
If lockf
successfully acquires the lock,
it returns the exit status produced by command.
Otherwise, it returns one of the exit codes defined in
sysexits(3), as follows:
EX_TEMPFAIL
EX_CANTCREAT
lockf
utility was unable to create the lock
file, e.g., because of insufficient access privileges.EX_UNAVAILABLE
-n
option is specified and the specified lock
file does not exist.EX_USAGE
lockf
command line.EX_OSERR
EX_SOFTWARE
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
$ 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
A lockf
utility first appeared in
FreeBSD 2.2.
John Polstra <jdp@polstra.com>
November 25, 2023 | macOS 15.0 |