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