From 6e3f2c8a7097aeccd1b7bda32e1b058a947e5c78 Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Mon, 7 May 2018 18:58:24 +0200 Subject: [PATCH 1/1] Initial import --- README | 15 +++++++++++++++ enter-pre-hook-lock.sh | 20 ++++++++++++++++++++ exit-post-hook-unlock.sh | 22 ++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 README create mode 100755 enter-pre-hook-lock.sh create mode 100755 exit-post-hook-unlock.sh 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" -- 2.1.4