La lliçó anterior va acabar amb una limitació clara de la shell: un guió solt no és un sistema. Algú ha d'arrencar meteo-api quan la màquina s'engega, esperar que /var/lib/meteora estigui muntat, reiniciar-lo si cau, executar l'agregador cada hora encara que el servidor estigués apagat a les 03:00, aplicar-los els límits i l'enfortiment del mòdul 5, i recollir-ne els registres. Aquest algú és el gestor de serveis: el procés amb PID 1 que el nucli arrenca al final de l'arrencada i que no mor fins que la màquina s'apaga.
Aquesta lliçó té dues meitats. A la primera seguim l'engegada de meteo-01 fase per fase, des que el microprogramari pren el control fins que apareix el PID 1, i aprenem què es pot observar i tocar a cada fase —perquè la meitat de les incidències greus d'arrencada es resolen sabent passar un paràmetre al nucli des de GRUB—. A la segona desmuntem systemd: el seu model d'unitats, l'anatomia completa de la unitat de meteo-api, les dependències, els temporitzadors que substitueixen cron, i el guió de diagnòstic de «el meu servei no arrenca», que és una de les coses que faràs més vegades a la teva vida professional.
El monitoratge de rendiment és la lliçó següent; aquí ens ocupem de què corre, quan i sota quines regles.
Contingut
- L'arrencada de
meteo-01, fase a fase - Quin problema va resoldre systemd
- El model d'unitats
- Anatomia d'un fitxer d'unitat:
meteo-apicomplet - Tipus de servei i com triar bé
- Dependències davant d'ordre
- Objectius i nivells d'execució
- El maneig diari amb
systemctl - Polítiques de reinici i el bucle que amaga una errada
- Temporitzadors davant de
cron - Activació per socket i per camí
- Unitats d'usuari i
loginctl - Anàlisi i depuració de l'arrencada
- Aturada ordenada:
SIGTERM,SIGKILLiTimeoutStopSec
L'arrencada de meteo-01, fase a fase
graph TD
A["Microprogramari UEFI<br/>POST + inicialització del maquinari"] --> B["Llegeix l'ESP (FAT32)<br/>i executa shimx64.efi / grubx64.efi"]
B --> C["GRUB: menú, grub.cfg<br/>carrega vmlinuz + initrd"]
C --> D["Nucli: descomprimeix, munta l'initramfs<br/>com a arrel temporal a la RAM"]
D --> E["initramfs: carrega mòduls<br/>(RAID, LUKS, LVM), acobla /dev/md0"]
E --> F["switch_root a l'arrel real<br/>i execve de /sbin/init"]
F --> G["systemd, PID 1<br/>arriba a default.target"]
G --> H["meteo-api escolta al :443"]
Fase 1: microprogramari. En prémer el botó, la CPU comença a executar codi del microprogramari de la placa. Hi ha dos mons:
| BIOS heretada | UEFI | |
|---|---|---|
| On és l'arrencada | MBR: 446 bytes al sector 0 | Fitxers .efi a l'ESP, una partició FAT32 |
| Mida del codi inicial | Ridícula: només hi cap una càrrega en cadena | Un executable complet, amb controladors |
| Taula de particions | MBR (màx. 2 TB, 4 primàries) | GPT (sense aquests límits, amb CRC) |
| Arrencada segura | No existeix | Secure Boot: signatures verificades pel microprogramari |
| Diagnòstic | Gairebé nul | Shell EFI, efibootmgr, variables NVRAM |
meteo-01 arrenca per UEFI. La seva ESP està muntada a /boot/efi i conté EFI/debian/grubx64.efi i el shimx64.efi signat per Microsoft que fa possible el Secure Boot: el microprogramari verifica la signatura de shim, shim la de GRUB, GRUB la del nucli i el nucli la dels mòduls. La cadena existeix per impedir un bootkit, codi maliciós que s'executa abans que el sistema operatiu i que per tant cap antivirus del sistema no pot veure. El seu preu pràctic és que un mòdul compilat a mà (per exemple un controlador propietari) no es carregarà sense signar-lo.
[ -d /sys/firmware/efi ] && echo "Arrencada UEFI" || echo "Arrencada BIOS heretada"
efibootmgr -v | head -3 # entrades d'arrencada a la NVRAM
mokutil --sb-state # SecureBoot enabledQuè demostren. El nucli només crea /sys/firmware/efi si ha arrencat per UEFI: és la comprovació canònica. efibootmgr llegeix les variables NVRAM on el microprogramari desa l'ordre d'arrencada, i permet afegir o reordenar entrades sense entrar a la pantalla de configuració. mokutil informa de l'estat del Secure Boot.
Fase 2: gestor d'arrencada. GRUB llegeix /boot/grub/grub.cfg —fitxer generat, mai editat a mà: es produeix amb update-grub a partir de /etc/default/grub i /etc/grub.d/— i presenta el menú. Cada entrada indica un nucli, un initrd i una línia de paràmetres:
Prement e sobre l'entrada pots editar aquesta línia per a una sola arrencada, sense tocar el disc. És l'eina de rescat més important que existeix:
| Paràmetre | Per a què |
|---|---|
single o systemd.unit=rescue.target |
Mode mínim amb shell de root, sense serveis |
systemd.unit=emergency.target |
Encara més mínim: només l'arrel muntada en només lectura |
Treure quiet i afegir debug |
Veure tots els missatges del nucli per pantalla |
init=/bin/bash |
Saltar-se systemd del tot (arrel en només lectura; mount -o remount,rw /) |
nomodeset |
Arrencar sense el controlador gràfic que penja la màquina |
systemd.mask=meteo-api.service |
Arrencar sense un servei que impedeix l'arrencada |
Fase 3: nucli i initramfs. GRUB carrega a memòria el nucli comprimit i l'initrd, i salta al nucli, que es descomprimeix, inicialitza la gestió de memòria del mòdul 2 i munta l'initramfs com a arrel temporal a la RAM.
Per què existeix l'initramfs? Per un problema de l'ou i la gallina. L'arrel real de meteo-01 és a /dev/md0, un RAID 1 sobre ext4. Per muntar-la cal el mòdul raid1 i el d'ext4… que són dins d'aquesta mateixa arrel. L'initramfs trenca el cercle: és un cpio comprimit amb els mòduls imprescindibles i un /init mínim que carrega els controladors, acobla el RAID, obre el LUKS si n'hi ha, activa els volums LVM i només llavors munta l'arrel real. Després executa switch_root, que substitueix l'arrel temporal per la real, allibera la RAM de l'initramfs i fa execve de /sbin/init —un enllaç a /lib/systemd/systemd— amb PID 1.
lsinitramfs /boot/initrd.img-$(uname -r) | grep -E 'raid1|ext4' # quins mòduls porta
update-initramfs -u -k all # regenerar-lo després d'un canvi
dmesg -T | head -40 # el diari del nucli
dmesg -T --level=err,warn # només errors i avisosQuè fan i per què importen. Si afegeixes un disc o canvies l'esquema d'emmagatzematge i oblides update-initramfs, la màquina arrencarà fins a l'initramfs i s'hi quedarà amb un prompt (initramfs) perquè no troba l'arrel: és un dels totxos més freqüents. I dmesg és la memòria intermèdia circular del nucli, on queda tot el que ha passat des de la primera instrucció: detecció de maquinari, errors de disc, l'OOM killer de 02-04, els missatges del RAID. -T tradueix les marques de temps relatives a dates llegibles.
Fase 4: PID 1. El PID 1 és especial per tres motius que venen de 02-01: no se li poden aplicar els senyals per defecte (el nucli ignora SIGTERM i SIGKILL cap a ell, perquè ningú no el pugui matar per accident), adopta els orfes i en recull els estats de sortida evitant els zombis, i si mor, el nucli entra en pànic. Tota la resta del sistema descendeix d'ell.
Quin problema va resoldre systemd
Abans de systemd, l'arrencada la governava SysV init: guions de shell a /etc/init.d/ que s'executaven per ordre alfabètic des de /etc/rc3.d/ (S01, S02, S03…), un darrere l'altre, cadascun arrencant el seu dimoni amb un start-stop-daemon. El model tenia cinc problemes greus:
| Problema de SysV init | Resposta de systemd |
|---|---|
Execució seqüencial: si S20 triga 30 s, tota la resta espera |
Paral·lelisme real: només se serialitza el que declara que depèn d'alguna cosa |
| Les dependències es codificaven al número de l'enllaç | Dependències declarades (After=, Requires=) i resoltes per un graf |
| Tot s'arrenca sempre, tant si es fa servir com si no | Activació sota demanda per socket, camí o dispositiu |
| Si el dimoni moria, ningú no se n'assabentava | Supervisió: systemd és el pare i reinicia segons la política |
Un dimoni podia deixar processos solts que stop no matava |
Cada servei viu al seu cgroup: s'atura el grup sencer |
Aquest últim punt és el més subestimat i connecta directament amb 06-02. Un guió SysV rastrejava el seu dimoni per un fitxer .pid; si el procés es dimonitzava malament, canviava de PID o llançava fills, el stop matava el PID equivocat i deixava processos orfes consumint recursos. systemd posa cada servei en un grup de control propi, així que la pertinença és una propietat del nucli, no una suposició: aturar el servei significa senyalar tot el cgroup, i els comptes de CPU, memòria i E/S del servei són exactes.
systemctl status meteo-api.service | tail -6
# CGroup: /system.slice/meteo-api.service
# ├─1834 /usr/local/bin/meteo-api --config /etc/meteora/meteora.conf
# └─1847 /usr/local/bin/meteo-api --worker 1
systemd-cgls /system.slice | head -20 # l'arbre de cgroups per serveiQuè demostra. El camp CGroup de status llista tots els processos del servei, inclosos els que ell hagi llançat. Cap procés no se li escapa a systemd, perquè el cgroup l'assigna el nucli al fork i s'hereta.
El model d'unitats
Tot a systemd és una unitat: un fitxer de text en format INI que descriu alguna cosa que es gestiona. Els tipus que has de conèixer:
| Tipus | Extensió | Què descriu | Exemple a meteo-01 |
|---|---|---|---|
| Servei | .service |
Un procés supervisat | meteo-api.service |
| Socket | .socket |
Un punt d'escolta que pot activar un servei | meteo-api.socket |
| Objectiu | .target |
Un punt de sincronització, un «estat» | multi-user.target |
| Temporitzador | .timer |
Execució programada d'una altra unitat | agregador.timer |
| Muntatge | .mount |
Un punt de muntatge (generat des de /etc/fstab) |
var-lib-meteora.mount |
| Camí | .path |
Vigila un fitxer o directori | lectures-noves.path |
| Porció | .slice |
Un node de l'arbre de cgroups per agrupar límits | meteora.slice |
On viuen, per ordre de prioritat creixent:
| Directori | Qui l'escriu | Es perd en actualitzar |
|---|---|---|
/lib/systemd/system/ |
El paquet de la distribució | Sí: no editis mai aquí |
/etc/systemd/system/ |
L'administrador | No: és el teu territori |
/run/systemd/system/ |
Unitats transitòries a memòria | Sí, en reiniciar |
Un fitxer a /etc/systemd/system/meteo-api.service substitueix del tot el del paquet. Gairebé mai no és el que vols: si el paquet millora la seva unitat, et quedes amb la vella. El correcte és un drop-in, un fragment que es fusiona amb l'original:
systemctl edit meteo-api.service # crea .../meteo-api.service.d/override.conf
systemctl cat meteo-api.service # mostra l'original I tots els drop-ins aplicats
systemctl edit --full meteo-api.service # còpia sencera a /etc (només si no hi ha més remei)Què fan. systemctl edit obre un editor sobre /etc/systemd/system/meteo-api.service.d/override.conf, i en desar executa daemon-reload automàticament. systemctl cat és l'ordre que hauries de fer servir sempre abans de tocar res: mostra el fitxer d'origen i, a sota, cada drop-in amb el seu camí, de manera que veus la configuració efectiva i d'on surt cada directiva.
Un parany que cal conèixer: en un drop-in, les directives que accepten llistes (com ExecStart o Environment) s'acumulen. Per reemplaçar un ExecStart cal buidar-lo primer amb una línia ExecStart= sense valor i després posar-hi el nou.
Anatomia d'un fitxer d'unitat: meteo-api complet
# /etc/systemd/system/meteo-api.service
[Unit]
Description=API de consultes meteorològiques de Meteora
Documentation=https://docs.meteora.example/api
After=network-online.target var-lib-meteora.mount
Wants=network-online.target
RequiresMountsFor=/var/lib/meteora /var/log/meteora
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
Type=notify
NotifyAccess=main
User=meteora
Group=meteora
ExecStartPre=/usr/local/bin/verificar-lectures.sh -d /var/lib/meteora/lectures
ExecStart=/usr/local/bin/meteo-api --config /etc/meteora/meteora.conf --listen 0.0.0.0:443
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
TimeoutStartSec=60
TimeoutStopSec=30
WatchdogSec=30
# --- Enfortiment (mecanisme explicat a 05-03) ---
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/meteora /var/log/meteora /run/meteora
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
LockPersonality=yes
MemoryDenyWriteExecute=yes
UMask=0027
# --- Límits de recursos (cgroups v2, de 06-02) ---
MemoryMax=2G
MemoryHigh=1500M
CPUWeight=200
IOWeight=200
TasksMax=512
[Install]
WantedBy=multi-user.targetSecció per secció:
[Unit]descriu la unitat i les seves relacions.Descriptionés el que apareix asystemctl statusi als registres: escriu-la per a un humà mig adormit.After=fixa ordre, no dependència.RequiresMountsFor=és la manera correcta de dir «no arrenquis si aquests camins no estan muntats»: systemd dedueix sol les unitats.mountimplicades, i és més robust que anomenar-les a mà, perquè el nom d'una unitat de muntatge es codifica d'una manera peculiar (/var/lib/meteora→var-lib-meteora.mount).[Service]defineix com s'executa.ExecStartPrecorre abans i, si falla, el servei no arrenca: aquí reaprofitem el guió de verificació de 07-01 com a comprovació prèvia.ExecStartés el procés principal, sempre amb camí absolut (systemd no fa servir elPATHde la teva shell).ExecReloadrecarrega la configuració sense tallar les connexions;$MAINPIDés una de les poques variables que systemd expandeix.- El bloc d'enfortiment és el mòdul 5 fet directives.
NoNewPrivilegesposa el bit del nucli que impedeix guanyar privilegis per setuid, així que ni un binari setuid compromès no serviria d'escaló.AmbientCapabilities=CAP_NET_BIND_SERVICEés el que permet escoltar al port 443 sense ser root, iCapabilityBoundingSetfixa el sostre: encara que el procés volgués una altra capability, el nucli no l'hi concedeix.ProtectSystem=strictmunta tot el sistema de fitxers en només lectura per al servei, iReadWritePathsobre les tres excepcions necessàries.PrivateTmpli dona un/tmppropi en un namespace de muntatge, cosa que elimina d'arrel els atacs per fitxers temporals predictibles.SystemCallFilter=@system-serviceaplica un filtre seccomp que deixa passar el conjunt habitual d'un servei i bloqueja la resta retornantEPERM.UMask=0027fixa els permisos de creació acordats per a Meteora. [Install]només es fa servir en ferenable.WantedBy=multi-user.targetsignifica «quan s'habiliti, crea un enllaç amulti-user.target.wants/». Sense secció[Install], un servei no es pot habilitar: es pot arrencar a mà, però no arrenca sol. És un descuit freqüent.
Verifica sempre el que has escrit abans de confiar-hi:
systemd-analyze verify /etc/systemd/system/meteo-api.service # errors de sintaxi i referències
systemd-analyze security meteo-api.service # puntuació d'exposició
# → Overall exposure level for meteo-api.service: 1.9 OKQuè aporten. verify detecta directives mal escrites i unitats referenciades inexistents, que altrament només donarien la cara en arrencar. security puntua de 0 (blindat) a 10 (exposat) avaluant desenes de directives d'aïllament, i llista una per una les que falten: és una llista de tasques d'enfortiment generada automàticament.
I la unitat de l'ingestor, més senzilla perquè no escolta en un port privilegiat:
# /etc/systemd/system/ingestor.service
[Unit]
Description=Receptor de lectures de les estacions de Meteora
After=network-online.target var-lib-meteora.mount
RequiresMountsFor=/var/lib/meteora
[Service]
Type=exec
User=meteora
Group=meteora
RuntimeDirectory=meteora
RuntimeDirectoryMode=0750
ExecStart=/usr/local/bin/ingestor --fifo /run/meteora/lectures.fifo --out /var/lib/meteora/lectures
Restart=always
RestartSec=2s
NoNewPrivileges=yes
ProtectSystem=strict
ReadWritePaths=/var/lib/meteora
PrivateTmp=yes
Nice=-5
[Install]
WantedBy=multi-user.targetEl que és nou aquí. RuntimeDirectory=meteora fa que systemd creï /run/meteora amb el propietari i el mode indicats en arrencar i l'esborri en aturar-se: és la manera correcta de gestionar el directori on viu la FIFO /run/meteora/lectures.fifo, en lloc de crear-lo a mà en un guió. Nice=-5 dona a l'ingestor una mica més de prioritat de CPU (02-02) perquè perdre lectures entrants és irrecuperable, mentre que una consulta lenta de l'API només molesta.
Tipus de servei i com triar bé
Type= diu a systemd quan ha de considerar que el servei ja ha arrencat, cosa que governa quan poden arrencar els que en depenen.
| Tipus | Es considera arrencat quan… | Quan fer-lo servir |
|---|---|---|
simple |
Es fa fork+exec (immediatament!) |
Per defecte; el procés no es dimonitza |
exec |
L'execve ha tingut èxit |
Millor que simple: detecta binari inexistent o sense permisos |
forking |
El procés pare acaba i el fill queda | Dimonis clàssics a l'estil UNIX; requereix PIDFile= |
oneshot |
El procés acaba (amb èxit) | Tasques puntuals: migracions, neteges, guions |
notify |
El procés envia READY=1 per sd_notify() |
Serveis que triguen a estar llestos de debò |
idle |
Com simple, però espera que no hi hagi més tasques |
Només per no embrutar la consola |
L'errada típica, i és tan freqüent que es mereix detall: declarar Type=simple un programa que es dimonitza (fa fork, el pare surt, el fill continua). systemd veu que el procés que ha llançat ha acabat immediatament i, segons la política de reinici, o el dona per mort i el reinicia en bucle, o el dona per arrencat i correcte mentre el dimoni real corre sense supervisió. El símptoma és un status que diu active (exited) o un cicle de reinicis d'un servei que en realitat funciona. La solució no és barallar-se amb forking: és dir-li al programa que no es dimonitzi (gairebé tots tenen --foreground o -D) i fer servir Type=exec.
Hem triat Type=notify per a meteo-api per una raó concreta: el servei triga uns 8 segons a carregar l'índex i escalfar la memòria cau a /dev/shm/meteora-cache. Amb simple, systemd el donaria per llest a l'instant i qualsevol unitat que en depengui —o el balancejador que mira l'estat— actuaria sobre un servei que encara retorna errors. Amb notify, el programa crida sd_notify(0, "READY=1") quan de debò pot atendre, i systemd espera. WatchdogSec=30 hi afegeix el contrari: el servei ha d'enviar WATCHDOG=1 cada 30 segons o systemd el considera penjat i el reinicia, cosa que detecta bloqueigs interns que no maten el procés.
Dependències davant d'ordre
Aquesta és la distinció que causa més confusió, i és molt simple: són eixos independents.
| Directiva | Significa |
|---|---|
Requires=B |
Dependència: si arrenco jo, arrenca B; si B falla o s'atura, jo també m'aturo |
Wants=B |
Dependència feble: intenta arrencar B, però si falla, continuo igualment |
BindsTo=B |
Com Requires, i a més m'aturo si B desapareix (útil amb dispositius) |
Conflicts=B |
B i jo no podem estar actius alhora |
After=B |
Ordre: no arrenco fins que B hagi acabat d'arrencar |
Before=B |
Ordre: B no arrenca fins que jo acabi |
La il·lustració crucial. Si escrius només Requires=var-lib-meteora.mount, systemd arrencarà el muntatge i el teu servei alhora, en paral·lel: pot ser que meteo-api intenti obrir /var/lib/meteora/lectures/2026-08-31.dat abans que el sistema de fitxers estigui muntat, i falli amb ENOENT. I si escrius només After=var-lib-meteora.mount, ordenes correctament però no demanes el muntatge: si ningú més no l'activa, el teu servei arrenca sense dades. Gairebé sempre necessites totes dues, i per això existeix RequiresMountsFor=: genera les dues de cop.
Un altre matís important: a l'aturada, l'ordre s'inverteix automàticament. After=network-online.target implica que en la parada meteo-api s'atura abans que la xarxa, que és justament el que vols per poder tancar les connexions netament.
I network-online.target es mereix una advertència: no significa «hi ha connectivitat a Internet», sinó «el gestor de xarxa declara que ha acabat de configurar les interfícies». Necessita que un servei com systemd-networkd-wait-online estigui habilitat; sense ell, l'objectiu s'assoleix immediatament i no garanteix res. Un servei robust reintenta la connexió en lloc de confiar en l'ordre d'arrencada.
systemctl list-dependencies meteo-api.service # què necessita (arbre cap avall)
systemctl list-dependencies --reverse meteo-api.service # qui el necessita a ell
systemctl show meteo-api.service -p After -p Requires # les relacions efectives, ja resoltesObjectius i nivells d'execució
Un objectiu (target) no fa res per si mateix: és un punt de sincronització que agrupa unitats. Substitueix els nivells d'execució de SysV:
| Nivell SysV | Objectiu systemd | Estat |
|---|---|---|
| 0 | poweroff.target |
Apagat |
| 1 | rescue.target |
Monousuari, shell de root |
| 3 | multi-user.target |
Multiusuari en xarxa, sense gràfics (el d'un servidor) |
| 5 | graphical.target |
Multiusuari amb entorn gràfic |
| 6 | reboot.target |
Reinici |
| — | emergency.target |
Només l'arrel muntada en només lectura |
systemctl get-default # multi-user.target
systemctl set-default multi-user.target # objectiu per defecte en arrencar
systemctl isolate rescue.target # canviar ARA (atura tot el que no hi pertanyi)Compte amb isolate. Atura totes les unitats que no formin part de l'objectiu destí: executat per error en producció, tomba els serveis. Com a diagnòstic previ, systemctl list-units --type=target mostra quins objectius estan actius ara mateix.
El maneig diari amb systemctl
systemctl status meteo-api.service
# ● meteo-api.service - API de consultes meteorològiques de Meteora
# Loaded: loaded (/etc/systemd/system/meteo-api.service; enabled; preset: enabled)
# Active: active (running) since Mon 2026-08-31 02:14:07 CEST; 1h 3min ago
# Main PID: 1834 (meteo-api)
# Status: "Servint; memòria cau 94% plena"
# Tasks: 17 (limit: 512)
# Memory: 1.1G (high: 1.4G, max: 2.0G)
# CPU: 12min 4.031s
# CGroup: /system.slice/meteo-api.service
# └─1834 /usr/local/bin/meteo-api --config /etc/meteora/meteora.confCamp a camp, que és on hi ha la informació:
| Camp | Què et diu | Parany |
|---|---|---|
Loaded |
Si el fitxer s'ha llegit, el seu camí i si està habilitat | enabled ≠ active: habilitat és «arrenca en iniciar», actiu és «corre ara» |
Active |
Estat i des de quan | Si el «des de quan» és de fa 40 segons i no has tocat res, s'està reiniciant en bucle |
Main PID |
El procés principal | Si canvia entre dos status, hi ha reinicis |
Status |
Text que el servei mateix publica amb sd_notify |
Només apareix a Type=notify |
Tasks |
Fils i processos, davant del límit TasksMax |
Fregar el límit provoca errades de clone() |
Memory |
Ús real del cgroup, amb high i max |
És la xifra fiable, no la de top (07-03) |
CGroup |
Tots els processos del servei | Aquí veus els fills que se t'escapaven amb SysV |
| Ordre | Què fa |
|---|---|
systemctl start/stop/restart NOM |
Arrencar, aturar, reiniciar ara |
systemctl reload NOM |
Executar ExecReload sense tallar el servei |
systemctl enable NOM |
Que arrenqui a les properes arrencades (crea l'enllaç d'[Install]) |
systemctl enable --now NOM |
Habilitar i arrencar d'un sol cop |
systemctl disable / mask |
Treure de l'arrencada / prohibir que arrenqui de cap manera |
systemctl daemon-reload |
Rellegir els fitxers d'unitat després d'editar-los |
systemctl list-units --failed |
La primera ordre de qualsevol diagnòstic |
systemctl is-active NOM |
Estat en una paraula, amb codi de sortida (per a guions) |
enable davant de start és la confusió número u del principiant: start arrenca ara i no sobreviu al reinici; enable prepara l'arrencada futura però avui no arrenca res. I daemon-reload davant de reload: el primer diu a systemd que rellegeixi les unitats; el segon diu al servei que rellegeixi la seva configuració. Editar una unitat sense daemon-reload és un clàssic: systemd continua fent servir la versió vella i tu et tornes boig.
Els registres per unitat, amb el journalctl que ja coneixes de 05-04:
journalctl -u meteo-api.service -n 50 --no-pager # últimes 50 línies
journalctl -u meteo-api.service -f # seguiment en viu
journalctl -u meteo-api.service --since "2026-08-31 03:00" --until "03:30"
journalctl -u meteo-api.service -p err -b # només errors de l'arrencada actual
journalctl -u meteo-api.service -b -1 # de l'arrencada ANTERIOR: clau després d'una penjada
journalctl -u meteo-api.service -o json-pretty -n 1 # tots els camps estructuratsPer què això és millor que un fitxer de registre. Com que systemd és el pare del procés i captura el seu stdout i stderr, qualsevol cosa que el servei imprimeixi queda registrada, inclosos els missatges d'una errada en arrencar que mai no arribaria a escriure al seu propi fitxer. Cada entrada porta la unitat, el PID, l'UID i l'arrencada en què va passar, cosa que permet filtrar amb precisió. -b -1 és l'ordre que salva la investigació després d'un reinici inesperat.
Polítiques de reinici i el bucle que amaga una errada
Restart= |
Reinicia quan… |
|---|---|
no |
Mai (per defecte) |
on-failure |
Codi de sortida ≠ 0, senyal, temps exhaurit o errada del watchdog |
on-abnormal |
Només senyal, temps exhaurit o watchdog (no pel codi de sortida) |
always |
Sempre, fins i tot després d'una parada neta |
on-success |
Només si ha acabat bé (útil en tasques cícliques) |
Per a meteo-api fem servir on-failure: si algú l'atura expressament, ha de quedar-se aturat. Per a l'ingestor fem servir always, perquè no hi ha cap raó legítima perquè acabi.
El perill real és el bucle de reinici que amaga l'errada. Imagina que algú introdueix un error de sintaxi a /etc/meteora/meteora.conf: el servei arrenca, falla en 200 ms, systemd el reinicia, torna a fallar… A 200 ms per volta són 5 intents per segon, que omplen el diari, consumeixen CPU i —el pitjor— fan que un monitor que mostreja cada 30 segons vegi de vegades active i de vegades failed, amb la qual cosa l'alerta no s'acaba de disparar i ningú no investiga.
Per això hi ha el limitador d'arrencades i RestartSec:
StartLimitIntervalSec=300 # finestra d'observació
StartLimitBurst=5 # màxim d'arrencades en aquesta finestra
RestartSec=5s # espera entre intentsQuè aconsegueixen. Amb aquests valors, si el servei arrenca més de 5 vegades en 300 segons, systemd deixa d'intentar-ho i el marca failed amb el motiu start-limit-hit. Això converteix un bucle silenciós en un estat estable i visible, que sí que dispara l'alerta. RestartSec=5s evita a més el martelleig. Si l'errada és transitòria (una dependència que triga), 5 reintents separats per 5 segons donen prou marge. Després de corregir la causa cal executar systemctl reset-failed meteo-api.service per netejar el comptador abans de tornar a arrencar; oblidar-ho és un altre descuit habitual.
Temporitzadors davant de cron
L'agregador s'ha d'executar cada hora. A systemd són dues unitats: la feina i el seu rellotge.
# /etc/systemd/system/agregador.service
[Unit]
Description=Càlcul de mitjanes horàries de Meteora
RequiresMountsFor=/var/lib/meteora
[Service]
Type=oneshot
User=meteora
Group=meteora
ExecStart=/usr/local/bin/agregador --entrada /var/lib/meteora/lectures --hora-anterior
NoNewPrivileges=yes
ProtectSystem=strict
ReadWritePaths=/var/lib/meteora
PrivateTmp=yes
IOSchedulingClass=idle
Nice=10
TimeoutStartSec=900# /etc/systemd/system/agregador.timer
[Unit]
Description=Executa l'agregador de Meteora cada hora
[Timer]
OnCalendar=hourly
AccuracySec=1min
RandomizedDelaySec=180
Persistent=true
Unit=agregador.service
[Install]
WantedBy=timers.targetDirectiva per directiva, amb el perquè:
OnCalendar=hourlyequival a*-*-* *:00:00. La sintaxi admet expressions comMon..Fri 06:00,*-*-01 03:30odaily. Comprova-la sempre abans de confiar-hi:systemd-analyze calendar 'Mon..Fri 06:00' --iterations=3imprimeix les properes execucions reals.Persistent=truedesa al disc la marca de l'última execució i, si la màquina estava apagada a l'hora prevista, executa la feina tan bon punt arrenca. És el que al món clàssic feiaanacron, aquí amb una sola línia.RandomizedDelaySec=180dispersa l'arrencada fins a 3 minuts a l'atzar. Amb una màquina tant se val, però amb cinquanta servidors que agreguen a les 03:00 en punt evita l'estampida que satura la cabina d'emmagatzematge compartida.AccuracySec=1minpermet a més a systemd agrupar despertaments i estalviar energia; posa-ho a1usnomés si de debò necessites precisió.IOSchedulingClass=idleiNice=10al servei fan que l'agregadorcedeixi davant demeteo-api, tant al disc com a la CPU. Aquesta és exactament la mitigació que s'aplicarà al cas pràctic de 07-04.Type=oneshotambTimeoutStartSec=900: la tasca acaba, no es queda corrent, i si al cap de 15 minuts no ha acabat es considera penjada.
systemctl enable --now agregador.timer
systemctl list-timers --all
# NEXT LEFT LAST PASSED UNIT
# Mon 2026-08-31 04:00:00 CEST 47min left Mon 2026-08-31 03:01:12 CEST 11min agregador.timer
systemctl start agregador.service # executar-lo ARA, sense esperar el rellotge
journalctl -u agregador.service -n 30Detall important: s'habilita el .timer, no el .service. Si habilitessis el servei, arrencaria també a cada inici del sistema. I per provar la tasca a mà s'arrenca el .service, que és la unitat que fa la feina.
Comparació amb cron:
| Aspecte | cron / anacron |
Temporitzador de systemd |
|---|---|---|
| Sintaxi | 0 * * * *, compacta però críptica |
OnCalendar=hourly, llegible i verificable |
| Execució perduda per apagada | Només amb anacron, i amb granularitat diària |
Persistent=true, a qualsevol granularitat |
| Registres | A stdout → correu local que ningú no llegeix |
Al diari, amb journalctl -u |
| Aïllament i límits | Cap: hereta l'entorn de cron |
Totes les directives de [Service] |
| Supervisió d'encavalcament | Manual, amb flock |
Automàtica: no arrenca si ja està actiu |
| Dispersió de càrrega | Manual | RandomizedDelaySec |
| Dependències | No existeixen | Requires=, After= |
| Ubiqüitat | És a tot arreu | Només a sistemes amb systemd |
Aquest últim punt és el que justifica conèixer crontab: continua sent omnipresent. Els cinc camps són minut, hora, dia del mes, mes i dia de la setmana (0 3 * * 1 = dilluns a les 03:00); crontab -e edita el de l'usuari i crontab -l el llista; a /etc/cron.d/ els fitxers porten un camp extra amb l'usuari. I una advertència que causa incidents: cron executa amb un PATH mínim (/usr/bin:/bin) i sense les variables de la teva sessió, que és exactament l'error de 07-01 sobre fitxers de configuració de shell. Fes servir camins absoluts sempre.
Com a regla: en sistemes amb systemd, temporitzador; i tot i així, mantén el flock dins del guió, perquè protegeix també davant d'una execució manual simultània.
Activació per socket i per camí
L'activació per socket inverteix l'ordre habitual: systemd obre el punt d'escolta i només arrenca el servei quan arriba la primera connexió.
# /etc/systemd/system/meteo-api.socket
[Socket]
ListenStream=0.0.0.0:443
Backlog=2048
NoDelay=true
[Install]
WantedBy=sockets.targetQuè aconsegueix. El socket el crea systemd (amb privilegis) i el passa al servei com a descriptor de fitxer heretat, de manera que meteo-api ni tan sols necessita CAP_NET_BIND_SERVICE. A més, com que el socket existeix des de l'arrencada, les connexions que arribin mentre el servei es reinicia s'encuen al backlog en lloc de rebutjar-se: es poden fer desplegaments sense connexions perdudes. I les unitats que depenen del servei poden arrencar tan bon punt el socket està llest, no quan el procés està llest, cosa que paral·lelitza l'arrencada. És el mateix mecanisme que fa servir inetd des dels anys 80, però integrat amb la resta del model.
L'activació per camí vigila el sistema de fitxers:
# /etc/systemd/system/lectures-noves.path
[Path]
PathExistsGlob=/var/lib/meteora/entrada/*.dat
Unit=processar-entrada.service
[Install]
WantedBy=paths.targetQuè aconsegueix. Tan bon punt apareix un fitxer que encaixa amb el patró, systemd arrenca processar-entrada.service. És l'alternativa correcta al bucle while true; do ls ...; sleep 10; done, perquè fa servir l'inotify del nucli: consum zero mentre no passa res i reacció immediata quan passa.
Unitats d'usuari i loginctl
Cada usuari amb sessió té la seva pròpia instància de systemd, que gestiona unitats a ~/.config/systemd/user/ sense privilegis de root:
systemctl --user status # el gestor de l'usuari actual
systemctl --user enable --now informe-personal.timer
loginctl list-sessions # sessions actives, amb TTY i tipus
loginctl show-user joan -p Linger # sobreviuen els seus serveis al tancament de sessió?
loginctl enable-linger joan # que sí que hi sobrevisquinPer què importa. Per defecte, les unitats d'usuari moren en tancar l'última sessió: és el correcte per a un escriptori, però sorprèn en un servidor. enable-linger manté la instància viva. I loginctl és la finestra a systemd-logind, el component que gestiona sessions, seients i el pam_systemd que vas veure a 05-02. Regla pràctica: els serveis d'infraestructura, com els de Meteora, van sempre al gestor del sistema; les unitats d'usuari són per a tasques personals.
Anàlisi i depuració de l'arrencada
systemd-analyze time
# Startup finished in 4.216s (firmware) + 3.104s (loader) + 2.891s (kernel) + 11.402s (userspace) = 21.613s
systemd-analyze blame | head -5
# 6.812s meteo-api.service
# 3.204s systemd-networkd-wait-online.service
# 1.118s var-lib-meteora.mount
systemd-analyze critical-chain meteo-api.service
# multi-user.target @11.380s
# └─meteo-api.service @4.568s +6.812s
# └─var-lib-meteora.mount @3.402s +1.118sCom llegir-los, que és on falla tothom. blame ordena per durada, no per impacte: un servei que triga 6 segons però arrenca en paral·lel amb altres vint no retarda res. critical-chain sí que mostra el camí crític: @ és l'instant en què la unitat va començar i + el que va trigar, així que només reduint el que apareix en aquesta cadena s'escurça l'arrencada. A l'exemple, meteo-api sí que és al camí crític i el seu ExecStartPre de verificació és part d'aquests 6,8 segons: una decisió conscient de canviar arrencada ràpida per arrencada segura.
El guió de «el meu servei no arrenca», per ordre:
systemctl status meteo-api.service -l --no-pager— el motiu gairebé sempre és a les últimes línies. Mira l'Active:(failed,activating,inactive?) i el codi:status=203/EXECés «no s'ha pogut executar el binari» (camí mal escrit, sense permís d'execució, shebang no vàlid);status=200/CHDIRés unWorkingDirectoryinexistent;status=1és el programa mateix sortint amb error.journalctl -u meteo-api.service -n 100 --no-pager— el missatge real del programa. Si és buit, l'errada és anterior al programa.systemctl cat meteo-api.service— comprova que la unitat efectiva és la que et penses, amb els seus drop-ins. Has fetdaemon-reload?systemd-analyze verify /etc/systemd/system/meteo-api.service— sintaxi i referències.- Executa l'ordre a mà, com l'usuari del servei:
sudo -u meteora /usr/local/bin/meteo-api --config /etc/meteora/meteora.conf. Si a mà funciona i com a servei no, la diferència és a l'entorn:PATH, directori de treball, variables, o l'enfortiment. - Sospita de l'enfortiment, que és la causa moderna més freqüent. Comenta temporalment
ProtectSystem=strictoSystemCallFilter=en un drop-in i prova-ho. Si amb això arrenca, ja saps quina directiva has d'afinar; busca-ho ambjournalctl -k | grep -i seccompo_AUDIT_FIELD_SYSCALL. - Comprova permisos i SELinux/AppArmor:
namei -l /var/lib/meteora/lecturesrecorre el camí sencer mostrant el propietari i el mode de cada component, idmesg | grep -i denieddelata el control d'accés obligatori de 05-01. - Dependències:
systemctl list-dependencies --failedisystemctl show -p After -p Requires.
Aturada ordenada: SIGTERM, SIGKILL i TimeoutStopSec
Quan executes systemctl stop meteo-api.service, systemd segueix una seqüència estricta:
- Envia
SIGTERMal procés principal (o executaExecStopsi existeix). - Espera fins a
TimeoutStopSec(30 s a la nostra unitat). - Si no ha acabat, envia
SIGKILLa tots els processos del cgroup.
La diferència entre els dos senyals és la de sempre (03-03): SIGTERM és una petició educada que el programa pot capturar per acabar les peticions en curs, bolcar la memòria cau de /dev/shm/meteora-cache, fer fsync del que queda pendent i tancar; SIGKILL l'executa el nucli i no es pot capturar, així que el procés desapareix a mitges del que estigués fent.
Per què el valor de TimeoutStopSec importa de debò. Si és massa curt, un meteo-api que està acabant d'escriure un bloc rep SIGKILL a mitges i deixa un fitxer de lectures truncat —exactament el cas que detecta la comprovació mida % 24 != 0 del guió de 07-01—. Si és massa llarg, un reinici del sistema es queda penjat minuts esperant un procés que no respondrà mai. El valor correcte és el pitjor cas raonable de tancament net, més un marge: per a meteo-api, amb fins a 2 GB de memòria cau per bolcar, 30 segons.
A l'apagada completa (systemctl poweroff), systemd atura les unitats en ordre invers al d'arrencada, desmunta els sistemes de fitxers, sincronitza el disc i apaga. Si algun cop veus el missatge A stop job is running for ... (1min 30s / 2min) durant una apagada eterna, estàs veient exactament aquest mecanisme: una unitat que no respon a SIGTERM i esgota el seu temporitzador. journalctl -b -1 -p warning et dirà quina va ser.
Errors Habituals i Consells
| Error | Conseqüència | Solució |
|---|---|---|
Editar una unitat i no fer daemon-reload |
systemd fa servir la versió antiga | systemctl daemon-reload, o fes servir systemctl edit |
Copiar la unitat del paquet a /etc |
Et perds les millores del mantenidor | Drop-in amb systemctl edit |
Confondre enable amb start |
El servei no sobreviu al reinici, o no arrenca avui | enable --now |
Oblidar [Install] |
enable respon que no hi ha res a fer |
Afegeix WantedBy=multi-user.target |
Type=simple en un dimoni que es dimonitza |
Bucle de reinicis o supervisió falsa | --foreground + Type=exec |
After= sense Requires= (o a l'inrevés) |
Arrenca sense la seva dependència, o en paral·lel amb ella | RequiresMountsFor=, o totes dues directives |
Camins relatius a ExecStart |
status=203/EXEC |
Camí absolut sempre |
Diverses ordres amb ; o && a ExecStart |
No hi ha shell: es passen com a arguments literals | ExecStart=/bin/bash -c '...' o diverses ExecStartPre= |
Habilitar el .service en lloc del .timer |
La tasca s'executa també a cada arrencada | enable --now agregador.timer |
No fer reset-failed després de corregir |
El servei no arrenca pel límit assolit | systemctl reset-failed NOM |
TimeoutStopSec massa curt |
SIGKILL a mitja escriptura, dades truncades |
Ajusta'l al pitjor tancament net |
Editar grub.cfg a mà |
Es perd al següent update-grub |
Edita /etc/default/grub i regenera |
Consells: fes servir sempre systemctl cat abans de modificar res, perquè mostra la configuració efectiva; afegeix Documentation= a les teves unitats perquè qui et rellevi sàpiga on mirar; executa systemd-analyze security sobre cada servei nou i tracta-ho com una llista de tasques; i prova els reinicis de debò: un servidor que porta 400 dies engegat i que no s'ha reiniciat mai amaga, gairebé amb tota seguretat, un servei que no està habilitat.
Exercicis
Exercici 1: unitat per al verificador de lectures
Converteix el guió verificar-lectures.sh de 07-01 en un servei amb temporitzador que s'executi cada dia a les 06:15, recuperi l'execució si la màquina estava apagada, corri com a meteora sense més privilegis dels necessaris, no pugui escriure enlloc i es doni per penjat al cap de 10 minuts. Escriu les dues unitats i les ordres per activar-les i provar-les.
Exercici 2: diagnòstic d'un servei que no arrenca
Després d'un canvi, meteo-api no arrenca. systemctl status mostra:
Active: failed (Result: exit-code) since Mon 2026-08-31 03:02:11 CEST; 12s ago Process: 4471 ExecStart=/usr/local/bin/meteo-api --config /etc/meteora/meteora.conf (code=exited, status=203/EXEC)
Enumera, per ordre, les comprovacions que faries i quina causa confirmaria cadascuna.
Exercici 3: bucle de reinici
Un company defineix l'ingestor amb Restart=always i RestartSec=0, sense límit d'arrencades. Un error de configuració fa que falli en arrencar. Descriu què passa a la màquina en els 60 segons següents, per què el monitoratge podria no avisar, i quines tres directives hi afegiries.
Solucions
Solució 1
# /etc/systemd/system/verificar-lectures.service
[Unit]
Description=Verificació d'integritat de les dades de Meteora
RequiresMountsFor=/var/lib/meteora
[Service]
Type=oneshot
User=meteora
Group=meteora
ExecStart=/usr/local/bin/verificar-lectures.sh -d /var/lib/meteora/lectures
TimeoutStartSec=600
SuccessExitStatus=0 1
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
CapabilityBoundingSet=
SystemCallFilter=@system-service
Nice=10
IOSchedulingClass=idle# /etc/systemd/system/verificar-lectures.timer
[Unit]
Description=Verificació diària de les dades de Meteora
[Timer]
OnCalendar=*-*-* 06:15:00
Persistent=true
RandomizedDelaySec=300
Unit=verificar-lectures.service
[Install]
WantedBy=timers.targetsystemctl daemon-reload
systemctl enable --now verificar-lectures.timer
systemctl list-timers verificar-lectures.timer
systemctl start verificar-lectures.service # prova immediata
journalctl -u verificar-lectures.service -n 40 --no-pager
systemd-analyze calendar '*-*-* 06:15:00' --iterations=3Punts clau. ProtectSystem=strict sense ReadWritePaths deixa tot el sistema en només lectura, que és justament el que demana l'enunciat: el verificador només llegeix (el seu directori temporal el cobreix PrivateTmp). CapabilityBoundingSet= buit elimina totes les capabilities, perquè un guió de comprovació no en necessita cap. TimeoutStartSec=600 dona els 10 minuts demanats, i com que és Type=oneshot systemd sap que la unitat ha acabat quan el procés surt. SuccessExitStatus=0 1 és el detall fi: el nostre guió retorna 1 quan hi ha advertiments, i no volem que això marqui la unitat com a failed; el 3 (crític) sí que ho ha de fer. I Persistent=true cobreix el requisit de recuperar l'execució perduda.
Solució 2
status=203/EXEC significa que l'execve ha fallat: systemd no ha arribat a executar res, així que el diari del servei estarà buit i el problema és del binari o del seu entorn, no del programa. Comprovacions, de més a menys probable:
ls -l /usr/local/bin/meteo-api— existeix? És el camí exacte, sense errada? Un desplegament que va deixar el binari a/usr/local/sbindona aquest error.stat -c '%A %U %G' /usr/local/bin/meteo-api— té bit d'execució? Unscpo ungit checkoutmal fet el pot treure.namei -l /usr/local/bin/meteo-api— l'usuarimeteorapot travessar tots els directoris del camí? N'hi ha prou que un directori intermedi perdi el bitxperquè falli.head -c2 /usr/local/bin/meteo-apiifile— si és un guió, el seu shebang apunta a un intèrpret que existeix? Un#!/usr/bin/env python3sense python3 instal·lat produeix exactament 203/EXEC.ldd /usr/local/bin/meteo-api | grep 'not found'— falta alguna biblioteca compartida?mount | grep ' /usr/local '— està muntat ambnoexec? És rar però passa, sobretot en particions separades enfortides.systemctl cat meteo-api.service— hi ha un drop-in recent que hagi canviatExecStarto hi hagi afegit unWorkingDirectoryinexistent (això donaria 200/CHDIR)?- Prova directa:
sudo -u meteora /usr/local/bin/meteo-api --config /etc/meteora/meteora.conf. Si funciona a mà, revisa l'enfortiment, començant perSystemCallFilteriProtectSystem.
Solució 3
Què passa. Amb RestartSec=0 i sense límit, el cicle arrencar-fallar es repeteix tan de pressa com el sistema pugui fer fork+execve: si l'errada triga 50 ms a manifestar-se, són unes 20 execucions per segon, és a dir al voltant de 1.200 al primer minut. Conseqüències: consum continu de CPU en creació de processos, milers d'entrades al diari que poden arribar als límits de taxa de journald (RateLimitBurst) i fer que es descartin missatges —perdent justament els que expliquen l'errada—, i pressió d'E/S sobre /var/log.
Per què el monitoratge podria no avisar. Una comprovació que executa systemctl is-active ingestor cada 30 segons té una probabilitat alta de caure justament en una finestra en què el servei està activating o active, perquè l'estat oscil·la desenes de vegades per segon. El resultat és una alerta intermitent («flapping») que molts sistemes suprimeixen per sorollosa, o directament una sèrie de comprovacions correctes. El servei no arriba mai a un estat estable d'errada, que és el que les alertes saben detectar.
Les tres directives:
RestartSec=5s # separa els intents: 12 per minut, no 1.200
StartLimitIntervalSec=300 # finestra d'observació
StartLimitBurst=5 # després de 5 arrencades en 300 s, es rendeix i queda en 'failed'Amb això, el pitjor cas són 5 reintents en 25 segons i després un estat failed estable, que dispara l'alerta a la primera comprovació i deixa el diari llegible. Hi afegiria a més Restart=on-failure en lloc d'always si hi hagués algun motiu legítim per aturar el servei, i una alerta específica sobre la sortida de systemctl list-units --failed, que és el senyal més barat i fiable que alguna cosa va malament a la màquina.
Conclusió
Has seguit l'engegada de meteo-01 sencera: el microprogramari UEFI llegint l'ESP i verificant signatures amb Secure Boot; GRUB presentant el menú, la línia de paràmetres del qual és l'eina de rescat més valuosa que tens; el nucli i l'initramfs, que existeix per trencar el cercle de necessitar els mòduls de RAID i ext4 que viuen dins de l'arrel que encara no pot muntar; el switch_root i, per fi, el PID 1, que no es pot matar, adopta orfes i la mort del qual provoca un pànic.
I has desmuntat systemd, que va resoldre cinc mancances reals dels guions seqüencials de SysV: paral·lelisme, dependències declarades, activació sota demanda, supervisió i —la més subestimada— un cgroup per servei, que converteix «els processos d'aquest servei» en un fet del nucli i no en una suposició d'un fitxer .pid. Sobre aquest model has escrit la unitat completa de meteo-api, on cada bloc té la seva raó: Type=notify perquè triga 8 segons a estar realment llest, AmbientCapabilities=CAP_NET_BIND_SERVICE per escoltar al 443 sense ser root, ProtectSystem=strict amb tres ReadWritePaths, un filtre seccomp, i els límits de memòria i E/S del cgroup.
I has vist els mecanismes que es fan servir a diari: la distinció entre dependència i ordre, que explica la meitat de les arrencades trencades; enable davant de start i daemon-reload davant de reload; status llegit camp a camp; el bucle de reinici que amaga una errada i les tres directives que el converteixen en un estat visible; els temporitzadors amb Persistent=true i RandomizedDelaySec davant de cron; l'activació per socket, que permet reiniciar sense perdre connexions; critical-chain davant de blame; el guió de vuit passos per a «no arrenca»; i la seqüència SIGTERM → TimeoutStopSec → SIGKILL, el valor mal triat de la qual produeix exactament els fitxers truncats que detectàvem a la lliçó anterior.
Amb això, meteo-01 arrenca sol, es recupera sol i executa les seves tasques a la seva hora. Però un sistema que arrenca correctament pot funcionar malament. El servei està active (running), el temporitzador es dispara puntualment, no hi ha cap unitat en failed… i tot i així els usuaris es queixen que l'API va lenta. Cap de les eines d'aquesta lliçó no respon al «per què?»: per a això calen un mètode i uns quants números.
És el tema següent: Monitoratge i Diagnòstic de Rendiment, on aprendràs què has de mirar en els primers 60 segons d'una incidència i com passar d'un símptoma vague a una causa concreta.
Fonaments de Sistemes Operatius
Mòdul 1: Introducció als Sistemes Operatius
- Conceptes Bàsics de Sistemes Operatius
- Història i Evolució dels Sistemes Operatius
- Tipus de Sistemes Operatius
- Funcions Principals d'un Sistema Operatiu
- Arquitectura del Nucli: Monolític, Microkernel i Híbrid
- Mode Usuari, Mode Nucli i Crides al Sistema
Mòdul 2: Gestió de Recursos
- Gestió de Processos
- Planificació de la CPU
- Gestió de Memòria
- Memòria Virtual i Paginació
- Gestió d'Emmagatzematge
- Gestió de Dispositius
- Controladors, Interrupcions i Operacions d'E/S
Mòdul 3: Concurrència
- Conceptes de Concurrència
- Fils i Processos
- Comunicació entre Processos (IPC)
- Sincronització i Exclusió Mútua
- Problemes Clàssics de Concurrència
- Interbloquejos: Prevenció, Detecció i Recuperació
Mòdul 4: Estructures de Fitxers
- Sistemes de Fitxers
- Estructures de Directoris
- Particions, Muntatge i Sistema de Fitxers Virtual
- Gestió de Fitxers
- Assignació d'Espai, Journaling i Integritat
- Seguretat i Permisos de Fitxers
Mòdul 5: Protecció i Seguretat del Sistema
- Principis de Protecció i Control d'Accés
- Usuaris, Autenticació i Escalada de Privilegis
- Amenaces Habituals i Enfortiment del Sistema
- Auditoria, Registres i Resposta a Incidents
Mòdul 6: Virtualització i Contenidors
- Virtualització: Hipervisors i Màquines Virtuals
- Contenidors: Namespaces i cgroups
- El Sistema Operatiu al Núvol
- Sistemes Operatius Mòbils i de Temps Real
