瀏覽代碼

package/dnsmasq: Fix init script restart command

Restarting dnsmasq can cause constant issues: stop works, but start
fails because the new instance can't bind the socket. Another restart
immediately after works just fine:

    # /etc/init.d/S80dnsmasq restart
    Stopping dnsmasq: OK
    Starting dnsmasq:
    dnsmasq: failed to create listening socket for 192.168.128.1: Address in use
    FAIL
    # /etc/init.d/S80dnsmasq restart
    Stopping dnsmasq: FAIL
    Starting dnsmasq: OK

Solve this by waiting for process to actually stop before returning
from the stop command. Clean up the PID file after to avoid potential
issues with the PID being reused after stop. The wait could also be
placed inside the restart block, but putting it into the stop block
has the advantage that it also avoids similar issues for any other
callers.

Signed-off-by: Fiona Klute <fiona.klute+wiwa@gmx.de>
[yann.morin.1998@free.fr:
  - fix shellcheck
  - reflow commit log
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Fiona Klute 1 年之前
父節點
當前提交
507caef3dd
共有 2 個文件被更改,包括 9 次插入1 次删除
  1. 0 1
      .checkpackageignore
  2. 9 0
      package/dnsmasq/S80dnsmasq

+ 0 - 1
.checkpackageignore

@@ -552,7 +552,6 @@ package/dmalloc/0004-Makefile-use-the-configure-detected-or-user-supplied.patch
 package/dmalloc/0005-configure-use-LD-instead-of-hard-coding-ld.patch lib_patch.Upstream
 package/dmraid/0001-fix-compilation-under-musl.patch lib_patch.Upstream
 package/dmraid/S20dmraid lib_sysv.Variables
-package/dnsmasq/S80dnsmasq Shellcheck
 package/docker-engine/S60dockerd Shellcheck lib_sysv.Indent lib_sysv.Variables
 package/docopt-cpp/0001-only-build-one-target-use-BUILD_SHARED_LIBS-where-appropriate.patch lib_patch.Upstream
 package/domoticz/S99domoticz Shellcheck

+ 9 - 0
package/dnsmasq/S80dnsmasq

@@ -10,12 +10,21 @@ case "$1" in
 		printf "Starting dnsmasq: "
 		start-stop-daemon -S -p "$PIDFILE" -x "/usr/sbin/$DAEMON" -- \
 			--pid-file="$PIDFILE"
+		# shellcheck disable=SC2181
 		[ $? = 0 ] && echo "OK" || echo "FAIL"
 		;;
 	stop)
 		printf "Stopping dnsmasq: "
 		start-stop-daemon -K -q -p "$PIDFILE" -x "/usr/sbin/$DAEMON"
+		# shellcheck disable=SC2181
 		[ $? = 0 ] && echo "OK" || echo "FAIL"
+		# wait for dnsmasq process to be gone
+		while true; do
+			pid="$( cat "${PIDFILE}" 2>/dev/null || true )"
+			{ [ -n "${pid}" ] && [ -d "/proc/${pid}" ]; } || break
+			sleep 0.1
+		done
+		rm -f "$PIDFILE"
 		;;
 	restart|reload)
 		$0 stop