# Check Systemd unit

## Introduction

This check shows the status of a systemd unit.

A unit is everything listed by systemctl command - services, timers, targets, ...

## Requirements

* `systemctl` binary

## Syntax

```txt
______________________________________________________________________

CHECK_SYSTEMDUNIT
v1.2

(c) Institute for Medical Education - University of Bern
Licence: GNU GPL 3

https://os-docs.iml.unibe.ch/icinga-checks/Checks/check_systemdunit.html
______________________________________________________________________

Check a unit using systemctl status.

The status is unknown if the command systemctl is not found.
The status is critical if the service does not exist or is not running.

SYNTAX:
  check_systemdunit [-h|-l|-s|-r] UNIT

OPTIONS:

  -h     this help
  -l     list all units
  -s     list service units
  -r     handle UNIT as a regex and search for a single unit. A uniq regex
         is needed to match a single unit. The initial idea was to match a
         servie that has different service names on differen os eg.
         - apache2 vs httpd
         - mysld vs mariadb

  UNIT   Name of a unit - see output of 'systemctl' 

EXAMPLES:

  check_systemdunit -s
         list all existing services. For a unit check you need to add the name
         in the 1st column.

  check_systemdunit nginx.service
         show status of nginx webservice

  check_systemdunit -r "(apache2|httpd)\.service"
         Detect name of Apache httpd service by given regex and show status
         of the found service name

```

## Examples

### List services

You maybe want to start to get a list of services to pick an existing one that you wanna check periodically.

You can use ``systemctl --no-legend --no-pager --type service`` or ``$ ./check_systemdunit -s``

```txt
List of service units:

  alsa-restore.service                                  loaded active exited  Save/Restore Sound Card State
  apparmor.service                                      loaded active exited  Load AppArmor profiles
  avahi-daemon.service                                  loaded active running Avahi mDNS/DNS-SD Stack
  bluetooth.service                                     loaded active running Bluetooth service
  clamav-daemon.service                                 loaded active running Clam AntiVirus userspace daemon
  clamav-freshclam.service                              loaded active running ClamAV virus database updater
  colord.service                                        loaded active running Manage, Install and Generate Color Profiles
  cronie.service                                        loaded active running Periodic Command Scheduler
  ...
```

### Check a service

To check a single service you need to add the unit name in the 1st column.

``$ ./check_systemdunit nginx`` returns

```txt
OK: ● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Tue 2023-09-05 08:04:45 CEST; 8h ago
    Process: 577 ExecStart=/usr/bin/nginx -g pid /run/nginx.pid; error_log stderr; (code=exited, status=0/SUCCESS)
   Main PID: 612 (nginx)
      Tasks: 2 (limit: 18881)
     Memory: 3.0M
        CPU: 38ms
     CGroup: /system.slice/nginx.service
             ├─612 "nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;"
             └─613 "nginx: worker process"
...
```

If a service does not exist: ``./check_systemdunit justadummy`` returns

```txt
CRITICAL: Unit justadummy.service could not be found.
```

### Other units

With ``$ ./check_systemdunit -l`` you get a grouped list of all unit types. check_systemdunit handles all types - not only services.