Home

  server

Linux::Processen

Processen Introductie

Alles wat op een Linux-systeem gebeurt, is in de vorm van een proces; een taak die door het besturingssysteem gestart wordt en processorcapaciteit claimt.

Er kunnen in principe 2 soorten processen actief zijn:
1. De processen die door de computer tijdens het opstarten geactiveerd worden zoals init, syslogd, etc. Deze automatisch bij het opstarten geactiveerde processen noemen we deamons.
2. De tweede soort zijn de interactieve processen die door de gebruikers opgestart worden door een commando in te typen. Elk commando veroorzaakt een proces, het is de enige manier om systeembronnen van de kernel te vragen.

Alle processen hebben een Proces-ID waarmee het bij de kernel bekend is. Ook om procesbeheer, zoals het uitschakelen, uit te voeren moet gebruik gemaakt worden van dit PID. Dit nummer wordt toegekend in de volgorde van opstarten.
PID 1 is altijd het proces 'init', de moeder van alle processen, elk ander proces komt namelijk voort uit 'init'.
Voor een overzicht van alle active processen is het commando # ps aux of voor een continue update # top .

Proces INIT
Het proces init is het belangrijkste op een Linux computer.
Tijdens het opstarten van de computer zorgt Lilo of Grub ervoor dat de kernel geactiveerd wordt. Als de kernel geladen is zorgt deze er voor dat 'init' met PID 1 gestart wordt.
Init bepaald wat er vervolgens met het systeem gebeurt en zorgt er ook voor dat alle andere processen gestart kunnen worden. Hierbij wordt het instellingenbestand '/etc/inittab' gebruikt. Klik hier om een voorbeeld te openen.
In 'inittab' wordt onder andere geregeld in welk runlevel de computer actief wordt. Per runlevel wordt bepaald welke processen al dan niet geactiveerd worden en worden de relevante opstartscripts ter initialisering van het systeem uitgevoerd.

RC script
Het proces init bepaalt met script '/etc/rc' op basis van het in '/etc/inittab' onder id:x:initdefault gegeven level, welke subdirectory met symbolic links aangesproken wordt. Als de ingestelde initdefault bijv. 3 is zal script '/etc/rc' de directory '/etc/rc.d/rc3.d' oproepen en in dit bestand bevinden zich de symbolic links naar de scripts in '/etc/rc.d/init.d' die de gewenste processen activeren.
Als de symbolic link begint met 'S' is het een Start van het proces en beginnend met 'K' een Kill. Na deze letter volgt een nummer waarmee de volgorde waarmee het proces 'init' de scripts uit moet voeren.

Processen handmatig stoppen en starten
Klik hier voor een lijst met processen (services) die in '/etc/rc.d/init.d' voor (kunnen) komen.
De symbolic links in /etc/rc.d/rcx.d sturen de betreffende processen in '/etc/rc.d/init.d' aan.

Deze processen kunnen ook handmatig gestart en gestopt worden.
Dit kan nuttig zijn als er bijvoorbeeld wijzigingen aangebracht zijn in het configuratiebestand van een proces of service. Door de betreffende service handmatig te herstarten (stoppen en starten) worden de wijzigingen aktief zonder dat een reboot van de gehele computer nodig is.
Om bijvoorbeeld de webserver opnieuw te stoppen/starten/herstarten geven we het volgende commando's:
# /etc/rc.d/init.d/httpd stop
# /etc/rc.d/init.d/httpd start
# /etc/rc.d/init.d/httpd restart

In plaats van bovenstaande commando's kunnen we ook gebruik maken van commando: #systemctl bijvoorbeeld voor smb
# systemctl stop smb of systemctl stop smb.service
# systemctl start smb of systemctl start smb.service
# systemctl restart smb of systemctl restartp smb.service

Naar index

Processen Beheer

Processen monitoren
In de introductie is al vermeld hoe we van de commandoregel alle active processen kunnen monitoren met commando # ps aux of met het commando # top waarmee deze listing wordt gegeven met het meest actieve process bovenaan.
Deze commando's worden ook gebruikt om het PID (Process IDentification) nummer van een proces te vinden. Om snel gericht te zoeken naar het PID van bijv. het proces dhcp kan dat ook met commando # ps aux | grep dhcp

Deactiveren van processen
Er zijn globaal drie werkwijzen:
1.  Interactieve processen gestart in shell-venster door gebruiker dmv. Ctrl-C
2.  Bij automatisch gestartte processen: Vindt PID, bijv 666, en gebruik commando # kill 666
3.  Gebruik commando # killall dhcp en hiermee worden in dit geval alle dhcp processen gestopt.

Bij optie 2 zal het proces netjes verwijderd worden.
Lukt dit niet dan kan de switch -9 toegevoegd worden bijv. # kill 666 -9. Het nadeel hierbij is dat er onjuist afgemeld wordt bij de kernel, waardoor het systeem instabiel wordt. Een herstart van het hele systeem is dan noodzakelijk.
Bij optie 3 is het nadeel dat alle processen met de gegeven naam verwijderd worden. Bijvoorbeeld is, voor elke gebruiker die aan het printen is, een afzonderlijk 'lpd' proces actief. # killall lpd zal dan al deze processen verwijderen.

Afhankelijkheidsrelaties tussen processen.
Het verwijderen van processen lukt niet altijd, bijvoorbeeld als er andere processen voorkomen die afhankelijk zijn van het te killen proces. Nuttig is in dit geval het commando # pstree. Dit commando resulteerd in een 'tree' met het overzicht van alle actieve processen en hoe de afhankelijkheidsrelaties geregeld zijn.
Zie ook # man pstree

Naar index

Processen Schedulen

Linux biedt mogelijkheden processen in de toekomst uit te laten voeren. Dit gebeurt door gebruik te maken van de functionaliteit van de deamon 'cron' of het commando # at

De deamon 'cron'
Het proces 'crond' runt de deamon cron en deze zorgt ervoor dat processen worden geactiveerd op basis van tekstbestanden waarin staat wanneer welke processen moeten worden opgestart. De inhoud van deze bestanden wordt in het geheugen geladen.
De deamon wordt op de meeste systemen elke minuut actief, kijkt in de crontab-bestanden en voert op de achtergrond de commando's uit die gespecificeerd zijn voor de huidige minuut. Zie tevens # man cron voor meerdere opties.

  1. Eerst kijkt Cron of er tekstbestanden zijn met cron-instructies in '/var/spool/cron/'.
    De bestanden die hierin voorkomen hebben dezelfde naam als de gebruikers zoals gespecificeerd in '/etc/passwd'.
    De locatie kan verschillen per distributie, maar is snel te vinden met commando # locate /root , en zoek naar een locatie-pad waarin tevens ergens '/cron/' voorkomt. De commando's die in deze bestanden voorkomen zijn gekoppeld aan individuele gebruikers.
  2. Vervolgens kijkt Cron in het algemene bestand '/etc/crontab' naar instructies.
  3. Daarna kijkt Cron of er nog bestanden staan in '/etc/cron.d'.
    Deze laatste is bedoeld voor en geïnstalleerd door applicaties waarvoor processen gescheduled moeten worden.

Crontab commando-regels
Elke regel in een cron-bestand begint met 5 velden waarmee de tijd van de uitvoering van het commando wordt gespecificeerd, daarna de eigenaar van de instructie en vervolgens het commando (met path) dat uitgevoerd moet worden of een omgevingsvariabele die ingesteld moet worden. Tot slot kan nog info achter het # hekje geplaatst worden.

De vijf tijd-velden staan voor:
minuten| uren| dag van de maand| maand| dag van de week

Op basis hiervan kan een cron bestand er als volgt uitzien:

01 * * * * root /usr/local/bin/dingdong # 1e minuut van elk uur, dag, maand of week het script dingdong uitvoeren
15 4 * * * root /etc/foohday # 15e minuut van het 4e uur van elke dag, maand of week
22 7 * * 0 root /usr/local/bin/backupg2 # 22e min. van het 7e uur van elke eerste weekdag het script backupg2 uitvoeren
42 4 1 * * root /etc/foohmonth # 42e min van 4e uur van 1e dag van elke maand
01 * * 7 * root /etc/foohyear # 1e minuutvan elke 7e maand van het jaar

Met het commando # crontab -l kan het cron tekstbestand van de huidige gebruiker bekeken worden en bewerkt worden met commando # crontab -e.
Zie voor een praktijk voorbeeld van een CRON toepassing Exploringlinux-Gallery-Backup

Crontab en 'bash' scripts
Crontab start zijn eigen environment en dat is meestal nog in 'sh' terwijl de huidige distributies verder veelal werken met 'bash'.
Als zo'n script met 'bash' commando's uitgevoerd wordt door CRON onder 'sh' kan het voorkomen dat bepaalde commando's niet herkend worden en zal het script crashen. Om dit te voorkomen is het zo wie zo verstandig in 'bash' scripts op de eerste regel '#!' te plaatsen gevolgd door het pad waar de bash-shell is geplaatst, meestal /bin/bash. De complete eerste regel, in dit geval #!/bin/bash zorgt ervoor dat het script, ondanks dat het aangeroepen wordt onder 'sh' toch uitgevoerd wordt onder 'bash'.

Om te zien wat de environment is dat CRON instelt kan met # crontab -e de volgende regel toegevoegd worden:
* * * * * env > /var/www/html/crontab_environment.txt
Wacht nu tot deze uitgevoerd is, verwijder daarna deze regel weer.
Als we het bestand /var/www/html/crontab_env.txt nu bekijken zal het er ongeveer als volgt uitzien:

SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env

Zoals hier te zien is wordt onder CRON een script geïnterpreteerd in 'sh'. Ook kunnen we de CRON environment vergelijken met de standaard environment van het Linux-OS door bovenstaand commando zelf uit te voeren aan de prompt bijv.: # env > /var/www/html/default_env.txt. In de meeste gevallen zal hier SHELL=/bin/bash aangetoffen worden. Ook zal PATH andere argumenten hebben. Dit is de belangrijkste reden dat in crontab het volledige pad van een script-bestand vermeld moet worden.

Het commando at
Het commando # at maakt het mogelijk éénmalig in de toekomst commando's uit te laten voeren. Bijv. # at 16:30 /usr/local/bin/backupg2 waarmee om 16:30 de commando's in '/usr/local/bin/backupg2' uitgevoerd worden. Zie # man at voor alle opties.

Naar index

Processen Logging

Als er ergens in een proces iets niet goed ging, moet achterhaald kunnen woren wat er precies verkeerd is gegaan.
Eén van de belangrijkste middelen die hiervoor ter beschikking stan is de system-logger deamon 'syslogd'. Deze maakt hiervoor gebruik van een configuratiebestand '/etc/syslog.conf'. Aan de hand van de in dit bestand gemaakte instellingenworden diverse logbestanden aangemaakt in de directory '/var/log/'

Vaak voorkomende logbestanden
Onderstaande bestanden worden kunnen onder andere door 'syslogd' aangemaakt worden in de directory '/var/log/':
 
/var/log/dmesg Bevat meldingen gegenereerd tijdens laden van de kernel betreffende met name over gevonden hardware. De inhoud hiervan is uit te lezen met commando # dmesg.
/var/log/boot.log Meldingen over gestartte en gestopte processen.
/var/log/cron Bevat een overzicht van de commando's die door cron zijn uitgevoerd.
/var/log/messages Algemeen logbestand, kan uitgebreid zijn en gebruikt door meerdere programma's
/var/log/secure ASCII-betsand dat login-tijd, plaats en terminals van gebruikers registreert.
/var/log/lastlog Binair bestand dat de laatste login-datum en -tijd voor alle gebruiker bevat. Dit bestand kan worden uitgelezen met het commando # lastlog
/var/log/httpd/access_log Meldingen van en over de webserver
/var/log/httpd/error_log Meldingen van en over de webserver.
/var/log/samba/log.smbd Meldingen die gegenereerd zijn door de samba server.

Naar index

Syslog.conf Definities
Het bestand syslog.conf bestaat uit regels waarop gedefiniëerd wordt wat er moet gebeuren als een bepaalde gebeurtenis optreedt. Deze regels bestaan uit een 'selector' en een 'action'. De selector bepaalt het voorval waarvoor iets gelogd moet worden en de de action waar het naartoe geschreven moet worden.
De selector bestaat uit 2 delen, de 'facility' bepaalt het substeem dat een bepaald bericht genereerd en de 'priority' bepaalt de ernst.
Het is niet altijd de bedoeling dat elke melding gelogd wordt. We willen bijvoorbeeld een 'info' niet zien, maar een 'error' wel.

Voorbeeld regel: uucp,news.err /var/log/spooler

Hier is uucp,news.err de selector, die bestaat uit de 'facilities' uccp en news met 'priority' err. De 'action' is het wegschrijven naar '/var/log/spooler'.

Naar index

Definities Selector: Facilities
De 'facilities'worden gedefinieerd met de volgende sleutelwoorden:

auth, (security) Deze loggen zaken betreffende het inloggen op het systeem .
auth-priv Als hierboven, met verschil is dat niet iederen toegang heeft tot het logbestand.
cron Bericht gegenereerd door 'crond'.
deamon Voor berichten die door services (deamons) worden gegenereerd.
kern Voor meldingen die gegenereerd zijn door de kernel.
lpr Voor berichten afkomstig van het print systeem.
mail Berichten gegenereerd door het mailsysteem..
mark Genereert een markeringsteken.
news Voor berichten van news-gerelateerde processen.
user Voor zaken betreffende de gebruiker.
uucp Voor berichten die gegenereerd worden door 'uucp'.
local0-7 Kunnen locaal worden gebruikt en gedefiniëerd.

Naar index

Definities Selector: Priorities
Ook de 'priorities', waar mee de ernst van een gebeurtenis wordt aangeduid, worden aangegeven met een sleutelwoord. De volgende sleutelwoorden zijn beschikbaar:


-debug
-info
-notice
-warn[ing]
-err[or]
-crit
-alert
-emerg
-panic

De priorities worden in de volgorde afgewerkt als in de lijst links.
'err' heeft dus een hogere status dan 'info'.
Door een prioriteit op te geven worden alle berichten met deze prioriteit of hogere status gelogd. Dus als 'crit' als prioriteit gegeven wordt, betekent dit dat ook automatisch gelogd moet worden als zich een gebeurtenis van het niveau 'alert', 'emerg' of 'panic' voordoet.

Bij specificatie van facilities en priorities kan gebruik gemaakt worden van * (alles), !n (niet n) of none (niets).

Zie voorbeeld syslog.conf bestand hieronder.

Naar index

Definities Action
Het laatste element van de 'syslog.conf' definities is de action die bepaalt waar de logregel naar toe moet worden gestuurd.
Hiervoor bestaan de volgende mogelijkheden:

Naar index

Voorbeeld 'syslog.conf' bestand
Op de huidige server ziet syslog.conf er zo uit:

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local6.none;local5.none;local0.none /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.info                                              -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                        /var/log/boot.log
local6.*                        /var/log/system
local5.*                        /var/log/compliance
local0.*                        /var/log/suva

Naar index

Applicitie logs
Bij applicaties zoals een webserver en sambaserver wordt de logger deamon niet geconfigureerd door het bestand '/etc/syslog.conf' maar wordt dit gedefiniëerd in de individuele configuratiebestanden van deze applicaties.
Voor bijvoorbeeld de Apache Webserver is dat in /etc/httpd/conf/httpd.conf. Zie hieronder als voorbeeld een gedeelte van de betreffende sectie:

# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# "combinedio" includes actual counts of actual bytes received (%I) and sent (%O); this
# requires the mod_logio module to be loaded.
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a 
# container, they will be logged here.  Contrariwise, if you *do*
# define per- access logfiles, transactions will be
# logged therein and *not* in this file.
#
#CustomLog logs/access_log common

#
# If you would like to have separate agent and referer logfiles, uncomment
# the following directives.
#
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent

#
# For a single logfile with access, agent, and referer information
# (Combined Logfile Format), use the following directive:
#
CustomLog logs/access_log combined
#***********************************************************************
#* Ben Makkink 07/09/2011 wandelen_access_log                          *
#* Aanvulling voor access logging van een specifieke subdirectory      *
#***********************************************************************
#* Set de env voor het pad 'wandelen' in webroot /var/www/html/ en geef*
#* deze een alias 'wandelen' of 'nbp'. Specificeer dan de 'CustomLog'  *
#* Niet vergeten ook /etc/httpd/conf.d/default.conf aan te passen      *
#***********************************************************************

SetEnvIf Request_URI "^/wandelen/" wandelen
CustomLog logs/wandelen_access_log combined env=wandelen

SetEnvIf Request_URI "^/nbp/" nbp
CustomLog logs/nbp_access_log combined env=nbp

#**********************************************************************
#* Einde toevoeging B. Makkink 07/09/2011 wandelen_access_log         *
#**********************************************************************

Per default wordt er door Apache access logging uitgevoerd over de complete httpd root website (zie highlight sectie hierboven).
Om om specifieke onderdelen van de website individueel te loggen kunnen deze uitgefilterd worden zoals weergegeven. De access-logs worden gebruikt door Awstats voor het tonen van statistieken. Zie hiervoor sectie Server Apache: Awstats en Access-logs

Naar index

Processen en Pseudo-Bestandsysteem /proc

De kernel maakt het pseudo-bestandssysteem aan voor het op kunnen vragen over actieve processen.
Dit bestandssysteem voorziet in een directory-structuur waarin elk process een subdirectory heeft waarvan de naam overeenkomstig de PID is. De kernel houdt hierin de dynamische informatie bij over de processen.
Deze informatie kan soms nuttig zijn voor de systeembeheerder. Hieronder een uiteenzetting over de informatie die in bijvoorbeeld het bestandssysteem /proc/1 kan worden gevonden. Dit is een directory met in dit geval informatie over het process 1 (init). Elk actief process heeft zo'n structuur met onder andere de volgende pseudo-bestanden en -directories:

/cmdline Bevat de volledige commandregel waarmee het proces is gestart.
/fd Bevat een symbolische link naar elk bestand dat door het proces wordt gebruikt.
/maps Hierin staan de adressen van de geheugengebieden die door het proces worden gebruikt.
/cpuinfo Bevat uitgebreide informatie over de processor.
/devices Bevat een overzicht van device-drivers die in de kernel zijn geconigureerd.
/dma Hierin de DMA-channels die op het moment in gebruik zijn.
/filesystems Een lijst van alle bestandsystemen die momenteel bij de kernel in gebruik zijn.
/interrupts Een overzicht van de interrupts in gebruik en de processorbelasting door elk interrupt
/ioports Lijst van de I/O-ports die momenteel in gebruik zijn met alle processen die elke individuele poort gebruiken.
/kcore Vertegenwoordigt het fysieke geheugen op de computer. De grootte ervan komt overeen met de totale hoeveelheid geheugen in de computer
/kmsg Bevat berichten gegenereerd door kernel. Worden ook gerouteerd naar 'syslog'. Uitlezen met commando # dmesg
/loadavg Het bestand houdt de werklast van het systeem bij. Hierin staat het aantal jobs dat in de afgelopen 1,5 en 15 minuten in de queue geplaatst is. Gegevens worden gebruikt door commando's als # uptime
/meminfo Houdt vrij en gebruikt geheugen bij in het fysieke- en swapgeheugen en hoeveel buffers de kernel in beslag neemt. De gegevens worden gebruikt door het commando # free
/modules Bevat lijst van modules die door het systeem geladen zijn.
/net het bestand bevat informatie over de netwerkprotocollen die worden ingezet. De informatie kan worden uitgelezen met het commando # netstat
/pci Een lijst van alle PCI-devices die in het systeem voorkomen met hun configuratie
/scsi Een lijst met alle SCSI-devices die in het systeem voorkomen met hun configuratie
/stat, status Het bestand 'stat' geeft status informatie over het proces. 'status' is de meer leesbare variant. Het commando # ps gebruikt dit bestand. Statistische gegevens over de kernel en het systeem, zoals het aantal ontvangen interrupts sinds opstarten.
/sys Bevat een aantal bestanden en directories die verwijzen naar kernel-variabelen, zoals bijv. een bestand /proc/sys/kernel/hostname met daarin de naam van de host. Sommige variabelen die hierin staan kunnen gewijzigd worden door de inhoud van de bestanden te wijzigen. Bijvoorbeeld het maximum aantal bestanden dat gelijktijdig geopend zijn kan tijdelijk aangepast worden met het commando # echo 4096 > /proc/sys/fs/file-max
/uptime In seconden hoelang het systeem aanstaat en hoeveel tijd hiervan is besteed aan het idle proces.
/version Laat zien welke versie van de kernel in gebruik is. Kan worden opgevraagd met commando # uname -a

Naar index

Processen: Tips

Ter afsluiting van de sectie processen wat antwoorden op veel gestelde vragen:

Handmatig stoppen en starten van het netwerk
commando's:
# /etc/rc.d/init.d/network stop, ... start, ...restart
# systemctl stop network, ... start..., ...restart...

Maak met crontab-bestand een job aan
Maak job die ervoor zorgt dat elke werkdag om 2 uur 's nachts de inhoud van de homedirectory wordt weggeschreven in een tar-bestand.
Edit /etc/crontab en voeg regel toe: 0 2 * * 1 tar -cf /root/backup.tar /home/jounaam
Hierbij is de volgorde: minuten(1-60) uur(1-24) dag van maand(1-31) month(1-12) dag van week(0-7 zondag=0)
tar -cf /root/backup.tar /home/jounaam betekent: maak backup.tar in de root van alle bestanden in /home/jounaam.
Achtergrond proces
Start het commando # less /etc/inittab op als achtergrondproces en hoe kan het weer op de voorgrond gekregen worden?
Geef commando: # less /etc/inittab & Door toevoeging van de ampersand (&) start het proces op de achtergrond. Breng het proces naar de voorgrond met het commando: # fg Als er meerdere jobs op de achtergrond draaien voeg dan de naam van dejob toe, in dit geval # fg less . Om een op de voorgrond draaiend proces (opnieuw) naar de achtergrond te brengen geef commando: Ctrl-Z . Om een proces, draaiend op de achtergrond, te stoppen geef commando: # kill -9 <PID> , voor een voorgrond proces commando: q.
Configureer logging
Geef melding naar scherm elke keer als iemand inlogt:
Edit '/etc/syslog.conf'. Voeg regel toe: authpriv.* /dev/tty1. Sla bestand op.
Nu moet het proces 'syslogd' het configuratiebestand opnieuw inlezen. Dit kan bijvoorbeeld door re-boot. Maar het kan ook terwijl het systeem operationeel blijft door het huidig actieve proces te stoppen en opnieuw te starten met het commando:
# systemctl restart syslog

Naar index