Tips en Trucs 2023

Pgrep en Pkill opdrachten

Een Linux systeem bestaat uit processen, wat in principe programma's zijn die op een systeem draaien.

Processen moeten echter vaak beheerd worden, wat op verschillende manieren kan gebeuren, zoals opsporen, stoppen, starten en afsluiten.

Er zijn momenten dat we de naam van een proces niet weten, maar wel zijn proces-ID of andersom.

We kunnen verschillende opdrachten gebruiken om met deze situaties om te gaan.

De pgrep opdracht

Misschien ken je de grep opdracht, deze wordt gebruikt om een woord of tekstfragment te vinden in een gegeven stuk tekst of bestand.

De pgrep opdracht werkt op dezelfde manier, maar is ontworpen om met processen te werken. Het kan de proces-ID's vinden op basis van een gegeven voorwaarde, bijvoorbeeld een gebruikersnaam. We kunnen ook de procesnaam opgeven als parameter om naar te zoeken.

Laten we een voorbeeld nemen. We zullen de pgrep opdracht gebruiken met een procesnaam om alle bijbehorende proces ID's weer te geven. Om dit te doen, voeren we de volgende opdracht uit:

dany@pindabook:~$ pgrep bash
1499

In deze opdracht geven we de procesnaam door als parameter. Laten we eens kijken naar de uitvoer, die één proces-ID weergeeft.

Laten we eens kijken wat er gebeurt als we de opdracht uitvoeren met een procesnaam die niet bestaat. We proberen dit uit met httpd als procesnaam:

dany@pindabook:~$ pgrep httpd

Merk op dat er geen uitvoer wordt geretourneerd. Dit betekent dat dit proces niet bestaat.

We voeren nu de bash opdracht uit om bash nog een keer te starten. We zouden nu twee bash-gerelateerde proces-ID's moeten hebben. Om bash nogmaals te starten, voeren we de volgende opdracht uit:

dany@pindabook:~$ bash

Daarna voeren we opnieuw de volgende opdracht uit om de proces-ID's voor bash te controleren:

dany@pindabook:~$ pgrep bash
1499
1741

Merk op dat de uitvoer op afzonderlijke regels wordt weergegeven.

Uitvoer op één regel

We kunnen de uitvoer op een enkele regel weergeven door elk proces-ID te scheiden met een spatie. Hiervoor moeten we de parameter -d (--delimiter) gebruiken. We moeten de volgende opdracht uitvoeren:

dany@pindabook:~$ pgrep bash -d' '
1499 1741

Bij gebruik van de -d parameter wordt de uitvoer weergegeven op een enkele regel waar een spatie elk proces-ID scheidt. Dit is wat we hadden gedefinieerd als de criteria na de -d parameter.

Proces ID weergeven

Wat moeten we doen als we de procesnaam en zijn ID willen weergeven in de uitvoer? We moeten de -l (--list-name) parameter gebruiken.

dany@pindabook:~$ pgrep bash -l
1499 bash
1741 bash

Merk op dat de uitvoer bij elk proces-ID de procesnaam (bash) weergeeft.

De proces ID's van een gebruiker weergeven

We kunnen ook de proces-ID's weergeven van de processen die door een specifieke gebruiker worden uitgevoerd. We kunnen bijvoorbeeld de proces-ID's van de processen voor de gebruiker dany weergeven. We moeten de -u (--euid) parameter gebruiken om de gebruikersnaam te vermelden.

dany@pindabook:~$ pgrep -u dany
870
882
883
...
1499
1741
2124

Een volledige lijst van alle proces-ID's wordt weergegeven in de uitvoer.

We zullen nu twee gebruikersnamen gebruiken, dany en root, en proces-ID's weergeven. Om dit te doen, moeten we beide gebruikersnamen scheiden met een komma, maar we moeten wel de -u parameter gebruiken:

dany@pindabook:~$ pgrep -u dany,root
1
2
3
...
1499
1741
2146

Een volledige lijst van alle proces-ID's wordt weergegeven in de uitvoer.

Meest recente proces weergeven

Laten we aannemen dat we het meest recente proces willen vinden dat gestart is door de gebruiker dany. Om dit te kunnen doen, moeten we -lnu als parameter gebruiken:

dany@pindabook:~$ pgrep -lnu dany
2159 sleep

De uitvoer wordt weergegeven. De beschrijving van de -lnu parameter is als volgt:

Aantal processen weergeven

Soms is het interessant om te weten hoeveel processen draaien voor een specifieke gebruiker. Om dit te doen, moeten we de volgende opdracht uitvoeren met de -c (--count) parameter:

dany@pindabook:~$ pgrep -c -u dany
40

De -c parameter telt het aantal processen. Het toont niet de lijst met processen, maar alleen het totale aantal processen voor een specifieke gebruiker.

We hebben verschillende parameters van de pgrep opdracht gezien. Om meer informatie over deze opdracht te krijgen, kunnen we de volgende opdracht uitvoeren met de parameter --help:

dany@pindabook:~$ pgrep --help

Usage:
 pgrep [options] 

Options:
 -d, --delimiter   specify output delimiter
 -l, --list-name           list PID and process name
 -a, --list-full           list PID and full command line
 -v, --inverse             negates the matching
 -w, --lightweight         list all TID
 -c, --count               count of matching processes
 -f, --full                use full process name to match
 -g, --pgroup    match listed process group IDs
 -G, --group      match real group IDs
 -i, --ignore-case         match case insensitively
 -n, --newest              select most recently started
 -o, --oldest              select least recently started
 -O, --older      select where older than seconds
 -P, --parent    match only child processes of the given parent
 -s, --session    match session IDs
 -t, --terminal   match by controlling terminal
 -u, --euid        match by effective IDs
 -U, --uid         match by real IDs
 -x, --exact               match exactly with the command name
 -F, --pidfile       read PIDs from file
 -L, --logpidfile          fail if PID file is not locked
 -r, --runstates    match runstates [D,S,Z,...]
 -A, --ignore-ancestors    exclude our ancestors from results
 --cgroup         match by cgroup v2 names
 --ns                 match the processes that belong to the same
                           namespace as 
 --nslist          list which namespaces will be considered for
                           the --ns option.
                           Available namespaces: ipc, mnt, net, pid, user, uts

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see pgrep(1).

De uitvoer toont een lijst van parameters met hun beschrijvingen. We kunnen parameters mixen en matchen om onze voorwaarden te verfijnen bij het uitvoeren van de pgrep opdracht.

De pkill opdracht

Je bent misschien gewoon om een proces af te breken met de kill opdracht. We kunnen echter de pkill opdracht gebruiken om dezelfde taak uit te voeren. Het enige verschil is dat de pkill opdracht alleen werkt met de procesnamen en niet met de proces-ID's.

Voor demo-doeleinden starten we (nogmaals) Konsole vanaf de opdrachtregel. Hiervoor voeren we de volgende opdracht uit:

dany@pindabook:~$ konsole
kf.xmlgui: Shortcut for action  "" "Snelle commando's tonen" set with QAction::setShortcut()! Use KActionCollection::setDefaultShortcut(s) instead.
kf.xmlgui: Shortcut for action  "" "SSH-beheerder tonen" set with QAction::setShortcut()! Use KActionCollection::setDefaultShortcut(s) instead.

Konsole wordt onmiddellijk gestart.

We werken verder in de pas gestarte Konsole, de opdrachtregel waar we konsole mee gestart hebben is immers nog bezig met het uitvoeren van konsole.

In het nieuwe terminalvenster voeren we de pkill opdracht uit om konsole af te breken.

dany@pindabook:~$ pkill konsole

Merk op dat er geen uitvoer wordt geretourneerd en dat de opdracht succesvol is uitgevoerd. Alle Konsole terminalvenster werden afgesloten.

Net als bij pgrep kun je ook hulp krijgen bij pkill met de volgende opdracht:

dany@pindabook:~$ pkill --help

Usage:
 pkill [options] 

Options:
 -, --signal     signal to send (either number or name)
 -q, --queue        integer value to be sent with the signal
 -e, --echo                display what is killed
 -c, --count               count of matching processes
 -f, --full                use full process name to match
 -g, --pgroup    match listed process group IDs
 -G, --group      match real group IDs
 -i, --ignore-case         match case insensitively
 -n, --newest              select most recently started
 -o, --oldest              select least recently started
 -O, --older      select where older than seconds
 -P, --parent    match only child processes of the given parent
 -s, --session    match session IDs
 -t, --terminal   match by controlling terminal
 -u, --euid        match by effective IDs
 -U, --uid         match by real IDs
 -x, --exact               match exactly with the command name
 -F, --pidfile       read PIDs from file
 -L, --logpidfile          fail if PID file is not locked
 -r, --runstates    match runstates [D,S,Z,...]
 -A, --ignore-ancestors    exclude our ancestors from results
 --cgroup         match by cgroup v2 names
 --ns                 match the processes that belong to the same
                           namespace as 
 --nslist          list which namespaces will be considered for
                           the --ns option.
                           Available namespaces: ipc, mnt, net, pid, user, uts

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see pgrep(1).
pgrep