From: Roman Yeryomin Date: Thu, 14 Dec 2017 21:54:26 +0000 (+0200) Subject: procd: introduce procd_lock for init script protection X-Git-Tag: v18.06.0-rc1~1433 X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=commitdiff_plain;h=e410f785a4d5676eb71715e8c5c4b3445c6478e3 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 --- 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