<chapter xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         version="5.0"
         xml:id="sec-systemctl">
 <title>Service Management</title>
 <para>
  In NixOS, all system services are started and monitored using the systemd
  program. Systemd is the “init” process of the system (i.e. PID 1), the
  parent of all other processes. It manages a set of so-called “units”,
  which can be things like system services (programs), but also mount points,
  swap files, devices, targets (groups of units) and more. Units can have
  complex dependencies; for instance, one unit can require that another unit
  must be successfully started before the first unit can be started. When the
  system boots, it starts a unit named <literal>default.target</literal>; the
  dependencies of this unit cause all system services to be started, file
  systems to be mounted, swap files to be activated, and so on.
 </para>
 <para>
  The command <command>systemctl</command> is the main way to interact with
  <command>systemd</command>. Without any arguments, it shows the status of
  active units:
<screen>
$ systemctl
-.mount          loaded active mounted   /
swapfile.swap    loaded active active    /swapfile
sshd.service     loaded active running   SSH Daemon
graphical.target loaded active active    Graphical Interface
<replaceable>...</replaceable>
</screen>
 </para>
 <para>
  You can ask for detailed status information about a unit, for instance, the
  PostgreSQL database service:
<screen>
$ systemctl status postgresql.service
postgresql.service - PostgreSQL Server
          Loaded: loaded (/nix/store/pn3q73mvh75gsrl8w7fdlfk3fq5qm5mw-unit/postgresql.service)
          Active: active (running) since Mon, 2013-01-07 15:55:57 CET; 9h ago
        Main PID: 2390 (postgres)
          CGroup: name=systemd:/system/postgresql.service
                  ├─2390 postgres
                  ├─2418 postgres: writer process
                  ├─2419 postgres: wal writer process
                  ├─2420 postgres: autovacuum launcher process
                  ├─2421 postgres: stats collector process
                  └─2498 postgres: zabbix zabbix [local] idle

Jan 07 15:55:55 hagbard postgres[2394]: [1-1] LOG:  database system was shut down at 2013-01-07 15:55:05 CET
Jan 07 15:55:57 hagbard postgres[2390]: [1-1] LOG:  database system is ready to accept connections
Jan 07 15:55:57 hagbard postgres[2420]: [1-1] LOG:  autovacuum launcher started
Jan 07 15:55:57 hagbard systemd[1]: Started PostgreSQL Server.
</screen>
  Note that this shows the status of the unit (active and running), all the
  processes belonging to the service, as well as the most recent log messages
  from the service.
 </para>
 <para>
  Units can be stopped, started or restarted:
<screen>
# systemctl stop postgresql.service
# systemctl start postgresql.service
# systemctl restart postgresql.service
</screen>
  These operations are synchronous: they wait until the service has finished
  starting or stopping (or has failed). Starting a unit will cause the
  dependencies of that unit to be started as well (if necessary).
 </para>
<!-- - cgroups: each service and user session is a cgroup

- cgroup resource management -->
</chapter>
