Plantilla segura para scripts bash de mantenimiento
Este post resume patrones seguros para scripts de mantenimiento: logging, validaciones, dry-run, control de errores y limpieza de temporales.
Plantilla base
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| #!/usr/bin/env bash
set -euo pipefail
LOG="/var/log/mantenimiento.log"
DRY_RUN="${DRY_RUN:-0}"
log() {
printf '[%s] %s\n' "$(date --iso-8601=seconds)" "$*" | tee -a "$LOG"
}
need() {
command -v "$1" >/dev/null 2>&1 || {
log "Falta binario requerido: $1"
exit 2
}
}
run() {
log "+ $*"
if [[ "$DRY_RUN" != "1" ]]; then
"$@"
fi
}
main() {
need rsync
run rsync -avh /origen/ /destino/
}
main "$@"
|
Temporales y limpieza
1
2
| tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
|
Leer ficheros linea a linea
1
2
3
| while IFS= read -r linea; do
printf 'Procesando: %s\n' "$linea"
done < fichero.txt
|
Comprobar codigos de salida
1
2
3
4
5
6
| if comando; then
log "Comando correcto"
else
log "Comando fallo"
exit 1
fi
|
Errores a evitar
- Variables sin comillas.
- Secretos escritos en el script.
rm sin validar ruta.kill -9 como primera opcion.- Shebang incorrecto.
- Scripts sin
dry-run para operaciones destructivas.
Scripts relacionados
liberamemoria.sh: ejemplo de mantenimiento simple con privilegios de root.depura_ficheros.sh: ejemplo de limpieza programada de ficheros antiguos.micron_nextcloud: ejemplo de crontab operativo con scripts activos y comentados.depuro_neptuno_90.sh: ejemplo de retencion por carpetas y antiguedad.
Patron logline
1
2
3
4
5
| LOG="/var/log/script_$(date +%Y%m%d).log"
logline() {
printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >> "$LOG"
}
|
Patrones detectados en libra_scripts
- Usar
trap para desmontar recursos aunque falle una sincronizacion. - Evitar
sed -i sobre configuraciones sin copia previa. - Extraer tokens y API keys a
/ruta/segura/.... - Preferir scripts parametrizados frente a duplicar el mismo codigo por host o registro DNS.
Lockfile
1
2
3
| LOCK="/run/$(basename "$0").lock"
exec 9>"$LOCK"
flock -n 9 || { echo "Ya hay una ejecucion activa" >&2; exit 1; }
|
Carga de entorno
1
2
3
4
5
6
| ENV_FILE="/ruta/segura/script.env"
if [[ -f "$ENV_FILE" ]]; then
set -a
. "$ENV_FILE"
set +a
fi
|
Dependencias
1
2
3
4
| need() { command -v "$1" >/dev/null 2>&1 || { echo "Falta $1" >&2; exit 2; }; }
need curl
need jq
need rsync
|