Detener la tarea que se reinicia sola

LinuxBeginner
Practicar Ahora

Introducción

Status Desk normalmente actualiza una pequeña caché cada minuto. Un cargador desconocido también envía solicitudes sintéticas de práctica al colector interno. Detenerlo parece ayudar, pero vuelve. Debes eliminar su activador recurrente sin interrumpir la actualización normal.

Solo necesitas conocimientos básicos del terminal. Status Server es una consola de administrador autorizada dentro del contenedor objetivo, que comienza en /srv/status. Status Desk muestra los contadores reales del colector. Ambos contenedores comparten el núcleo de la instancia de práctica. Los datos y las solicitudes son inocuos; este laboratorio estudia la recurrencia mediante cron, no una investigación completa de un servidor de producción.

Observar el programa que vuelve

En este paso, detendrás un cargador activo y verás por qué terminar una instancia no elimina la causa.

Abre Status Desk. refreshes cuenta las solicitudes de actualización correctas y debe aumentar cada minuto. uploads cuenta las solicitudes de práctica no deseadas, normalmente una cada cinco segundos. Los datos históricos permanecen tras la reparación. Recarga la página para obtener valores actuales.

Cambia a Status Server. Un proceso es un programa en ejecución. Su PID identifica esta instancia; la ruta y los argumentos describen su función. ps enumera procesos. -e selecciona todos y -o elige las columnas: PID, PID padre (PPID) y comando completo con argumentos.

ps -eo pid,ppid,args

Localiza /usr/bin/python3 /opt/status/uploader.py upload. Python es el intérprete, /opt/status/uploader.py es el archivo del programa y upload selecciona su operación de práctica. El proceso cercano flock mantiene un bloqueo para que cron no cree varias copias simultáneas. No alteres el programa de actualización de caché.

Una señal es una petición dirigida a un proceso. TERM solicita una terminación normal. El siguiente pkill selecciona la línea completa mediante -f; ^ y $ en el patrón entre comillas delimitan el principio y el final. Así selecciona este trabajador Python, sin afectar a su padre ni a tu shell. Ejecútalo una vez:

pkill -TERM -f '^/usr/bin/python3 /opt/status/uploader.py upload$'

Es normal que no haya salida. Si no hubo coincidencias, vuelve a listar los procesos en lugar de ampliar el patrón a todos los procesos Python. Espera un segundo para permitir la terminación y vuelve a listarlos:

sleep 1
ps -eo pid,ppid,args

El cargador Python debe desaparecer. El punto de control comprueba que terminó la instancia original; no afirma que el servidor esté limpio.

sleep pausa durante el número indicado de segundos. Espera 80 segundos, suficientes para cruzar al menos un límite real de minuto, y vuelve a listar:

sleep 80
ps -eo pid,ppid,args

La misma ruta y el argumento upload deben reaparecer con otro PID. Su cadena de padres ahora incluye CRON, el lanzador de tareas del planificador. Otro PID significa una ejecución nueva, no otra tarea subyacente. Si la carga del entorno retrasa el instante programado, espera otros 20 segundos y vuelve a listar. Recarga Status Desk: las cargas se reanudan y las actualizaciones legítimas continúan. Hay que encontrar qué inicia el programa.

Encontrar y desactivar el activador recurrente

En este paso, relacionarás el proceso que vuelve con una programación concreta y desactivarás esa entrada conservando las tareas legítimas.

Cron es un demonio: un servicio en segundo plano que inicia comandos programados. Un crontab de usuario contiene las tareas de una cuenta. Esta consola pertenece a root dentro del contenedor de práctica, por lo que crontab -l muestra la programación de esa cuenta objetivo. No afecta a la cuenta de la plataforma.

crontab -l

Debes ver:

* * * * * /usr/bin/flock -n /run/uploader.lock /usr/bin/python3 /opt/status/uploader.py upload

Los cinco primeros campos son minuto, hora, día del mes, mes y día de la semana. * significa cualquier valor: * * * * * ejecuta cada minuto. El resto es el comando. flock -n obtiene un bloqueo sin esperar: si otro cargador lo posee, la invocación duplicada termina. El destino coincide con el proceso detenido.

Las programaciones de sistema también están en /etc/cron.d/. ls enumera archivos y cat muestra archivos cortos. El * tras el directorio se expande a sus archivos.

ls /etc/cron.d
cat /etc/cron.d/*

El archivo status-cache contiene:

* * * * * root /usr/bin/python3 /opt/status/cache-refresh.py refresh

A diferencia del crontab de usuario, un archivo cron del sistema incluye la cuenta, aquí root, entre los cinco campos temporales y el comando. Este comando permitido actualiza Status Desk. Una frecuencia similar por sí sola no implica falta de autorización. Las demás entradas de mantenimiento instaladas por paquetes pueden permanecer.

Para editar con cuidado, copia primero la programación del usuario a un archivo de trabajo. > escribe el listado allí y reemplaza una copia anterior. Hazlo una sola vez antes de editar: repetirlo sobrescribiría el borrador.

crontab -l > /srv/status/root.cron

nano abre un editor de texto. Añade # al principio de la línea del cargador. Cron ignora comentarios que comienzan por #. Conserva el texto para poder recuperarlo y deja intactas las demás entradas.

nano /srv/status/root.cron

Con las flechas ve al principio de la línea, escribe #, pulsa Ctrl+O, Enter para guardar y Ctrl+X para salir. Instala el archivo editado pasando su ruta a crontab:

crontab /srv/status/root.cron
crontab -l

La línea del cargador debe empezar por #. Cron recarga automáticamente los cambios; no necesita reiniciarse. Comentar solo la copia de trabajo no basta hasta instalarla. Si cambiaste otra línea, abre el borrador, restáurala e instálalo de nuevo. El cargador actual puede seguir activo: quitar una programación no termina un proceso que ya se ejecuta.

Eliminar la copia activa y comprobar la recuperación

En este paso, completarás la limpieza y compararás la actividad indeseada con la función de negocio durante un intervalo completo.

Detén el cargador Python actual usando el mismo patrón exacto:

pkill -TERM -f '^/usr/bin/python3 /opt/status/uploader.py upload$'

Si ya está ausente, la salida sin coincidencias es esperable y puedes continuar. Espera un segundo a que termine:

sleep 1

curl realiza una solicitud de red. -sS oculta el indicador de progreso pero muestra errores. Esta URL identifica el contenedor del colector interno, accesible desde Status Server. /state devuelve los contadores actuales y las marcas de tiempo Unix de las últimas solicitudes.

curl -sS http://collector:8080/state

Observa uploads, refreshes y last_refresh. Deja que funcione cron de verdad:

sleep 80
curl -sS http://collector:8080/state

uploads debe permanecer igual, mientras que refreshes y last_refresh aumentan. Recarga Status Desk para ver los mismos hechos. Las cargas antiguas permanecen como pruebas; borrar el contador oculta el historial, no arregla la recurrencia.

Lista los procesos una vez más:

ps -eo pid,ppid,args

cron -f sigue presente; -f mantiene el demonio del contenedor en primer plano. El cargador debe seguir ausente. El punto de control observa independientemente otros 80 segundos; permite unos 90 segundos para la evaluación. Solo lee la configuración y el estado real.

Si aumentan las cargas, revisa ambas ubicaciones cron y que hayas instalado el crontab comentado. Si paran las actualizaciones, restaura la entrada permitida status-cache. No detengas cron ni elimines todas las programaciones para ocultar el síntoma: el servicio las necesita. Esta reparación elimina el mecanismo cron demostrado; no prueba que un servidor real esté libre de cualquier mecanismo de persistencia.

Resumen

Distinguiste una instancia de proceso de su lanzador, seguiste la cadena de padres hasta cron, examinaste programaciones de usuario y sistema, desactivaste un activador no deseado y comprobaste que las actualizaciones de negocio continuaban durante un minuto sin cargas nuevas.