Hi,
> the check could be just something like
>
> lsof /dev/log >/dev/null || exit 1
I think
fuser /dev/log >/dev/null 2>/dev/null || exit 1
is more efficient, but there is a problem with both approaches: the process
that is listening on /dev/null may be invisible to us, because it may be
running in a different namespace.
The only way to reliably determine whether there is a Unix server listening on
the /dev/log socket is to try to connect to the socket.
One approach I can think of is to use
unixclient /dev/log /bin/true 2>&1 | grep -q '^connect: Protocol wrong type for
socket' || exit 1
This creates a SOCK_STREAM socket and tries to connect it to /dev/log, which
will fail with EPROTOTYPE if there is a listening server (which will use
SOCK_DGRAM) and with ECONNREFUSED if not.
Using unixclient would introduce a semi-esoteric dependency on ucspi-unix, but
it's a tiny package which is a good match for the runit ecosystem anyway, so
maybe it's acceptable.
A more mainstream but much more heavyweight approach would be to use socat(1)
or netcat-openbsd with the -U option.
Alternatively, socklog provides its own socklog-check, which does exactly what
is necessary, but the whole point of trying to detect whether *any* syslog
daemon is running is to avoid having to install a particular one like socklog,
so we probably shouldn't use it.
OTOH, it's such a tiny program, and so unlikely to require changes ever, you
might even ship (a copy of) it as part of the runit package.
AndrĂ¡s
--
I break into song if I can't find the key.