23. Aanmaak en beheer van services

Service of Daemon is de term die binnen besturingssystemen gebruikt wordt om een proces aan te duiden dat op de achtergrond actief is om bepaalde taken uit te voeren of om diensten te verlenen aan andere computerprogramma’s.

Een service heeft een ander karakter dan een taak. Een taak is een opdracht die in principe eindig is en binnen een tijdsvenster werkt. Een service is altijd aktief.

Enkele voorbeelden van services.

  • web server httpd
  • php engine php-fpm
  • ldap server slapd
  • sip2server
  • explorator
  • procman

Enkele voorbeelden van taken.

  • backup procedures
  • indexeren
  • aanmaak van documentatie
  • nachtprocedures voor de leen, acquisitie, impala

In dit document geven wij een aantal richtlijnen om een service te installeren op een Brocade server.

23.1. Richtlijn

Beheer services met Systemd
Het opensourceprogramma systemd is een vervanger voor de init-daemon op Unix. Het is een systeem om services te starten en te stoppen.
Beheer taken met Procman
De toolcat applicatie procman is een tool die het opstarten en beheer van taken controleert.

23.2. Beheer van services met Systemd

Red Hat Enterprise 7 en andere recente distributies hebben System V vervangen door systemd. Systemd gebruikt een nieuwe en verbeterde manier om uw systeem te starten en systeemdiensten te beheren.

In plaats van scripts bij System V, gebruikt systemd .service unit bestanden waarin verschillende aanwijzingen en opdrachten voor systemd staan.

Een voorbeeld: mutil.service unit bestand

[Unit]
Description=M Database
After=local-fs.target network.target remote-fs.target

[Service]
Type=simple
User=root
Group=db
EnvironmentFile=/etc/sysconfig/php-fpm
ExecStartPre=
ExecStart=/library/bin/mutil -start
ExecStop=/library/bin/mutil -stop
RemainAfterExit=True

[Install]
WantedBy=multi-user.target

De systeembeheerder krijgt nieuwe hulpmiddelen zoals systemctl om het systeem te beheren. Vb. Om de status van mutil te controleren gebruik je:

systemctl status mutil
 mutil.service - M Database
   Loaded: loaded (/etc/systemd/system/mutil.service; enabled; vendor preset: disabled)
   Active: active (exited) since Thu 2018-02-08 22:29:05 CET; 13h ago
  Process: 5133 ExecStart=/library/bin/mutil -start (code=exited, status=0/SUCCESS)
 Main PID: 5133 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mutil.service
           └─6001 /library/mumps/gtm/mupip replicate -source -start -passive -log=/library/mumps/brocade/g/DB_passive_dummy.log -inst=dummy -updok

Services in- en uitschakelen.

  • Service starten: systemctl start <service>
  • Service stoppen: systemctl stop <service>
  • Service configuratie herladen: systemctl reload <service>
  • Service status opvragen: systemctl status <service>
  • Service en-ablen: systemctl enable <service>
  • Service dis-ablen: systemctl disable <service>
  • Service logging: journalctl -u <service>

Service informatie opvragen.

  • systemd-analyze time: Toont hoeveel tijd het systeem nodig had om te starten.
  • systemd-analyze blame: Zoekt naar diensten die (te) veel tijd nodig hadden om te starten.
  • systemd-analyze plot > bootchart.svg: maakt een grafiek van het starten van uw systeem. De grafiek bootchart.svg kun je met elke moderne browser openen en bekijken.
  • systemctl dot: Toont de relaties tussen de verschillende diensten. Gebruik de opdracht systemctl dot –order | dot -Tsvg > systemd-order.svg om de informatie in een vectorieel grafisch formaat op te slaan (eveneens te bekijken met een moderne browser).

Fouten opsporen.

Voeg bij het opstarten van de computer aan de opstartregel de volgende kernelopties toe om de debugmode te activeren: systemd.log_target=kmsg systemd.log_level=debug Na het starten van het systeem kan je de vele meldingen van systemd opvragen met dmesg of dmesg | grep systemd.

23.3. Systemd en Salt

De aanmaak van Systemd unit bestand en de installatie van services op een Brocade server gebeurt in Salt.

Een voorbeeld: salt systemd script voor mutil

systemd:
  units:
    mutil:
        enable: True
        Description: M Database
        After: local-fs.target network.target remote-fs.target
        Type: simple
        EnvironmentFile: /etc/sysconfig/php-fpm
        ExecStartPre: /bin/sleep 30
        ExecStart: {{ bin_dir }}/mutil -start
        ExecStop: {{ bin_dir }}/mutil -stop
        RemainAfterExit: True
        WantedBy: multi-user.target

23.4. Richtlijn voor service toolcat applicaties

Voor service toolcat applicaties (zoals mutil, explorator, sip2server, …):

  • Definieer een Systemd service unit bestand in Salt.
  • Definieer een start, stop, restart, status ingang die gebruik maakt van de registry-waarde os-service. (os-service: systemctl <action> <service>)

Voorbeeld: explorator

explorator.py

@toolcat.toolcatCommand(triggers="stop")
def explorator_stop(this):
    command = "r4_os_service".replace('<action>', 'stop').replace('<service>', 'explorator')
    os.system(command)

@toolcat.toolcatCommand(triggers="start")
def explorator_start(this):
    command = "r4_os_service".replace('<action>', 'start').replace('<service>', 'explorator')
    os.system(command)

@toolcat.toolcatCommand(triggers="status")
def explorator_status(this):
    command = "r4_os_service".replace('<action>', 'status').replace('<service>', 'explorator')
    os.system(command)

@toolcat.toolcatCommand(triggers="restart")
def explorator_restart(this):
    command = "r4_os_service".replace('<action>', 'restart').replace('<service>', 'explorator')
    os.system(command)

Salt systemd script

explorator:
    enable: True
    Description: Explorator
    After: local-fs.target network.target remote-fs.target mutil.service
    Type: simple
    EnvironmentFile: /etc/sysconfig/php-fpm
    ExecStartPre: /bin/sleep 10
    ExecStart: {{ bin_dir }}/explorator -daemon start reset=300
    ExecStop: {{ bin_dir }}/explorator -daemon stop
    RemainAfterExit: True
    WantedBy: multi-user.target

explorator -start –> systemctl start explorator –> explorator -daemon start reset=300

explorator -stop –> systemctl stop explorator –> explorator -daemon stop

explorator -status –> systemctl status explorator

Waarschuwing

Zorg ervoor dat de code voor de stop procedure synchroon verloopt en dus wacht (liefst met een timeout) totdat de service effectief gestopt is.

23.5. Knowledge base

Indien men een service definieert en niet gekend is door Systemd, kan dit een fout veroorzaken in het OS waardoor mogelijk de server hangt na een reboot en wacht op een F1 toets aanslag

Systemd stuurt een SIGKILL naar alle overblijvende unix processen in de laatste faze. In het geval een proces blijft hangen (waardoor mogelijk de server blijft hangen), triggert de Systemd waakhond na 10 minuten een hardware reset. Door deze reset blijft de server wachten op de F1 toets. Voorbeeld hiervan was de zebra service.

Update: Disable de BIOS setting ‘wait for F1 key’ om te vermijden dat de server blijft wachten op de F1 toets.

Systemd stopt normaal gezien al de child processes die onder een service gestart zijn
Voor Procman is hiervoor een uitzondering gemaakt. Dus indien Procman gestopt word door Systemd, dan blijven al de procman processen die op dat moment aktief zijn, behouden. (Zie Systemd unit parameter KillMode: process)
Delphi-waarde reboot-exe = /sbin/shutdown -r +1 ‘Brocade reboot:’
Reboot start pas na 1 minuut. Dit geeft het procman proces de kans om logging in docman te finalizeren.