From e372f97bebd4866633ad56aa5d5b1ae59fa88118 Mon Sep 17 00:00:00 2001 From: William Hubbs Date: Wed, 13 May 2015 14:47:35 -0500 Subject: [PATCH] Fix the s6 handling This changes the default s6 service directory to /var/svc.d, also it changes the code to work with the individual services instead of forcing a rescan when a service is started or stopped. --- man/openrc-run.8 | 2 +- s6-guide.md | 4 ++-- sh/s6.sh | 34 ++++++++++++++++++---------------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/man/openrc-run.8 b/man/openrc-run.8 index 259d23fc..0a9f5bcc 100644 --- a/man/openrc-run.8 +++ b/man/openrc-run.8 @@ -114,7 +114,7 @@ in this release is S6 from Skarnet software. To use this, set supervisor=s6. .It Ar s6_service_path The path to the s6 service directory if you are monitoring this service -with S6. The default is /etc/svc.d/${RC_SVCNAME}. +with S6. The default is /var/svc.d/${RC_SVCNAME}. .It Ar s6_svwait_options_start The options to pass to s6-svwait when starting the service via s6. .It Ar s6_svwait_options_stop diff --git a/s6-guide.md b/s6-guide.md index 4a37a9cc..9a09e32e 100644 --- a/s6-guide.md +++ b/s6-guide.md @@ -37,10 +37,10 @@ s6_service_path - the path to the s6 service directory s6_svwait_options_start - the options to pass to s6-svwait when starting s6_svwait_options_stop - the options to pass to s6-svwait when stopping. -The s6_service_path variable defaults to /etc/svc.d/${RC_SVCNAME} if it +The s6_service_path variable defaults to /var/svc.d/${RC_SVCNAME} if it is not set in the service script. For example, if you want a service script called /etc/init.d/foobar to use s6 to monitor its daemon, the s6 -service should be the directory /etc/svc.d/foobar. +service should be the directory /var/svc.d/foobar. See the documentation for s6 for more information about s6 service directories. diff --git a/sh/s6.sh b/sh/s6.sh index 780beab2..01527b6d 100644 --- a/sh/s6.sh +++ b/sh/s6.sh @@ -2,7 +2,7 @@ # Copyright (c) 2015 William Hubbs # Released under the 2-clause BSD license. -[ -z "${s6_service_path}" ] && s6_service_path="/etc/svc.d/${RC_SVCNAME}" +[ -z "${s6_service_path}" ] && s6_service_path="/var/svc.d/${RC_SVCNAME}" s6_start() { @@ -10,16 +10,17 @@ s6_start() eerror "${s6_service_path} does not exist." return 1 fi - local rc + s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}" ebegin "Starting ${name:-$RC_SVCNAME}" - ln -sf "${s6_service_path}" "${RC_SVCDIR}"/s6-scan - s6-svscanctl -an "${RC_SVCDIR}"/s6-scan - rc=$? + ln -sf "${s6_service_path}" "${s6_service_link}" + s6-svc -u "${s6_service_link}" if [ -n "$s6_svwait_options_start" ]; then - s6-svwait ${s6_svwait_options_start} "${s6_service_path}" - rc=$? + s6-svwait ${s6_svwait_options_start} "${s6_service_link}" fi - eend $rc "Failed to start $RC_SVCNAME" + sleep 1.5 + set -- $(s6-svstat "${s6_service_link}") + [ "$1" = "up" ] + eend $? "Failed to start $RC_SVCNAME" } s6_stop() @@ -28,19 +29,20 @@ s6_stop() eerror "${s6_service_path} does not exist." return 1 fi - local rc + s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}" ebegin "Stopping ${name:-$RC_SVCNAME}" - rm -rf "${RC_SVCDIR}/s6-scan/${s6_service_path##*/}" - s6-svscanctl -an "${RC_SVCDIR}"/s6-scan - rc=$? + s6-svc -d "${s6_service_link}" if [ -n "$s6_svwait_options_stop" ]; then - s6-svwait ${s6_svwait_options_stop} "${s6_service_path}" - rc=$? + s6-svwait ${s6_svwait_options_stop} "${s6_service_link}" fi - eend $rc "Failed to stop $RC_SVCNAME" + sleep 1.5 + set -- $(s6-svstat "${s6_service_link}") + [ "$1" = "down" ] && rm -fr "${s6_service_link}" + eend $? "Failed to stop $RC_SVCNAME" } s6_status() { - s6-svstat "${s6_service_path}" + s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}" + s6-svstat "${s6_service_link}" }