Initial import
authorAntonio Ospite <ao2@ao2.it>
Mon, 7 May 2018 16:58:24 +0000 (18:58 +0200)
committerAntonio Ospite <ao2@ao2.it>
Mon, 7 May 2018 21:15:00 +0000 (23:15 +0200)
README [new file with mode: 0644]
enter-pre-hook-lock.sh [new file with mode: 0755]
exit-post-hook-unlock.sh [new file with mode: 0755]

diff --git a/README b/README
new file mode 100644 (file)
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 (executable)
index 0000000..381bab8
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# Acquire a lock to protect a "pre" hook against concurrent executions.
+#
+# Copyright (C) 2018  Antonio Ospite <ao2@ao2.it>
+# 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 (executable)
index 0000000..d618346
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Example of how to safely release the lock in the "post" hook.
+#
+# Copyright (C) 2018  Antonio Ospite <ao2@ao2.it>
+# 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"