logind hangs
If you just updated systemd and ssh to that host seems to hang, that's just a known Bug (Debian Bug #770135). Don't panic. Wait for the logind timeout and restart logind.
restart and stop;start
One thing that confused me several times and still confuses people is
systemctl restart
doing more than systemctl stop ; systemctl
start
. You will notice the difference once you have a failed service. A
restart
will try to start the service again. Both stop
and start
however will just ignore it. Rumors have it this has changed post
jessie however.
sysvinit-wrapped services and stop
While there are certainly bugs with sysvinit services in general (I
found myself several times without a local resolver as unbound
failed to be started, haven't managed to debug further), the stop
behavior of wrapped services is just broken. systemctl stop
will
block until the sysv initscript finished. It will even note the result
of the action in its state. However systemctl will return with
exitcode 0 and not output anything on stdout/stderr. This has been
reported as
Debian Bug #792045.
zsh helper
I found the following zshrc snipped quite helpful in dealing with
non-reported systemctl
failures. On root shells it will display a
list of failed services as part of the prompt. This will give proper
feedback whether your systemctl stop
failed, it will give feedback
if you still have type=simple
services and if the sysv-init script
or wrapper is broken.
precmd () {
if [[ $UID == 0 && $+commands[systemctl] != 0 ]]
then
use_systemd=true
systemd_failed="`systemctl --state=failed | grep failed | cut -d \ -f 2 | tr '\n' ' '`"
fi
}
if [[ $UID == 0 && $+commands[systemctl] != 0 ]]
then
PROMPT=$'%{$fg[red]>> $systemd_failed$reset_color%}\n'
else
PROMPT=""
fi
PROMPT+=whateveryourpromptis
zsh completion
Speaking of zsh, there's one problem that bothers me a lot and I don't
have any solution for. Tab-completing the service name for service
is
blazing fast. Tab-completing the service name for systemctl restart
takes ages. People traced down to truckloads of dbus communication for
the completion but no further fix is known (to me).
type=simple services
As described in length by
Lucas Nussbaum
type=simple
services are actively harmful. Proper type=forking
daemons are strictly superior (they provide feedback of finished
initialization and success thereof) and type=notify
services are so
simple there's no excuse for not using them even for private one-off
hacks. Even if you're language doesn't provide libsystemd-daemon
bindings:
(defun sd-notify (event-string)
(let ((socket (make-instance 'sb-bsd-sockets:local-socket :type :datagram))
(name (posix-getenv "NOTIFY_SOCKET"))
(bufferlen (length event-string)))
(when name
(sb-bsd-sockets:socket-connect socket name)
(sb-bsd-sockets:socket-send socket event-string bufferlen))))
This is a stable API guaranteed to not break in the future and implemented in less than ten lines of code with just basic socket functions. And if your language has support it becomes actually trivial:
try:
import systemd
systemd.daemon.notify("READY=1")
except ImportError:
pass
Note that in both cases there is no drawback at all on systemd-free
setups. It has the overhead of checking the process' environment for
NOTIFY_SOCKET
or for the systemd
package and behaves like a simple
service otherwise.
Actually the idea of separating the technical aspect (daemonizing) from the semantic aspect of signalizing "initialization finished, everything's fine" is a pretty good idea and hopefully has the potential to reduce the number of services signalizing the "everything's fine" too early. It could even be ported to non-systemd init systems easily given the API.