Cicle: Administració de sistemes informàtics en xarxa (ASIX)
Mòdul: 0374. Administració de sistemes operatius
Un sistema operatiu no és res més que un gestor de recursos: CPU, memòria, disc i xarxa. L’element central que representa “algú que fa servir aquests recursos” és el procés. Entendre com neix, viu i mor un procés —i com el nucli decideix a qui li toca CPU en cada instant— és la base per administrar, depurar i protegir qualsevol màquina, sigui Linux o Windows.
Un procés és una instància d’un programa en
execució: codi carregat en memòria, un espai d’adreces propi, un conjunt
de registres de CPU, fitxers oberts i un estat intern gestionat pel
nucli. Dos usuaris poden executar el mateix binari (per exemple firefox) i el sistema operatiu els tractarà com a dos
processos totalment independents, cadascun amb el seu propi
PID (Process ID).
El nucli manté aquesta informació en una estructura de control anomenada PCB (Process Control Block), que inclou com a mínim:
| Criteri | Tipus | Exemple |
|---|---|---|
| Interacció | Interactiu (primer pla, espera E/S d’usuari) | un editor de text |
| Per lots (batch) | un cron job de backup |
|
| Dimoni (daemon/servei, sense terminal) | sshd, nginx |
|
| Origen | Pare i fill | bash crea ls |
| Zombi | fill acabat, el pare no ha llegit el codi de sortida | |
| Orfe | pare mort abans que el fill; l’hereta init/systemd (PID 1) |
|
| Propietari | De sistema (arrenca amb el SO, sovint com a root/SYSTEM) |
systemd, svchost.exe |
| D’usuari | processos llançats des d’una sessió |
Un procés no està sempre “corrent”. El planificador (scheduler) del nucli el va movent entre estats segons si té CPU disponible i si està esperant algun recurs:
wait()).Un procés zombi no consumeix CPU ni memòria útil,
només ocupa una entrada a la taula de processos (el seu PCB (Process
Control Block)). Si en teniu molts, el problema real és el
pare, que no crida wait().
El processador necessita un mecanisme per reaccionar a esdeveniments que no formen part del flux seqüencial d’instruccions. Aquí és on entren interrupcions i excepcions.
Provocades per un dispositiu extern (targeta de xarxa, disc, teclat, temporitzador), independentment de la instrucció que s’estigui executant.
Flux típic:
El rellotge del sistema (timer interrupt) és la interrupció més important per a la multitasca: és la que permet al planificador “arrabassar” la CPU a un procés encara que no hagi acabat (preempció).
Provocades per la mateixa execució d’una instrucció: divisió per zero, accés a memòria no vàlida (segmentation fault), instrucció il·legal, o una crida al sistema (system call, la forma controlada que té un procés d’usuari de demanar un servei al nucli, com obrir un fitxer).
| Interrupció | Excepció | |
|---|---|---|
| Origen | Extern (maquinari) | Intern (execució d’instrucció) |
| Sincronia | Asíncrona | Síncrona |
| Exemple | Arribada d’un paquet de xarxa | divide by zero, page fault, syscall |
A Linux podeu veure el recompte d’interrupcions ateses per cada CPU amb:
cat /proc/interruptsI les excepcions greus (com un segfault) queden
registrades al journal:
journalctl -k | grep -i segfault
dmesg | grep -i "segfault\|general protection"Sovint es fan servir com a sinònims, però són conceptes diferents:
Procés A (espai de memòria propi)
├── Fil 1 ─┐
├── Fil 2 ─┤─ comparteixen memòria, fitxers oberts, UID...
└── Fil 3 ─┘
Procés B (espai de memòria propi, aïllat d'A)
└── Fil 1ps -eLf | grep firefox # -L mostra els LWP (lightweight processes = fils)
ls /proc/<PID>/task/ # cada subdirectori és un fil
top -H -p <PID> # mode fil-a-filsleep 300 & # llança en segon pla, mostra [1] <PID>
jobs # llista els treballs del shell actual
fg %1 # el porta a primer pla
Ctrl+Z # suspèn el treball en primer pla (estat Stopped/T)
bg %1 # el reprèn en segon pla
disown %1 # el desvincula del shell (sobreviu si tanqueu la terminal)fork() + exec()A Linux, un procés nou sempre neix a partir d’un altre (excepte init/PID 1):
fork() duplica el procés actual: crea
un fill gairebé idèntic al pare (mateix codi, mateixa memòria en mode
copy-on-write), amb un PID nou.exec() (o alguna de les seves
variants, execve, execvp…) substitueix el codi
del procés fill pel d’un programa nou, sense crear cap procés
addicional.Aquest és el mecanisme que fa servir el shell cada cop
que executeu una ordre: es fa fork() de bash i
el fill fa exec() de, per exemple, ls.
strace -f -e trace=fork,execve,clone,exit ls # veure fork/exec en directeordre & # crea en segon pla
nohup ordre & # sobreviu al tancament del terminal
nice -n 10 ordre # crea amb prioritat baixa (nice més alt = menys prioritat)
renice -n 5 -p <PID> # canvia la prioritat d'un procés ja creat
kill -l # llista tots els senyals disponibles
kill -TERM <PID> # petició "educada" d'acabament (per defecte)
kill -KILL <PID> # (senyal 9) acabament immediat i incondicional pel nucli
kill -HUP <PID> # molts dimonis l'interpreten com "recarrega la configuració"
pkill -f "patró_nom" # mata per nom/patró en lloc de PID
killall nom_procés # mata tots els processos amb aquell nom exacteDiferència clau TERM
vs. KILL: SIGTERM (15) es lliura al
procés perquè pugui alliberar recursos, tancar fitxers i sortir net; el
procés pot fins i tot capturar-lo i ignorar-lo. SIGKILL (9)
el gestiona directament el nucli, el procés no el pot capturar
ni ignorar: mor tant sí com no, però sense oportunitat de
netejar (pot deixar fitxers temporals o transaccions a mitges).
Start-Process notepad.exe # crear procés
Get-Process # llistar
Stop-Process -Name notepad -Force # acabar per nom
Stop-Process -Id 1234 # acabar per PID
Start-Process programa.exe -Priority High # prioritat en la creació
(Get-Process notepad).PriorityClass = "High" # canviar prioritat en calentEquivalent conceptual: Get-Process/Stop-Process fan de ps/kill, però Windows no té un fork() real (fa servir CreateProcess(), que
crea el procés nou directament amb el seu propi executable, sense el pas
intermedi de duplicar-se).
A Linux, el nucli exposa tot l’estat dels processos
com un sistema de fitxers virtual muntat a /proc
(procfs). No hi ha “fitxers” reals al disc: el nucli genera el
contingut a l’instant en llegir-lo.
ls /proc/ # un directori numèric per cada PID viu
cat /proc/<PID>/status # estat, memòria, UID/GID, fils...
cat /proc/<PID>/cmdline # ordre exacta amb què es va llançar
ls -l /proc/<PID>/fd/ # fitxers/sockets oberts per aquest procés
cat /proc/<PID>/maps # mapa de memòria del procés
readlink /proc/<PID>/exe # binari executat
readlink /proc/<PID>/cwd # directori de treball actual
cat /proc/loadavg # càrrega mitjana del sistema
cat /proc/meminfo # memòria global del sistemaAquesta idea (“tot és un fitxer”) és filosofia central d’Unix i és el
que permet a eines com ps o top funcionar
sense necessitat de crides especials al nucli: simplement
llegeixen fitxers de text dins de /proc.
A Windows no existeix un equivalent directe a /proc;
l’estat dels processos es consulta via l’API de Windows
(WMI, Windows Management Instrumentation) i s’exposa a eines
com el Task Manager, PowerShell (Get-Process, Get-CimInstance Win32_Process) o el Registre en alguns
aspectes de configuració de serveis.
| Ordre | Ús |
|---|---|
ps aux / ps -ef |
fotografia instantània de tots els processos |
ps -ef --forest |
mostra la jerarquia pare-fill en arbre |
top |
monitor en temps real (CPU, memòria, per procés) |
htop |
versió millorada i interactiva de top |
pstree |
arbre de processos de forma visual |
pgrep -a patró |
cerca PID per nom/patró |
lsof -p <PID> |
fitxers oberts per un procés |
vmstat 1 |
estadístiques de memòria/CPU cada segon |
iotop |
consum d’E/S de disc per procés |
ps -eo pid,ppid,user,ni,stat,%cpu,%mem,cmd --sort=-%cpu | headCamps útils de ps/top a recordar: STAT (S=dormint, R=corrent, D=E/S no interrompible,
Z=zombi, T=aturat), NI (niceness, -20 a 19), %CPU/%MEM.
GNOME System Monitor, KSysGuard (KDE), o eines web com
Netdata/Cockpit per a servidors sense
entorn gràfic.resmon), i Process Explorer
(Sysinternals) per a una vista jeràrquica amb DLL carregades i handlers
oberts, molt més potent que el Task Manager per a diagnòstic.systemdsystemctl status sshd # estat d'un servei
systemctl list-units --type=service --state=running
systemctl restart sshd
journalctl -u sshd -f # seguiment de logs en directesystemd)vmlinuz) i la initramfs (sistema de fitxers
temporal amb els mòduls necessaris per muntar l’arrel real, per exemple
controladors RAID/LVM).systemd): processa les
unitats (.service, .target, .socket…) i arriba al target per defecte
(normalment multi-user.target o graphical.target), arrencant en paral·lel tots els
serveis/dimonis necessaris respectant les dependències declarades
(Requires=, After=).systemd-analyze # temps total d'arrencada
systemd-analyze blame # temps per unitat, de més lent a més ràpid
systemd-analyze critical-chain # cadena crítica de dependències
systemctl get-default # target per defecte
pstree -p 1 # arbre complet de processos des de PID 1Un dimoni és un procés de sistema que s’executa en
segon pla, sense terminal de control, normalment des de l’arrencada,
oferint un servei (xarxa, impressió, base de dades…). Convenció
clàssica: acaben en d (sshd, crond, nginx… bé, aquest últim no, però httpd sí). Amb systemd, un dimoni sol
correspondre a una unitat .service.
bootmgr)winload.exe)
carrega el nucli ntoskrnl.exe i els controladors
críticssmss.exe)smss.exe llança wininit.exe, que al seu
torn arrenca el Service Control Manager
(services.exe), responsable d’arrencar tots els
serveis de Windows (equivalent conceptual als dimonis
de Linux) segons el seu tipus d’inici (Automàtic, Manual,
Desactivat).Get-Service | Where-Object {$_.Status -eq "Running"}
Get-CimInstance Win32_Service -Filter "StartMode='Auto'"Trobar un procés “estrany” (nom desconegut, consum anòmal de CPU/xarxa, ubicat en un directori sospitós) requereix un protocol sistemàtic:
Identificar-lo sense matar-lo primer (matar-lo abans d’investigar pot destruir evidència útil):
ps -eo pid,ppid,user,cmd | grep <PID>
readlink /proc/<PID>/exe # binari real que s'executa
ls -l /proc/<PID>/exe # per si el binari ha estat esborrat del disc (indicador d'infecció)
cat /proc/<PID>/status | grep -i state
lsof -p <PID> # connexions de xarxa i fitxers obertsComprovar la seva procedència: és fill de qui?
(ps -o ppid= -p <PID>), quin usuari l’ha llançat?, és
una ubicació legítima del binari (/usr/bin, /usr/sbin) o sospitosa (/tmp, /dev/shm, directoris ocults)?
Verificar la integritat del binari: comparar amb
el paquet original (dpkg -S /ruta/binari, rpm -qf, o sumes de comprovació contra un dipòsit de
confiança).
Comprovar connexions de xarxa actives associades:
ss -tulpn | grep <PID>
netstat -antp | grep <PID> # sistemes més anticsAïllar abans d’eliminar: si es confirma sospita real, és preferible aïllar la màquina de la xarxa (o suspendre’n la interfície) abans d’actuar, per evitar propagació i preservar evidència forense.
Actuar: SIGSTOP (aturar-lo sense
matar, per congelar-lo i inspeccionar-lo en calma) abans de decidir
entre SIGKILL o conservar-lo per a anàlisi
forense.
Auditar la persistència: revisar cron, systemd timers/services, ~/.bashrc, /etc/rc.local i claus
d’autoarrencada per si el procés té mecanismes per reaparèixer després
de reiniciar.
Documentar l’incident (vegeu 2.9) i, si escau, aplicar les polítiques de resposta a incidents del centre/empresa.
Eines de suport habituals:
AIDE/Tripwire (integritat de fitxers),
Wazuh/OSSEC (HIDS), auditd (registre d’esdeveniments en l’àmbit del nucli), i a
Windows Sysinternals Process Explorer/Autoruns per
detectar persistència i Windows Defender/Event Viewer
per als registres de seguretat.
A Windows, un indicador equivalent d’alarma és un procés amb el nom
“gairebé correcte” d’un procés de sistema legítim (per exemple svch0st.exe en lloc de svchost.exe) o un svchost.exe executant-se des d’una ruta diferent de C:\Windows\System32.
Documentar no és opcional en un entorn professional: permet detectar anomalies (comparant contra la “normalitat” esperada) i facilita el manteniment per part d’altres tècnics.
Per cada procés/servei rellevant del sistema:
| Camp | Valor |
|---|---|
| Nom | sshd |
| Binari | /usr/sbin/sshd |
| Funció | Servidor SSH, accés remot xifrat |
| Usuari | root (procés principal), sshd
(subprocessos privilegi mínim) |
| Dependències | network.target, sshd.socket (opcional,
activació sota demanda) |
| Ports | TCP/22 |
| Configuració | /etc/ssh/sshd_config |
| Logs | journalctl -u sshd |
| Comportament normal | Un procés pare + un fill per sessió activa |
Aquesta documentació es pot generar de forma semiautomàtica combinant systemctl list-units, ps --forest i man de cada servei, i mantenir-la actualitzada com a part
dels procediments d’explotació del sistema (runbooks).
| Acció | Linux | Windows (PowerShell) |
|---|---|---|
| Llistar processos | ps aux, top, htop |
Get-Process, Task Manager |
| Arbre de processos | pstree, ps --forest |
Process Explorer |
| Matar un procés | kill, pkill, killall |
Stop-Process |
| Prioritat | nice, renice |
-Priority, .PriorityClass |
| Fils d’un procés | ps -eLf, top -H |
pestanya Threads de Process Explorer |
| Fitxers/connexions obertes | lsof, ss -tulpn |
Get-NetTCPConnection, handle.exe |
| Estat del nucli/registre de processos | /proc/<PID>/* |
WMI / Get-CimInstance Win32_Process |
| Gestió de serveis | systemctl |
Get-Service, sc.exe |
| Anàlisi d’arrencada | systemd-analyze |
Event Viewer (log System) |