Como continuar a saída no arquivo após a liberação do espaço em disco?

0

Estou armazenando a saída de um programa da seguinte forma: ./programOutputtingTextToStandartOut > program.log

Se o disco ficar cheio, a saída deixará de ser gravada, mesmo que o programa continue em execução. Existe uma maneira de configurar isso para que, quando o espaço livre em disco seja exibido, a gravação no arquivo seja restaurada automaticamente - sem a necessidade de reiniciar o programa?

ATUALIZAR

Adicionando um programa de amostraOutputtingTextToStandartOut.

#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
fonte
O que acontece quando o espaço livre em disco aparece se "o programa ainda continua em execução" quando o disco está cheio? Se ele não retomar automaticamente a gravação no arquivo, pode haver um erro no programa. // Você tem o código fonte do programa? Você pode modificá-lo e recompilá-lo, e está interessado em respostas que exijam que você faça isso?
Scott
@ Scott Adicionei à questão a essência do processo de saída do programa. Sim, eu consideraria também modificar esse código.
Jānis Elmeris

Respostas:

0

Em vez de redirecionar a saída no nível do console, sugiro: Use o próprio programa para gerenciar o log. Nesse caso, você pode verificar o espaço em disco em todas as N operações. Se o espaço em disco for menor que o valor mínimo inscrito - pare o log. Depois que ele ficar abaixo do limite inferior - recrie o arquivo de log e continue o log. Embora seja necessário algum grau de código, seria a melhor maneira possível de controlar o log.

kumar_m_kiran
fonte
Obrigado, este provavelmente será o caminho a seguir se não houver uma solução melhor. Somente eu provavelmente tentaria criar outro programa (digamos, logManager) que gerencia a gravação para registrar e redirecionar a saída do programa para esse logManager (dessa maneira, permitindo reutilizar esse método para qualquer outro programa).
Jānis Elmeris
Sim, uma abordagem muito mais modular do que sugeri. você usaria direta / indiretamente o IPC para estes. A única sugestão é - em vez de redirecionar, você pode tentar outros métodos de IPC.
Tudo bem? Ou eu estou esquecendo de alguma coisa? ./programOutputtingTextToStandartOut | logger > program.logonde logger é este: #!/bin/bash while read line; do echo $line; done
Jānis Elmeris 03/04
Nada, se você precisar de um mecanismo mais elaborado, em que vários processos produzam o log, você poderá nomear pipes (ou qualquer outro IPC) e coletar as informações através deles. Como foi mencionado como logManager, geralmente coleta informações de vários processos e saídas para um arquivo. Caso contrário, isso seria perfeitamente correto.
precisa saber é o seguinte
Ainda assim, echopode ser muito lento se houver uma grande quantidade de texto a ser emitidos ...
Jānis Elmeris