Configuración de tarea cron persistente para actualización de cPanel mediante script
Objetivo
Configurar una tarea persistente de cron en servidores cPanel/WHM para ejecutar de forma programada:
-
Revalidación de licencia.
-
Verificación de la configuración de actualizaciones de cPanel.
-
Actualización de cPanel.
-
Reinicio de servicios.
-
Reparación de licencia.
Esto ayuda a garantizar la aplicación oportuna de actualizaciones y parches de seguridad.
Configurar el canal de actualizaciones de cPanel
Crear el script:
nano /root/actualizar_cpanel.sh
Agregar el siguiente contenido:
#!/bin/bash
# Definimos la ruta del log de auditoría
LOG_ERROR="/var/log/upcp-custom.log"
# Marca de inicio en el log
echo "==================== $(date): INICIO DEL PROCESO ====================" >> "$LOG_ERROR"
# VALIDACIÓN DE SEGURIDAD: ¿Existe cPanel en este servidor?
if [ ! -x /scripts/upcp ]; then
echo "$(date): [CRÍTICO] /scripts/upcp no existe o no es ejecutable. Abortando." >> "$LOG_ERROR"
echo "==================== $(date): FIN POR ERROR ====================" >> "$LOG_ERROR"
echo "" >> "$LOG_ERROR"
exit 1
fi
# Intentamos escribir la configuración de cPanel
cat > /etc/cpupdate.conf <<'EOF'
CPANEL=release
RPMUP=daily
SARULESUP=daily
STAGING_DIR=/usr/local/cpanel
UPDATES=daily
EOF
if [ "$?" -ne 0 ]; then
echo "$(date): [ADVERTENCIA] No fue posible escribir en /etc/cpupdate.conf (¿Disco en Read-Only?)." >> "$LOG_ERROR"
fi
# Verificamos y ejecutamos licencia al inicio
if [ -x /usr/bin/RedLicenseCP ]; then
/usr/bin/RedLicenseCP >> "$LOG_ERROR" 2>&1
fi
# 1. Primer intento de upcp con límite de 30 minutos
timeout --signal=TERM --kill-after=30s 1800s /scripts/upcp
STATUS_UPCP=$?
# 2. Evaluación del primer resultado
case "$STATUS_UPCP" in
0)
echo "$(date): [ÉXITO] El comando /scripts/upcp terminó correctamente." >> "$LOG_ERROR"
;;
124)
echo "$(date): [TIMEOUT] ¡Congelamiento detectado! upcp excedió los 30 minutos. Limpiando entorno..." >> "$LOG_ERROR"
# Matamos procesos rebeldes de forma precisa y limpiamos candados
pgrep -f "/scripts/upcp" >/dev/null && pkill -f "/scripts/upcp"
sleep 5
rm -f /var/cpanel/upcp.lock
rm -f /var/cpanel/updatelogs/upcp.pid
# Reintento forzado con red de seguridad (Timeout de 30 min)
if [ -x /usr/bin/RedLicenseCP ]; then /usr/bin/RedLicenseCP >> "$LOG_ERROR" 2>&1; fi
echo "$(date): Lanzando /scripts/upcp --force..." >> "$LOG_ERROR"
timeout --signal=TERM --kill-after=30s 1800s /scripts/upcp --force
STATUS_RETRY=$?
# Verificamos el resultado del segundo intento
if [ "$STATUS_RETRY" -ne 0 ]; then
echo "$(date): [ALERTA] El reintento con --force también falló (Código: $STATUS_RETRY)." >> "$LOG_ERROR"
else
echo "$(date): [ÉXITO] El reintento con --force finalizó correctamente." >> "$LOG_ERROR"
fi
;;
*)
# Errores inesperados (repositorios, falta de disco, etc.)
echo "$(date): [ERROR] upcp falló con un código inesperado: $STATUS_UPCP. Continuando para asegurar estabilidad..." >> "$LOG_ERROR"
;;
esac
# 3. Fase de estabilización (Espera de 2 minutos)
sleep 120
# 4. Aseguramos disponibilidad levantando servicios y fijando licencia
/scripts/restartsrv_cpsrvd >> "$LOG_ERROR" 2>&1
if [ -x /usr/bin/RedLicenseCP ]; then
/usr/bin/RedLicenseCP -fix >> "$LOG_ERROR" 2>&1
fi
# Marca de fin en el log
echo "==================== $(date): FIN DEL PROCESO ====================" >> "$LOG_ERROR"
echo "" >> "$LOG_ERROR" # Línea en blanco para separar el siguiente día
Asignar permisos:
chmod 700 /root/actualizar_cpanel.sh
chown root:root /root/actualizar_cpanel.sh
Crear tarea cron persistente
Crear el archivo:
nano /etc/cron.d/actualizar_cpanel
Agregar:
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 8 * * * root /root/actualizar_cpanel.sh
Permisos requeridos
chmod 644 /etc/cron.d/actualizar_cpanel
chown root:root /etc/cron.d/actualizar_cpanel
Recargar el servicio cron
systemctl reload crond
o
service crond reload
Verificar funcionamiento
Consultar eventos recientes:
journalctl -u crond -n 50
o
grep CRON /var/log/cron
Logs útiles de cPanel
Logs de actualización:
/var/cpanel/updatelogs/
Log principal de cPanel:
/usr/local/cpanel/logs/error_log
Ejecución forzada en caso de error
La tarea programada utiliza:
/scripts/upcp
por ser el método recomendado por cPanel para actualizaciones periódicas.
Si la actualización presenta errores, queda incompleta o es necesario forzar la reinstalación de componentes, ejecutar manualmente:
/scripts/upcp --force
Esta opción debe utilizarse únicamente como mecanismo de recuperación y no como parte de la tarea programada diaria.