From e410f785a4d5676eb71715e8c5c4b3445c6478e3 Mon Sep 17 00:00:00 2001 From: Roman Yeryomin Date: Thu, 14 Dec 2017 23:54:26 +0200 Subject: [PATCH] procd: introduce procd_lock for init script protection Use flock to protect init script from concurrent execution (of the same script). Important for services which generate native config files. Signed-off-by: Roman Yeryomin Signed-off-by: Andrejs Hanins --- package/system/procd/files/procd.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/package/system/procd/files/procd.sh b/package/system/procd/files/procd.sh index 91e2371d62..b8d3513b1e 100644 --- a/package/system/procd/files/procd.sh +++ b/package/system/procd/files/procd.sh @@ -38,6 +38,20 @@ PROCD_RELOAD_DELAY=1000 _PROCD_SERVICE= +procd_lock() { + local basescript=$(readlink "$initscript") + local service_name="$(basename ${basescript:-$initscript})" + + flock -n 1000 &> /dev/null + if [ "$?" != "0" ]; then + exec 1000>/var/lock/procd_${service_name}.lock + flock 1000 + if [ "$?" != "0" ]; then + logger "warning: procd flock for $service_name failed" + fi + fi +} + _procd_call() { local old_cb @@ -47,6 +61,7 @@ _procd_call() { } _procd_wrapper() { + procd_lock while [ -n "$1" ]; do eval "$1() { _procd_call _$1 \"\$@\"; }" shift