Cronjob reduce continuamente el espacio libre en disco

2 minutos de lectura

avatar de usuario
Y yo

Tengo una aplicación de consola .NET Core 3.0 que se ejecuta en un servidor Ubuntu 18.04. Hay un script de inicio simple en mi carpeta de inicio, llamado my-app.sh:

cd /home/service/my-app
./My-App

Quería iniciar el archivo después de reiniciar, así que creé un cronjob para el script de inicio, usando crontab -e:

@reboot /home/service/my-app.sh

Después de reiniciar, MyApp se inicia perfectamente bien. Pero, al llamar df repetidamente, noté que el espacio libre en disco de / estaba disminuyendo continuamente! Intenté averiguar qué archivo es, pero ncdu no mostró ninguna diferencia con el tiempo. soy no escribir un archivo en MyApp, es decir, el tamaño total de /home/service lo hace no aumentar. Después de unos 10 minutos, todo el espacio libre desaparece y el sistema cierra MyApp.

Cuando cancelo MyApp después de reiniciar, veo que la “pérdida de memoria” se detiene de inmediato. Pero: cuando reinicio MyApp manualmente, ya no hay pérdida de memoria.

Ahora traté de eliminar el cronjob y agregué el script del iniciador al /etc/local.rc archivo en su lugar:

# Start MyApp
su service -c 'sh /home/service/my-app.sh' &

Nuevamente, comenzó perfectamente bien después de reiniciar, y también hay no pérdida de memoria más.

No tengo ni idea de cuál podría ser el problema. No hay problema al arrancar manualmente o desde /etc/local.rc, pero solo cuando se inicia desde el cronjob. ¿Alguna idea de cuál podría ser el problema?

tl; dr Evite la interacción del usuario en la aplicación de la consola (por ejemplo, ReadLine() esperando una determinada entrada).

Detalles: Me enteré de lo que pasó. Aquí está la última parte del código C# de mi aplicación de consola:

// App can be quit by keyboard input "exit"
while (true) {
    Console.WriteLine("Enter 'exit' to close MyApp.");
    if (Console.ReadLine() == "exit")
        break;
}

Usando este código, quería mantener el programa en ejecución hasta que un usuario ingrese exit o hasta que se elimine este “servicio”. Desafortunadamente, lo que sucede es que el programa, iniciado por Cron o por /etc/rc.local salta el ReadLine() y se encuentra con un bucle sin fin, estropeando la memoria (y tal vez el intercambio en el disco duro) con un número infinito de Enter 'exit' to close MyApp. líneas. Tiempo /etc/rc.local parece liberar la memoria continuamente, el cronjob requiere más y más memoria. No tengo idea de por qué, ¡solo una observación!

La solución es sencilla. Eliminé la interacción y agregué el siguiente ciclo sin fin inofensivo, esperando que el proceso sea eliminado:

// App can only be stopped by killing the process
Console.WriteLine("Started in service mode. To close MyApp, kill the process.");
while (true) {
    Thread.Sleep(1000);
}

¿Ha sido útil esta solución?