Copieu una línia d’ordres que funcioni a ExecStart, recarregueu i la unitat falla o surt en silenci amb els arguments tractats com a noms de fitxer. No hi ha res trencat a systemd. ExecStart és una llista d’arguments, no un shell, així que les canonades, la redirecció i les condicions perden el sentit en el moment que surten del vostre terminal. Decidiu on ha de viure el shell i després escriviu una unitat que digui exactament què s’ha d’executar.

Per què la canonada d’ExecStart no fa res

Quan s’escriu una ordre al terminal, el shell l’analitza primer. Construeix una canonada, obre fitxers per a la redirecció i expandeix les variables abans que comenci cap programa. systemd no fa res d’això: divideix ExecStart segons les seves pròpies regles i executa el programa resultant amb aquests arguments. Per tant, > arriba com un argument literal, i | es lliura al programa en lloc de connectar dos processos. La unitat no es comporta malament; la sintaxi volia dir una altra cosa.

Això és deliberat i no pas una descurada, perquè el tractament previsible dels arguments és el que fa que les unitats siguin auditables. Només sorprèn qui dona per fet que hi ha un shell.

Escriviu una unitat que digui exactament què s’executa

Comenceu amb una unitat petita el propòsit de la qual sigui visible al registre, perquè els problemes d’anàlisi quedin separats dels problemes del túnel. Aquesta només informa de la versió d’un binari.

[Unit]
Description=Report the installed OpenVPN version

[Service]
Type=oneshot
ExecStart=/usr/sbin/openvpn --version
StandardOutput=journal
StandardError=journal

El camí és un marcador de posició, així que substituïu-lo pel binari que realment està instal·lat. Type=oneshot s’adequa a una ordre que s’executa fins al final, i la configuració del registre posa la seva sortida on la podeu llegir sense terminal. Deliberadament no hi ha secció d’instal·lació, així que la unitat s’invoca a mà en lloc d’habilitar-se en arrencar. Valideu el fitxer abans d’iniciar-lo, perquè una errata en el nom d’una directiva falla de manera diferent que una errata al camí.

systemd-analyze verify /etc/systemd/system/openvpn-version.service
systemctl start openvpn-version.service

Manteniu la lògica d’shell en un script

Quan un auxiliar necessita de debò lògica condicional, poseu aquesta lògica en un script i crideu-lo explícitament. L’script necessita una línia d’intèrpret, permís d’execució i codis de sortida que el servei pugui informar. Engegar /bin/sh -c amb una ordre entre cometes funciona, però amaga les regles de citació dins d’una unitat i fa més difícil la revisió. Un script amb nom es pot provar a mà i substituir després sense editar la unitat. No confieu en el perfil d’shell de l’usuari interactiu, perquè un servei arrenca amb el seu propi entorn.

Establiu WorkingDirectory quan els camins relatius importen, i passeu l’entorn mitjançant les directrius admeses de la unitat en lloc d’exportar-lo en un terminal. Els secrets pertanyen a fitxers protegits o credencials, no a llistes d’arguments que el registre pugui enregistrar.

Comproveu la unitat que realment existeix

Els fitxers drop-in canvien el comportament sense tocar el fitxer que recordeu haver editat. Llegiu què ha carregat el gestor i què ha informat l’última execució.

systemctl cat vpn-helper.service
journalctl -u vpn-helper.service -n 20 --no-pager

L’abocament de la unitat inclou els fitxers drop-in en ordre de càrrega, i d’aquí sol venir un ExecStart inesperat. Després de qualsevol canvi, recarregueu el gestor i confirmeu que la definició nova és la que imprimeix systemctl cat. El registre mostra la línia d’ordres exacta i l’estat de sortida, cosa que separa un problema d’arguments d’un binari absent o d’un error de permisos. Després decidiu si l’auxiliar pertany al cicle de vida de la VPN existent o si ha de romandre un diagnòstic manual, perquè un segon procés de túnel en segon pla crea un propietari en competència.

Una unitat que imprimeix la sortida correcta quan se li demana és una bona primera fita. Encara no és un túnel, i no hauria de fer veure que ho és.

Articles relacionats