¿Cómo continuar la salida al archivo después de liberar espacio en disco?

0

Estoy almacenando la salida de un programa de esta manera: ./programOutputtingTextToStandartOut > program.log

Si el disco se llena, la salida deja de escribirse, incluso si el programa sigue ejecutándose. ¿Hay alguna manera de configurar esto para que cuando aparezca espacio libre en el disco, la escritura en el archivo se restaure automáticamente, sin tener que reiniciar el programa?

ACTUALIZAR

Agregar un programa de muestraOutputtingTextToStandartOut.

#include <string>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    string textLine = "Some text";
    ostream* out = &cout;
    while (true) {
        (*out) << textLine << endl << flush;
        usleep(500000);
    }
}
Jānis Elmeris
fuente
¿Qué sucede cuando aparece espacio libre en el disco si "el programa sigue ejecutándose" cuando el disco se llena? Si no reanuda automáticamente la escritura en el archivo, puede haber un error en el programa. // ¿Tienes el código fuente del programa? ¿Puede modificarlo y volver a compilarlo, y le interesan las respuestas que requieren que lo haga?
Scott
@ Scott Agregué a la pregunta la esencia del proceso de salida en el programa. Sí, consideraría también modificar ese código.
Jānis Elmeris

Respuestas:

0

En lugar de redirigir la salida a nivel de consola, sugiero que use el programa en sí para administrar el registro, por lo que en ese caso, puede verificar el espacio en disco en cada N operaciones. Si el espacio en disco es inferior al valor mínimo suscrito, detenga el registro. Una vez que caiga por debajo del umbral inferior, vuelva a crear el archivo de registro y continúe el registro. Aunque se requiere cierto grado de código, sería la mejor manera posible de controlar el registro.

kumar_m_kiran
fuente
Gracias, este será probablemente el camino a seguir si no existe una solución mejor. Solo que probablemente intentaría crear otro programa (por ejemplo, logManager) que maneje la escritura para registrar y redirigir la salida del programa a ese logManager (de esta manera, permite reutilizar este método también para cualquier otro programa).
Jānis Elmeris
Sí, un enfoque mucho más modular que lo que sugerí. estaría utilizando directa / indirectamente el IPC para estos. La única sugerencia es que, en lugar de redirigir, puede probar otros métodos de IPC.
¿Estaría bien? ¿O me estoy perdiendo algo? ./programOutputtingTextToStandartOut | logger > program.logdonde registrador es esto: #!/bin/bash while read line; do echo $line; done
Jānis Elmeris
No hay nada, si necesita un mecanismo más elaborado, en el que múltiples procesos generen el registro, entonces puede haber nombrado canalizaciones (o cualquier otro IPC) y recopilar la información a través de ellas. Como se mencionó como logManager, generalmente recopila información de múltiples procesos y salidas a un archivo. De lo contrario, esto estaría perfectamente bien.
kumar_m_kiran
Aún así, echopuede ser demasiado lento si se emite mucho texto ...
Jānis Elmeris