Hi Michael,
Quoting Michael Biebl (2012-08-23 04:08:58)
> In addition to invoke-rc.d/update-rc.d it would be great if the
> "service" command had native support for systemd. It already has support
> of upstart, so it should be easy to extend in a similar way for systemd.
A patch is attached to this message. Please have a look and tell me if
you’re okay with it. I’ve tested it on my system and it seems to work
fine.
Best regards,
Michael
--- /usr/sbin/service.O 2012-08-27 22:56:52.201353960 +0200
+++ /usr/sbin/service 2012-08-27 23:33:57.998237177 +0200
@@ -47,6 +47,11 @@
ACTION=
SERVICEDIR="/etc/init.d"
OPTIONS=
+is_systemd=
+
+if [ -e "/sys/fs/cgroup/systemd" ]; then
+ is_systemd=1
+fi
if [ $# -eq 0 ]; then
echo "${USAGE}" >&2
@@ -79,7 +84,20 @@
echo " [ ? ] $SERVICE" 1>&2
continue
else
- out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
+ if [ -n "$is_systemd" ]; then
+ # NB: We cannot use systemctl is-active because
+ # that will also return with exit code 0 for
+ # scripts such as /etc/init.d/tor
+ # (sysv-compat-layer) which uses RUN_DAEMON from
+ # /etc/default/tor and then just exits.
+ # Intuitively, users don't want to see such
+ # services as active, plus it doesn't match what
+ # the init script did, so we check if SubState is
+ # running.
+ out=$(systemctl show -p SubState "${SERVICE}.service" 2>&1 | grep 'SubState=running')
+ else
+ out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
+ fi
if [ "$?" = "0" -a -n "$out" ]; then
#printf " %s %-60s %s\n" "[+]" "$SERVICE:" "running"
echo " [ + ] $SERVICE"
@@ -99,8 +117,13 @@
elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
SERVICE="${1}"
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
- env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" stop
- env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" start
+ if [ -n "$is_systemd" ]; then
+ env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" systemctl stop "${SERVICE}.service"
+ env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" systemctl start "${SERVICE}.service"
+ else
+ env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" stop
+ env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" start
+ fi
exit $?
fi
elif [ -z "${SERVICE}" ]; then
@@ -131,6 +154,21 @@
esac
fi
+if [ -n "$is_systemd" ]
+then
+ # We are running on systemd. For supported actions, we directly call
+ # systemctl instead of calling the init script (which diverts to systemctl
+ # due to the lsb-functions diversion anyways).
+ case "${ACTION}" in
+ start|stop|restart|status|reload)
+ exec systemctl "${ACTION}" "${SERVICE}.service"
+ ;;
+ force-reload)
+ exec systemctl restart "${SERVICE}.service"
+ ;;
+ esac
+fi
+
# Otherwise, use the traditional sysvinit
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
exec env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
_______________________________________________
Pkg-sysvinit-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-sysvinit-devel