From: Antonio Ospite Date: Mon, 7 May 2018 16:58:24 +0000 (+0200) Subject: Initial import X-Git-Url: https://git.ao2.it/experiments/hook-lock.git/commitdiff_plain/6e3f2c8a7097aeccd1b7bda32e1b058a947e5c78?ds=sidebyside Initial import --- 6e3f2c8a7097aeccd1b7bda32e1b058a947e5c78 diff --git a/README b/README new file mode 100644 index 0000000..27463e9 --- /dev/null +++ b/README @@ -0,0 +1,15 @@ +Sometimes a shell script needs to prevent itself from being called multiple +times concurrently. + +This is a locking problem: +http://wiki.bash-hackers.org/howto/mutex +https://gist.github.com/przemoc/571091 + +However, in case where the script in question prepares the work for some other +operation (e.g. the script is a "pre hook") it is typically called from +another program, interleaved with other processes, and so locking and +unlocking cannot be in the same script. + +By using a symmetrical "post hook", assuming that it is called by the same +process which called the "pre hook", the parent PID can be used as a condition +value, thus locking and unlocking can be performed in two distinct scripts. diff --git a/enter-pre-hook-lock.sh b/enter-pre-hook-lock.sh new file mode 100755 index 0000000..381bab8 --- /dev/null +++ b/enter-pre-hook-lock.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# +# Acquire a lock to protect a "pre" hook against concurrent executions. +# +# Copyright (C) 2018 Antonio Ospite +# SPDX-License-Identifier: WTFPL +# +# This program is free software. It comes without any warranty, to +# the extent permitted by applicable law. You can redistribute it +# and/or modify it under the terms of the Do What The Fuck You Want +# To Public License, Version 2, as published by Sam Hocevar. See +# http://sam.zoy.org/wtfpl/COPYING for more details. + +set -e + +LOCKDIR=/run/lock/mylockdir +mkdir "$LOCKDIR" 2>/dev/null || { echo "The enter script had been launched. But the exit script has not." 1>&2; exit 1; } +echo $PPID > "$LOCKDIR/pid" + +# Do stuff here diff --git a/exit-post-hook-unlock.sh b/exit-post-hook-unlock.sh new file mode 100755 index 0000000..d618346 --- /dev/null +++ b/exit-post-hook-unlock.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Example of how to safely release the lock in the "post" hook. +# +# Copyright (C) 2018 Antonio Ospite +# SPDX-License-Identifier: WTFPL +# +# This program is free software. It comes without any warranty, to +# the extent permitted by applicable law. You can redistribute it +# and/or modify it under the terms of the Do What The Fuck You Want +# To Public License, Version 2, as published by Sam Hocevar. See +# http://sam.zoy.org/wtfpl/COPYING for more details. + +set -e + +LOCKDIR=/run/lock/mylockdir +LOCKPID=$(cat "$LOCKDIR/pid") +[ "$LOCKPID" = $PPID ] || { echo "The enter script was launched from another process. Unlocking aborted." >&2; exit 1; } + +# Do stuff here + +rm -rf "$LOCKDIR"