Systemd har nu ersatt de traditionella uppstarthanterarna i nästan alla Linuxdistributioner. Det finns fortfarande några kvar som ännu inte gett med dig för systemd, men de är få.

Det har ordats mycket om för- och nackdelar med systemd, bland annat mycket om att systemd inte följer UNIX-filosofin “Write programs that do one thing and do it well”. Men oavsett vad så kommer vi inte längre ifrån systemd, och vi måste således lära oss att hantera besten.

Men det finns faktiskt en del fördelar med systemd också - det är nu lättare än någonsin att hoppa mellan olika distributioner eftersom systemd fungerar likadant överallt. Vet du hur du startar och aktiverar en tjänst i CentOS, vet du också hur du startar aktiverar en tjänst i Debian.

Det här är en kort och praktiskt guide till hur du hanterar tjänster i systemd med hjälp utav verktyget systemctl. Som exempeltjänst används här Apache. Under Debian & Ubuntu heter tjänster apache, och under CentOS, Fedora och RedHat heter den httpd.

Aktivera, avaktivera, starta och stoppa tjänster

Att aktivera en tjänst i systemd betyder att den startar automatiskt när Linux-systemet startas. En tjänst aktiveras med kommandot systemctl enable, exempelvis:

[root@centos7 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

För att faktiskt starta tjänsten direkt, utan att behöva starta om maskinen används systemctl start.

[root@centos7 ~]# systemctl start httpd

För att starta om en tjänst, till exempel efter att du ändrat i någon konfiguration används systemctl restart.

[root@centos7 ~]# systemctl restart httpd

Det finns dock ett annat kommando också, systemctl reload, som används för att läsa in konfigurationsfiler på nytt, utan att behöva starta om en tjänst helt och hållet. Det är dock inte alla tjänster som stödjer denna funktion.

[root@centos7 ~]# systemctl reload httpd

För att stoppa en tjänst igen används systemctl stop.

ANNONS FÖR VÅRA EGNA BÖCKER Demonerna på internet

[root@centos7 ~]# systemctl stop httpd

Och till slut, för att avaktivera en tjänst så att den inte startas automatiskt när maskinen startas används systemctl disable.

[root@centos7 ~]# systemctl disable httpd
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

Kontrollera status

För att kontrollera om en tjänst är aktiverad (det vill säga startas automatiskt med systemet) används kommandot systemctl is-enabled, och för att kontrollera om en tjänst är igång just nu används systemctl is-active.

[root@centos7 ~]# systemctl is-enabled httpd
disabled
[root@centos7 ~]# systemctl is-active httpd
active

För att visa alla aktiva tjänster räcker det med att köra systemctl.

[root@centos7 ~]# systemctl
UNIT                                           LOAD   ACTIVE SUB       DESCRIPTION
proc-sys-fs-binfmt_misc.automount              loaded active waiting   Arbitrary Executable File Formats File System 
sys-devices-pci0000:00-0000:00:01.1-ata1-host0-target0:0:0-0:0:0:0-block-sr0.device loaded active plugged   QEMU_DVD-
sys-devices-pci0000:00-0000:00:03.0-virtio0-net-eth0.device loaded active plugged   Virtio network device
sys-devices-pci0000:00-0000:00:04.0-sound-card0.device loaded active plugged   82801FB/FBM/FR/FW/FRW (ICH6 Family) Hi
sys-devices-pci0000:00-0000:00:06.0-virtio1-virtio\x2dports-vport1p1.device loaded active plugged   /sys/devices/pci0
sys-devices-pci0000:00-0000:00:06.0-virtio1-virtio\x2dports-vport1p2.device loaded active plugged   /sys/devices/pci0
sys-devices-pci0000:00-0000:00:07.0-virtio2-block-vda-vda1.device loaded active plugged   /sys/devices/pci0000:00/000
sys-devices-pci0000:00-0000:00:07.0-virtio2-block-vda-vda2.device loaded active plugged   LVM PV ZHwHEI-87YM-QIlq-RWa
sys-devices-pci0000:00-0000:00:07.0-virtio2-block-vda.device loaded active plugged   /sys/devices/pci0000:00/0000:00:
sys-devices-pnp0-00:04-tty-ttyS0.device        loaded active plugged   /sys/devices/pnp0/00:04/tty/ttyS0
sys-devices-virtual-block-dm\x2d0.device       loaded active plugged   /sys/devices/virtual/block/dm-0
sys-devices-virtual-block-dm\x2d1.device       loaded active plugged   /sys/devices/virtual/block/dm-1
sys-module-configfs.device                     loaded active plugged   /sys/module/configfs
sys-subsystem-net-devices-eth0.device          loaded active plugged   Virtio network device
-.mount                                        loaded active mounted   /
boot.mount                                     loaded active mounted   /boot
dev-hugepages.mount                            loaded active mounted   Huge Pages File System
dev-mqueue.mount                               loaded active mounted   POSIX Message Queue File System
run-user-1000.mount                            loaded active mounted   /run/user/1000
sys-kernel-config.mount                        loaded active mounted   Configuration File System
....
LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

101 loaded units listed. Pass --all to see loaded but inactive units, too.

Vill vi bara se tjänster som är i ett running state, kan vi istället använda följande kommando systemctl --all --state=running.

[root@centos7 ~]# systemctl --all --state=running
UNIT                         LOAD   ACTIVE SUB     DESCRIPTION
session-1.scope              loaded active running Session 1 of user jake
session-2.scope              loaded active running Session 2 of user jake
auditd.service               loaded active running Security Auditing Service
chronyd.service              loaded active running NTP client/server
crond.service                loaded active running Command Scheduler
dbus.service                 loaded active running D-Bus System Message Bus
firewalld.service            loaded active running firewalld - dynamic firewall daemon
getty@tty1.service           loaded active running Getty on tty1
httpd.service                loaded active running The Apache HTTP Server
irqbalance.service           loaded active running irqbalance daemon
lvm2-lvmetad.service         loaded active running LVM2 metadata daemon
NetworkManager.service       loaded active running Network Manager
polkit.service               loaded active running Authorization Manager
postfix.service              loaded active running Postfix Mail Transport Agent
rsyslog.service              loaded active running System Logging Service
sshd.service                 loaded active running OpenSSH server daemon
systemd-journald.service     loaded active running Journal Service
systemd-logind.service       loaded active running Login Service
systemd-udevd.service        loaded active running udev Kernel Device Manager
tuned.service                loaded active running Dynamic System Tuning Daemon
dbus.socket                  loaded active running D-Bus System Message Bus Socket
lvm2-lvmetad.socket          loaded active running LVM2 metadata daemon socket
systemd-journald.socket      loaded active running Journal Socket
systemd-udevd-control.socket loaded active running udev Control Socket
systemd-udevd-kernel.socket  loaded active running udev Kernel Socket

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

25 loaded units listed.

Vill vi istället se status för hela systemet kan vi använda systemctl status. Detta ger oss en trädliknande vy över processerna som körs via systemd och deras barnprocesser osv.

[root@centos7 ~]# systemctl status
● centos7.nixnet.jke
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: sön 2018-06-17 21:46:53 CEST; 19min ago
   CGroup: /
           ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
           ├─user.slice
           │ └─user-1000.slice
           │   ├─session-2.scope
           │   │ ├─1458 sshd: jake [priv]   
           │   │ ├─1462 sshd: jake@pts/0    
           │   │ ├─1463 -bash
           │   │ ├─1480 su
           │   │ ├─1484 bash
           │   │ ├─1665 systemctl status
           │   │ └─1666 less
           │   └─session-1.scope
           │     ├─ 658 login -- jake     
           │     └─1437 -bash
           └─system.slice
             ├─httpd.service
             │ ├─1627 /usr/sbin/httpd -DFOREGROUND
             │ ├─1628 /usr/sbin/httpd -DFOREGROUND
             │ ├─1629 /usr/sbin/httpd -DFOREGROUND
             │ ├─1630 /usr/sbin/httpd -DFOREGROUND
             │ ├─1631 /usr/sbin/httpd -DFOREGROUND
             │ └─1632 /usr/sbin/httpd -DFOREGROUND
             ├─rsyslog.service
             │ └─1000 /usr/sbin/rsyslogd -n
             ├─tuned.service
             │ └─997 /usr/bin/python -Es /usr/sbin/tuned -l -P
             ├─sshd.service
             │ └─996 /usr/sbin/sshd -D
             ├─postfix.service
             │ ├─1340 /usr/libexec/postfix/master -w
             │ ├─1345 pickup -l -t unix -u
             │ └─1346 qmgr -l -t unix -u
             ├─NetworkManager.service
             │ ├─660 /usr/sbin/NetworkManager --no-daemon
             │ └─799 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib
             ├─firewalld.service
             │ └─656 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
             ├─crond.service
             │ └─652 /usr/sbin/crond -n
             ├─systemd-logind.service
             │ └─645 /usr/lib/systemd/systemd-logind
             ├─dbus.service
             │ └─631 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
             ├─chronyd.service
             │ └─635 /usr/sbin/chronyd
             ├─irqbalance.service
             │ └─629 /usr/sbin/irqbalance --foreground
             ├─polkit.service
             │ └─628 /usr/lib/polkit-1/polkitd --no-debug
             ├─auditd.service
             │ └─604 /sbin/auditd
             ├─systemd-udevd.service
             │ └─490 /usr/lib/systemd/systemd-udevd
             ├─lvm2-lvmetad.service
             │ └─482 /usr/sbin/lvmetad -f
             └─systemd-journald.service
               └─462 /usr/lib/systemd/systemd-journald

Unit-filer

Systemd är uppbyggt kring något som kallas för units. Detta är filer som konfigurerar varje tjänst som systemd startar och stoppar. En unit-fil innehåller till exempel information om vilken binärfil som ska köras för att starta tjänsten, vilka argument som skall startas med tjänsten, hur tjänsten startas om, stoppas osv. Här finns också information om exempelvis eventuella temporära kataloger, PID-filer osv.

För att visa en unit-fil används kommandot systemctl cat. Exempelvis:

[root@centos7 ~]# systemctl cat httpd

# /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

För att lista alla unit-filer på systemet används kommandot systemctl list-units --all.

Redigera en unit

För att redigera en unit används kommandot systemctl edit. Om vi exempelvis vill redigera Apaches unit och kör systemctl edit httpd kommer vi få en tom fil. Detta eftersom edit som standard bara lägger till värden som ska ändras till en så kallad override-fil. Vill vi ändra den faktiska unit-filen måste vi istället använda systemctl edit httpd --full. Då startas editorn med hela unit-filen. När vi sparar unit-filen skapas en kopia i /etc/systemd/system/. För vår Apache-fil blir detta alltså /etc/systemd/system/httpd.service. Denna fil kommer då att användas som standard istället för originalfilen som fortfarande finns kvar i sin originalform i /lib/systemd/system/. Detta är praktiskt, för om vi skulle vilja återgå till standardkonfigurationen kan vi helt enkelt bara radera httpd.service från /etc/systemd/system/ och då kommer istället unit-filen från /lib/systemd/system att användas.

Avslutning

Vi har än så länge bara skrapat på ytan av systemd. Det är ett gigantiskt system som täcker allt från runlevels, tjänster, loggfiler, omstart av systemet med mera. Men detta är det viktigaste för att kunna hantera tjänster på ett effektivt sätt under systemd. Och som jag nämnde i början så fungerar det på samma sätt under både Debian & Ubuntu och RedHat-baserade system som CentOS och Fedora.


Nyhetsbrev
Nyhetsuppdateringar från tidningen direkt till din inkorg, helt kostnadsfritt. Avsluta när du vill.

Kommentarer

Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.

Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.