Crear, supervisar i matar processos

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.

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.

  • -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.

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).

Quan una tasca està en segon pla o suspesa, podem fer:

  1. Portar-la al primer pla amb fg:

       $ fg %1
       sleep 60
  2. Portar-la al segon pla amb bg:

       $ bg %1
       [1]+ sleep 60 &
  3. 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.

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.

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.

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

Per monitorejar processos, top i ps són dues eines clau. top mostra resultats dinàmicament, ps estàticament.

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.

La sortida de top es divideix en dues àrees: l’àrea resum i la de tasques.

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.

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.

ps mostra una instantània dels processos. Per veure’ls tots, fem ps a.

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!