Mejores Prácticas de CLI de Linux
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de cada página de esta sección.
- Prefiere SIGTERM sobre SIGKILL: Siempre intenta
kill <PID>(SIGTERM) primero para que el proceso pueda cerrar archivos, liberar locks y vaciar buffers; recurre akill -9solo después de que un cierre elegante falla. - Ejecuta Aplicaciones de Larga Duración bajo systemd: Envuelve servicios Node en un archivo unit con
Restart=on-failure,RestartSec,WorkingDirectory, yEnvironment=NODE_ENV=productionpara que la app se reinicie limpiamente en un fallo y sobreviva reinicios. - Persiste Sesiones con tmux o screen: Los procesos iniciados en un shell SSH plano mueren cuando la conexión cae, así que ejecuta trabajo interactivo dentro de
tmux(o regístralo como servicio) en lugar de confiar ennohup … &. - Permite SSH Antes de ufw enable: Ejecuta
sudo ufw allow 22/tcpantes desudo ufw enableo la próxima reconexión estará bloqueada y necesitarás acceso a la consola para recuperarte. - Proxy, No Vincules, Puertos Privilegiados: Los procesos sin root no pueden vincularse por debajo de 1024, así que ejecuta la app Node en un puerto alto y pon nginx o caddy enfrente en 80/443 en lugar de ejecutar Node como root.
- Diagnostica con journalctl y dmesg: Cuando un servicio está caído, recorre
systemctl status→journalctl -u <svc> --since …→dmesg | tailpara que captures tanto errores de aplicación como OOM kills a nivel de kernel. - Bloquea Archivos de Secretos: Usa
chmod 600para.envy archivos de credenciales (solo lectura/escritura del propietario),755para ejecutables y scripts, y644para contenido regular. - Prefiere ripgrep sobre grep:
rges sustancialmente más rápido en codebases grandes y respeta automáticamente.gitignore, así que saltanode_modules/y.next/sin exclusiones manuales. - Siempre Delimita find y grep: Nunca busques desde
/o la raíz del proyecto sin filtrar — pasa un directorio y-not -path "*/node_modules/*"(o--exclude-dir=node_modules) para que las búsquedas terminen en segundos en lugar de minutos. - Usa -F para Cadenas Literales: Cuando el patrón contiene metacaracteres regex como
.,(,[, o|, pasagrep -F/rg -Fpara que la cadena se coincida literalmente en lugar de interpretarse como regex. - Conoce el Quirk de sed en macOS: Los edits in-place básicos de
sed -ien macOS requieren un argumento de backup vacío (sed -i '' 's/…/…/g' file), que es diferente a Linux; instalagnu-sedsi quieres scripts portables. - Escala a -E o -P para \d y \w: El regex básico de
grepno soporta\d,\w,+, o lookaheads, así que cambia agrep -E/grep -P(o simplemente usarg) cuando el patrón los necesita. - Usa -print0 | xargs -0 para Nombres de Archivo:
xargsdivide en espacios en blanco y se quiebra en espacios en paths, así que emparejafind … -print0conxargs -0(o siempre cita"$file") cuando los nombres de archivo no están garantizados limpios. - Muestra Contexto con -A, -B, -C: Cuando investigas coincidencias, agrega
-C 2(o-A/-B) para que veas las líneas circundantes en lugar de volver a abrir cada coincidencia en un editor. - Inicia Scripts con set -euo pipefail: Pon
set -euo pipefailen la parte superior de cada script de shell para que el script salga en el primer error, trate variables indefinidas como errores, y no trague silenciosamente fallos en medio de una tubería. - Pon Aliases en ~/.zshrc en macOS: macOS por defecto es zsh, que no lee
~/.bashrc; mantén aliases y funciones en~/.zshrc(osourcebashrc desde él) o desaparecerán en nuevas terminales. - Prefiere $() sobre Backticks: Usa
$(…)para sustitución de comando porque se anida limpiamente ($(echo $(date))) y se lee mejor; los backticks requieren escaping incómodo y se mezclan mal con comillas. - Redirige con 2>&1 Después del Destino: Para capturar ambos streams, escribe
cmd > out.log 2>&1(stderr sigue a stdout al archivo) — invertir el orden envía stderr a la terminal en su lugar. - Paraleliza con xargs -P: Cuando procesas muchos archivos con el mismo comando, agrega
xargs -P 4 -I {}para ejecutar hasta cuatro en paralelo y usa-I {}como placeholder explícito para claridad. - Usa npm ci en CI:
npm ciinstala las versiones exactas enpackage-lock.json, eliminanode_modulesprimero, y es más rápido quenpm install, que puede actualizar silenciosamente el lockfile y producir builds no reproducibles. - Fija Node en Todas Partes: Commit un
.nvmrc(p. ej.,22) y establece"engines": { "node": ">=22" }enpackage.jsonpara que los compañeros y CI ejecuten la misma versión de Node ynvm usecambie automáticamente en el proyecto. - Prefixa Vars Env de Cliente con NEXT_PUBLIC_: Las vars env referenciadas en código del navegador deben comenzar con
NEXT_PUBLIC_en Next.js; sin el prefijo se resuelven aundefineden tiempo de ejecución, mientras que las vars sin prefijo permanecen seguramente solo del servidor. - Prefiere npx sobre Installs Globales: Ejecuta herramientas de una sola vez como
create-next-app,tsc, oprettiervíanpxpara que siempre obtengas la versión local del proyecto y evites conflictos global-vs-local que cambien silenciosamente el comportamiento. - Libera Puertos Atascados Decisivamente: Cuando
EADDRINUSE :3000aparece, ya sea ejecutalsof -ti :3000 | xargs kill -9para recuperar el puerto o inicia la app en uno diferente conPORT=3001 npm run dev. - Levanta el V8 Heap para Big Builds: Arregla
FATAL ERROR: Allocation faileddurante builds conNODE_OPTIONS="--max-old-space-size=8192" npm run build, pero trata OOMs repetidos como una señal para auditar dependencias o memory leaks en lugar de elevar el límite por siempre.