Re: OpenRC now supports daemon supervision using s6

From: Guillermo <gdiazhartusch_at_gmail.com>
Date: Sat, 18 Jun 2016 18:20:54 -0300

2015-07-25 16:43 GMT-03:00 Guillermo:
>
> Since version 0.16, OpenRC can launch supervised daemons using
> s6, as an alternative to (its implementation of) start-stop-daemon(8).

And for release 0.21, the authors have also rolled their own
experimental process supervision tool: the supervise-daemon(8)
program.

<https://github.com/OpenRC/openrc/blob/master/supervise-daemon-guide.md>

Service scripts can specify that daemons they launch should be
supervised by it by including a 'supervisor=supervise-daemon'
assignment. No start() and stop() functions are allowed in this case,
and the daemon and its command line arguments have to be specified by
assignments to 'command' and 'command_args', just like when using
start-stop-daemon(8). Specifying a PID file (by assignment to
'pidfile') is mandatory, probably so that the openrc and rc-service
programs know which supervise-daemon process to kill when the
corresponding service is wanted down. Yeah, I can hear the screams
:-D, but I guess OpenRC can't do it any other way without a major
redesign. Anyway, I thought it still deserved a mention :)

Process supervision with s6 (specified in service scripts with a
'supervisor=s6' assignment and a 'need s6-svscan' dependency)
continues to be supported. In fact, for release 0.21 they have also
fixed the s6-svc invocations in OpenRC's code, so this feature should
now work with s6-2.2.0.0 and later.

G.
-------------------
Short demonstration
-------------------
$ cat /home/test-user/useless-daemon

#!/bin/execlineb -S1
s6-setuidgid test-user
foreground { fdmove -c 1 2 echo useless-daemon (re)started }
sleep $1

$ cat /home/test-user/useless-daemon-log

#!/bin/nosh
# Because, why not? xD
fifo-listen --uid 1000 /home/test-user/useless-daemon-fifo
setuidgid test-user
fdmove --copy 0 3
cyclog /home/test-user/useless-daemon-logdir

$ cat /etc/init.d/useless-daemon-supervised

#!/sbin/openrc-run
supervisor=supervise-daemon
command=/home/test-user/useless-daemon
command_args=$sleep_seconds
pidfile=/home/test-user/useless-daemon.pid
supervise_daemon_args="--stderr /home/test-user/useless-daemon-fifo"

depend() {
   need useless-daemon-logger
}

$ cat /etc/init.d/useless-daemon-logger

#!/sbin/openrc-run
supervisor=supervise-daemon
command=/home/test-user/useless-daemon-log
pidfile=/home/test-user/useless-daemon-log.pid

$ cat /etc/conf.d/useless-daemon-supervised

sleep_seconds=10

$ sudo rc-service useless-daemon-supervised start

 * Starting useless-daemon-logger ... [ ok ]
 * Starting useless-daemon-supervised ... [ ok ]

$ rc-status

[...]
Dynamic Runlevel: needed/wanted
 useless-daemon-logger [ started ]
[...]
Dynamic Runlevel: manual
 useless-daemon-supervised [ started ]

$ ps -eo pid,ppid,args | grep $(cat /home/test-user/useless-daemon-log.pid)

 2802 1 supervise-daemon --start --pidfile
/home/test-user/useless-daemon-log.pid
/home/test-user/useless-daemon-log --
 2875 2802 cyclog /home/test-user/useless-daemon-logdir

$ ps -eo pid,ppid,args | grep $(cat /home/test-user/useless-daemon.pid)

 2824 1 supervise-daemon --start --pidfile
/home/test-user/useless-daemon.pid --stderr
/home/test-user/useless-daemon-pipe /home/test-user/useless-daemon --
10
 2884 2824 sleep 10

(Yeah, not a supervision *tree*, but...)

$ sudo rc-service useless-daemon-supervised stop

 * Stopping useless-daemon-supervised ... [ ok ]

$ sudo rc-service useless-daemon-logger stop

 * Stopping useless-daemon-logger ... [ ok ]

$ tai64nlocal /home/test-user/useless-daemon-logdir/current

2016-06-18 16:32:08.419976087 useless-daemon (re)started
2016-06-18 16:32:18.670540023 useless-daemon (re)started
2016-06-18 16:32:28.893868416 useless-daemon (re)started
2016-06-18 16:32:39.102626965 useless-daemon (re)started
2016-06-18 16:32:49.304317136 useless-daemon (re)started
[...]
Received on Sat Jun 18 2016 - 21:20:54 UTC

This archive was generated by hypermail 2.3.0 : Sun May 09 2021 - 19:44:19 UTC