Activitats

Prioritat i monitorització de processos

L’objectiu d’aquesta activitat és entendre el funcionament del sistema de prioritats a Linux i fer ús de les ordres associades a la seva gestió. També caldrà conèixer les eines de monitorització ps i top.

Per fer aquesta tasca es demanen les activitats següents:

  • Arrancar l’editor de text gedit en l’entorn gràfic.
  • Localitzar el PID del procés i visualitzar la seva prioritat general i la prioritat d’usuari nice.
  • Baixar al mínim la prioritat nice d’aquest procés. Comprovar el resultat i veure com es comporta la prioritat general.
  • Fer servir la utilitat top per assignar ara la màxima prioritat al procés. Convé que proveu com es poden ordenar els processos per diferents camps.

Una vegada engegada l’aplicació gedit obrim una consola de text per poder efectuar les diferents ordres administratives.

Si fem una ordre ps genèrica només veurem els processos de la nostra sessió. Si fem servir les opcions aux podrem veure gairebé tots els processos:

  1. # ps aux...
  2. root 2210 0.0 0.1 4556 1768 pts/1 Ss 21:03 0:00 bashjmunoz 2213 0.2 1.6 92264 17064 ? S 21:03 0:00 geditroot 2259 0.0 0.1 3872 1040 pts/1 R+ 21:08 0:00 ps aux

Aquestes opcions ens donen un llarg llistat poc pràctic, però ens ajuden a localitzar el procés en qüestió que té un PID=2213 en aquest cas. Ara podem aplicar el paràmetre estil BSD (l)ong, que ens permet presentar informació ampliada, i el paràmetre estil Unix -p, que permet limitar la informació a un procés concret.

  1. # ps l -p 2213F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND0 1000 2213 1 20 0 92264 17064 - S ? 0:00 gedit

Veiem que la prioritat general (PRI) és 20 i la prioritat d’usuari nice (NI) està a 0. Baixem ara al mínim la prioritat nice:

  1. # renice 30 22132213: prioritat antiga 0, nova prioritat 19

Encara que posem un número molt alt, en aquest cas 30, la prioritat nice queda a 19 (prioritat mínima). Comprovem ara la prioritat general:

  1. # ps l -p 2213F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND0 1000 2213 1 39 19 92264 17076 - SN ? 0:01 gedit

Constatem que la prioritat general (39) té un component assignat pel sistema, en aquest cas 20, i un component d’usuari (prioritat nice), en aquest cas 19.

Ara farem servir la utilitat top per donar al procés la prioritat màxima. Arranquem la utilitat interactiva:

  1. # top

Anem ara a ordenar els processos pel camp de prioritat nice. Primer accedim a la pantalla d’ordenació prement la lletra O i seleccionem el camp nice com a camp d’ordenació (lletra I):

Amb la tecla de retorn tornem a la pantalla principal:

Ara ja veiem el nostre procés amb prioritat mínima (número nice més positiu). La prioritat es canvia amb la lletra r (renice), tot indicant primer el PID del procés:

I després el nou valor nice:

Ara el procés ha quedat amb la màxima prioritat (valor més negatiu de nice). Reordenem els processos per nice, però de forma inversa (lletra N), i veiem el resultat:

Comunicació de processos: senyals de teclat i valors de retorn

L’objectiu d’aquesta activitat és conèixer dues maneres de comunicar-se amb els processos: els senyals de teclat Ctrl+C i Ctrl+Z i els valors de retorn.

Per fer aquesta tasca es demana engegar un procés (per exemple, l’ordre yes) i enviar-li senyals mitjançant la combinació de tecles Ctrl+C i Ctrl+Z. Posteriorment cal analitzar quins han estat aquests senyals veient el valor de retorn del procés.

Primer arranquem el procés yes i l’aturem amb la combinació Ctrl+C:

  1. # yes
  2. yyyyyyyyyyyyyyyyyyyyy...
  3. ^C

Immediatament comprovem el valor que ens retorna el procés en rebre el senyal. El valor de retorn es guarda a la variable representada pel símbol d’interrogació (?)

  1. # echo $?
  2. 130

Si restem 128 a aquest valor de retorn obtenim el codi d’aquest senyal. En aquest cas el senyal 2 correspon a SIGINT. Fem el mateix amb Ctrl+Z:

  1. # yes
  2. yyyyyyyyyyyyyyyyyyyyy...
  3. ^Z
  4. [1]+ Aturat yes
  5.  
  6. # echo $?
  7. 148

En aquest cas es tracta del senyal 20 (148–128), que correspon a SIGTSP.

Comunicació de processos amb l'ordre kill i captura de senyals

L’objectiu d’aquesta activitat és practicar l’enviament de senyals amb l’ordre kill i veure com es pot capturar un senyal per efectuar una acció diferent a la inicialment programada.

Per fer aquesta tasca es considera l’script Bash següent, que podem anomenar trap.sh:

  1. #!/bin/bash
  2. #trap.sh Script per capturar senyals
  3.  
  4. N=0
  5. while true
  6. do
  7. ((N++))
  8. if [ $N -gt 200000 ];then
  9. exit 1
  10. fi
  11. done
  12. exit 0

Es demana que aquest script no pugui ser aturat ni amb Ctrl+C ni amb Ctrl+Z. Per fer això caldrà capturar aquests senyals de teclat.

D’altra banda, si aquests senyals són rebutjats… com podríem aturar aquest procés?

Heu de crear l’script i donar-li permisos d’execució. Com podeu veure, és un simple comptador que només s’atura en acabar de comptar fins a 200.000. Podeu comprovar quant temps tarda en fer aquest bucle amb l’ordre time i canviar el bucle per ajustar el temps a les vostres necessitats:

  1. # time ./trap.sh
  2. real 0m11.191s
  3. user 0m7.496s
  4. sys 0m3.504s

Podeu comprovar que mentre s’executa respon als senyals de teclat. Per capturar-los cal afegir la línia de trap següent:

  1. #!/bin/bash
  2. #trap.sh Script per capturar senyals
  3.  
  4. trap "echo procés $$ ignora el senyal" SIGTSTP SIGINT
  5.  
  6. N=0
  7. while true
  8. do
  9. ((N++))
  10. if [ $N -gt 200000 ];then
  11. exit 1
  12. fi
  13. done
  14. exit 0

Amb aquesta línia de codi, quan el procés rep un senyal de teclat SIGTSTP (Ctrl+Z) o SIGINT (Ctrl+C) és capturat i presenta el missatge següent:

  1. # ./trap.sh
  2. ^C procés 3217 ignora el senyal
  3. ^Z procés 3217 ignora el senyal

Per aturar aquest procés ja no podem fer res en aquesta consola. N’hem d’obrir una altra i enviar un senyal al procés mitjançant kill o killall:

Gestió del nivell d'execució

L’objectiu d’aquesta activitat és conèixer el funcionament dels nivells d’execució de Linux Debian, com es configuren i quins directoris i arxius hi estan involucrats.

Habitualment en la instal·lació bàsica de Debian els nivells d’execució 2, 3 i 4 són iguals i el nivell per defecte és el 2. Per fer aquesta tasca es demanen les accions administratives següents:

  • Configurar un nivell d’execució 3 perquè no tingui actiu el servei Apache.
  • Aquest nivell serà el nivell per defecte en arrancar el sistema.

Finalment es demana esbrinar com es configura un nivell per defecte en un Linux que tingui un sistema d’arrancada basat en upstart (com ara Ubuntu).

Encara que habitualment és així, primer ens assegurem que el nivell 2 i el 3 d’execució són iguals:

  1. # rm /etc/rc3.d/*
  2. # cp -d /etc/rc2.d/* /etc/rc3.d

(NOTA: L’opció -d còpia els enllaços simbòlics com a tals.)

Si volem que el servei Apache quedi deshabilitat, en entrar al nivell 3 només cal canviar la S inicial per una K en el nom de l’enllaç simbòlic que apunta a l’script de control d’Apache:

  1. # mv /etc/rc3.d/S18apache2 /etc/rc3.d/K18apache2

Es pot comprovar fàcilment que en el nivell 2 des de el navegador s’obté resposta a localhost i que en canvi en el nivell 3 no:

  1. # init 2

Figura

  1. # init 3

Figura

Perquè el nivell 3 sigui el nivell per defecte en arrancar, cal editar /etc/inittab. La línia on diu:

  1. # The default runlevel.
  2. id:2:initdefault:

quedarà:

  1. # The default runlevel.
  2. id:3:initdefault:

En un sistema basat en upstart tenim dues opcions. Com que es garanteix la compatibilitat cap enrere només caldria crear un arxiu /etc/inittab que només tingués la línia de l’initdefault. Tanmateix, aquesta opció es considera obsoleta. El correcte és editar l’arxiu de configuració /etc/init/rc-sysinit.conf i canviar la variable DEFAULT_RUNLEVEL:

  1. # cat /etc/init/rc-sysinit.conf
  2. # rc-sysinit - System V initialisation compatibility
  3. # This task runs the old System V-style system initialisation scripts,
  4. # and enters the default runlevel when finished.
  5. ...
  6. # Default runlevel, this may be overriden on the kernel command-line
  7. # or by faking an old /etc/inittab entry
  8.  
  9. env DEFAULT_RUNLEVEL=3

Directori /etc/proc

L’objectiu d’aquesta activitat és conèixer les característiques i els arxius d’informació que es troben al directori virtual /proc.

Per fer aquesta tasca es demanen les activitats següents:

  • Obrir un navegador en l’entorn gràfic i esbrinar el PID que li correspon.
  • Trobar informació d’aquest procés en el directori /proc corresponent.

Amb l’ordre

  1. # ps aux

localitzo ràpidament el procés del navegador (PID 2855), en aquest cas Firefox, i puc obtenir-ne més detalls amb:

  1. # ps -l p 2855
  2. F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
  3. 0 S 1000 2855 1 4 80 0 - 81786 - ? 0:02 /bin/firefox

Amb el número de PID puc cercar el directori d’informació d’aquest procés a /proc/2855:

  1. # ls -m /proc/2855
  2. attr, auxv, cgroup, clear_refs, cmdline, coredump_filter,
  3. cpuset, cwd, environ, exe, fd, fdinfo, io, limits,
  4. loginuid, maps, mem, mountinfo, mounts, mountstats, net,
  5. oom_adj, oom_score, pagemap, personality, root, sched,
  6. sessionid, smaps, stack, stat, statm, status, syscall,
  7. task, wchan

Aquí hi ha tota la informació del procés, per exemple:

  1. # cat /proc/2855/status
  2. Name:firefoxState:S (sleeping)
  3. Tgid:2855
  4. Pid:2855
  5. PPid:1
  6. TracerPid:0
  7. Uid:1000100010001000
  8. Gid:1000100010001000
  9. FDSize:256
  10. Groups:4 20 21 24 25 26 29 30 44 46 108 109 110 112 115 1000
  11. VmPeak:354792 kB
  12. VmSize:328232 kB
  13. VmLck:0 kB
  14. VmHWM:88960 kB
  15. VmRSS:57808 kB
  16. VmData:216496 kB
  17. VmStk:100 kB
  18. VmExe:52 kB
  19. VmLib:43940 kB
  20. VmPTE:232 kB
  21. Threads:18
  22. SigQ:0/16382
  23. SigPnd:0000000000000000
  24. ShdPnd:0000000000000000
  25. SigBlk:0000000000000000
  26. SigIgn:0000000000001000
  27. SigCgt:00000001800044ef
  28. CapInh:0000000000000000
  29. CapPrm:0000000000000000
  30. CapEff:0000000000000000
  31. CapBnd:ffffffffffffffff
  32. Cpus_allowed:1
  33. Cpus_allowed_list:0
  34. Mems_allowed:1
  35. Mems_allowed_list:0
  36. voluntary_ctxt_switches:4196
  37. nonvoluntary_ctxt_switches:2034

Anar a la pàgina anterior:
Administració de processos del sistema
Anar a la pàgina següent:
Exercicis