Crear, supervisar i matar processos
Introducció
Quan executem una comanda, estem iniciant un o més processos. Per poder administrar un sistema Linux correctament, s’ha de saber crear i enviar senyals als processos, i en aquesta lliçó ho aprendrem.
Control de tasques
Els jobs o tasques són processos que s’han iniciat de manera interactiva amb un terminal, i es poden conèixer amb la comanda jobs.
Per exemple, podem crear un job sleep 60 i fer Ctrl+Z per suspendre’l:
➜ ~ sleep 60
^Z
[1] + 68504 suspended sleep 60
➜ ~ jobs
[1] + suspended sleep 60
Com podem veure, aquest job té ID 1. Podem modificar l’estat del job amb les comandes fg (foreground, executem el job a la terminal), bg (background, l’executem en segon pla) i kill (matem el procés), seguit de %1.
Paràmetres de jobs
-
-l
Mostra el PID dels jobs.
-
-p
Llista els IDs dels processos.
-
-r
Llista només els processos en execució.
-
-s
Llista només les tasques detingudes o suspeses.
Especificacions de tasques
La comanda jobs i altres utilitats com bg, fg o kill, necessiten que especifiquem el job (jobspec) per actuar sobre la tasca específica. Normalment és l’ID del job precedit d’un “%” (%1 com hem vist abans) però hi ha més opcions:
-
%n
Job amb número d’execució n.
$ jobs %1
[1] + suspended sleep 60
-
%str
Job on la línia de comanda comença amb str.
$ jobs %sl
[1] + suspended sleep 60
-
%?str
Job on la línia de comanda conté str.
$ jobs %?le
[1] + suspended sleep 60
-
%+ o %%
Job actual (últim que hem executat en segon pla o suspès).
$ jobs %+ [1] + suspended sleep 60 -
%-
Job anterior (%+ abans de l’actual).
$ jobs %- [1] + suspended sleep 60(En el nostre cas, al ser la única tasca és el job actual i l’anterior).
Estat de la tasca
Quan una tasca està en segon pla o suspesa, podem fer:
-
Portar-la al primer pla amb fg:
$ fg %1 sleep 60 -
Portar-la al segon pla amb bg:
$ bg %1 [1]+ sleep 60 & -
Enviar un senyal SIGTERM amb kill:
$ kill %1
Si no especifiquem tasca, fg i bg actuaran sobre la actual predeterminada. kill sempre necessita que li especifiquem.
Tasques separades: nohup
Els jobs que hem vist fins ara estaven vinculats a la sessió que les ha creat, pel que si la sessió acaba, la tasca també. Si no ens interessa que el job estigui vinculat a la sessió, podem utilitzar la comanda nohup (no hangup).
➜ ~ nohup COMMAND &
Separarem la comanda ping de la sessió actual:
➜ ~ nohup ping localhost &
[1] 116260
La sortida mostra tan l’ID de la tasca com el PID, seguida d’un missatge que notifica de l’arxiu nohup.out, on es guardarà la sortida estàndard (stdout) i l’error (stderr). Si tanquem la terminal i n’obrim una altra, podem fer tail -f de nohup.out i veurem que segueix en execució.
Si volem canviar el nom de l’arxiu nohup.out, podriem haver fet nohup ping localhost > arxiu &.
Per matar el procés, utilitzarem el seu PID.
Monitoreig de processos
Ara que coneixem el control de tasques, vegem com monitoritzar processos en temps real.
Un procés és una instància d’un programa en execució. La comanda watch executa un programa periòdicament (per defecte cada 2 segons) i permet mirar el canvi de sortida del programa amb el temps. Per monitorejar la càrrega del sistema podriem fer:
Every 2,0s: uptime linux-cachyos: 16:10:59
in 0,002s (0)
16:10:59 up 1:25, 1 user, load average: 0,66, 0,95, 1,41
S’executarà fins que l’interrompem (Ctrl-C o q).
També podem mirar l’ús de memòria amb free.
Enviament de senyals a processos: kill
Cada procés té un identificador de procés únic PID. Una manera de trobar-lo és amb pgrep seguit del nom del procés:
➜ ~ pgrep sleep
138093
També podem utilitzar la comanda pidof.
Similar a pgrep, pkill mata un procés segons el nom:
➜ ~ pkill sleep
[1] + 138991 terminated sleep 60
Per matar varies instàncies d’un mateix procés podem utilitzar també killall:
➜ ~ killall sleep
Tan killall com pkill funcionen com kill quan envia un senyal. Aquests senyals poden especificar-se per nom, número o opció. Podem també combinar-los per enviar senyals personalitzades:
➜ ~ kill $(pgrep sleep)
[1] + 146828 terminated sleep 60
top i ps
Per monitorejar processos, top i ps són dues eines clau. top mostra resultats dinàmicament, ps estàticament.
Interactuant amb top
Per executar-lo, escriurem top. Per defecte mostrarà els processos ordenats per temps de CPU utilitzat, però es pot modificar:
-
M
Ordena per ús de memòria.
-
N
Ordena per número d’ID.
-
T
Ordena per temps d’execució.
-
P
Ordena per percentatge d’ús en CPU.
Per canviar ordre ascendent/descendent, R.
Altres tecles útils són:
-
? o h: Ajuda
-
k: Mata un procés
-
r: Canvia la prioritat d’un procés (renice). top demanarà el valor nice (de -20 a 19) però root pot establir-lo en un valor negatiu o inferior.
-
u: Llista processos d’un usuari.
-
c: Mostra les rutes absolutes dels programes i diferencia entre processos d’espai d’usuari i de kernel (entre corxets).
-
V: Vista de bosc i jerarquia.
-
t y m: Canvia l’aspecte de les lectures de CPU i memòria respectivament, en un cicle de 4 etapes.
-
W: Guarda ajustos de configuració a ~/.toprc.
Explicació de la sortida de top
La sortida de top es divideix en dues àrees: l’àrea resum i la de tasques.
Àrea resum
Conté 5 files superiors amb el següent:
-
top - 09:47:54 up 1:46, 2 users, load average: 0,33, 0,69, 0,72
Hora, temps d’activitat, usuaris connectats i promig de càrrega de CPU en els últims 1, 5 i 15 minuts.
-
Tasks: 217 total, 1 running, 216 sleeping, 0 stopped, 0 zombie
Número total de processos actius, corrent, dormint, detenits i zombies.
-
%Cpu(s): 6,9 us, 2,8 sy, 0,0 ni, 85,6 id, 3,6 wa, 0,6 hi, 0,4 si, 0,0 st
Processos d’usuari, de sistema/kernel, establerts en valor nice, res, processos en espera d’operacions E/S, processos que serveixen interrupcions de hardware , processos que serveixen interrupcions de software i processos que serveixen tasques d’altres VMs en entorn virtual.
-
MiB Mem : 7805,2 total, 3430,9 free, 2258,0 used, 2865,9 buff/cache
Total de memòria lliure, en ús i intermitja.
-
MiB Swap: 0,0 total, 0,0 free, 0,0 used. 5533,3 avail Mem
Quantitat total d’espai de swap, swap no utilitzat i espai en ús de swap.
-
Àrea de tasques: camps o columnes
Els camps i columnes són:
-
PID
Identificador de procés.
-
USER
Usuari que ha emès la comanda que ha generat el procés.
-
PR
Prioritat del procés al kernel.
-
NI
Valor nice del procés. Com més baix més prioritat.
-
VIRT
Quantitat total de memòria utilitzada pel procés (incloent swap).
-
RES
RAM utilitzada pel procés.
-
SHR
Memòria compartida pel procés amb altres processos.
-
S
Estat del procés. Inclou S (suspensió interrompible), R (executable) i Z (processos secundaris acabats en zombies).
-
%CPU
Percentatge de CPU utilitzat pel procés.
-
%MEM
Percentatge de RAM utilitzada pel procés (RES en %).
-
TIME+
Temps total d’activitat del procés.
-
COMMAND
Nom de la comanda/programa que ha generat el procés.
Visualització de processos estàtics: ps
ps mostra una instantània dels processos. Per veure’ls tots, fem ps a.
Sintaxi i sortida de ps
ps pot acceptar 3 estils diferents: BSD, UNIX i GNU.
-
BSD
Les opcions no tenen guió inicial: ps p 811.
-
UNIX
Les opcions tenen guió inicial: ps -p 811.
-
GNU
Les opcions van amb dos guions inicials: pd –pid 811.
Una comanda molt útil és ps aux. Mostra tots els processos de tots els shells. Els paràmetres són:
-
a: Mostra processos connectats a un tty o terminal.
-
u: Mostra format orientat a l’usuari.
-
x Mostra processos que no estan connectats a un usuari o terminal.
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.1 20904 13220 ? Ss 08:01 0:18 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 08:01 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 08:01 0:00 [pool_workqueue_release]
root 4 0.0 0.0 0 0 ? I< 08:01 0:00 [kworker/R-rcu_gp]
(...)
Columnes:
-
USER: Amo del procés.
-
PID: Identificador del procés.
-
%CPU: Percentatge de CPU utilitzat.
-
%MEM: Percentatge de memòria RAM utilitzat.
-
VSZ: Memòria virtual de processos.
-
RSS: Memòria física no intercanviada utilitzada pel procés.
-
TT: Terminal (tty) que controla el procés.
-
STAT: Codi que representa l’estat del procés. A més de S, R i Z, també inclou els valors D (suspensió ininterrompuda) i T (detingut). Altres modificadors inclouen < (alta prioritat), N (baixa prioritat) o + (primer pla).
-
STARTED: Hora a la que ha començat el procés.
-
TIME: Temps de CPU acumulat.
-
COMMAND: Comanda que ha iniciat el procés.
I fins aquí el post d’avui. Si t’ha semblat útil pots deixar un comentari i compartir-lo. Ens veiem al següent!



