como girar o arquivo nohup.out sem matar meu aplicativo

10

Meu nohup.outarquivo está crescendo rapidamente.

Estou executando um aplicativo em segundo plano, ele está gravando um nohup.outarquivo,

agora eu preciso girar o nohup.outarquivo sem matar meu aplicativo. Isso pode ser feito?

user2454307
fonte
Copie e trunque.
Jenny D
Ele pode perder algumas preciosas entradas de log entre essas duas operações que você sugeriu. Eu não recomendaria.
Cleankod

Respostas:

5

Você deve dar uma olhada no flog em combinação com logrotate. Se você canalizar a saída do aplicativo através disso, poderá SIGHUPexecutar o processo de flagelação sem ter que matar o aplicativo em execução.

flog (registrador de arquivos) é um programa que lê entradas de STDIN e grava em um arquivo.

Se SIGHUP for recebido, o arquivo será reaberto, permitindo a rotação do log [consulte logrotate (8) no RH.]

O arquivo de log será reaberto somente se o flog detectar que a rotação ocorreu (ou seja, o arquivo antigo se foi ou o inode foi alterado). flog é extremamente pequeno (menos de 500 bytes de espaço ocupado na memória).

jas_raj
fonte
O nohup pode usar um pipe em vez de nohup.out?
Brian Minton
1
Você pode usar o redirecionamento de arquivo (>) para saída para um arquivo diferente de nohup.out de acordo com a página do homem:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj
4

Você não pode girar. Você pode truncá-lo com o comando >nohup.out, que excluirá todo o conteúdo do arquivo.

Você pode copiar o arquivo primeiro e depois truncá-lo, se precisar salvar a saída. Mas há uma pequena janela para uma corrida, onde a saída pode ser gravada depois que você copiou o arquivo, mas antes de truncá-lo. Qualquer saída gravada durante essa janela será perdida para sempre.

Kasperd
fonte
1
Acredito que o truncamento não liberará espaço no disco até que o identificador do arquivo seja fechado.
symcbean
@symcbean Sua opinião é incorreta. Truncar o arquivo libera espaço imediatamente.
precisa saber é o seguinte
Logrotate copytruncate deve fazer o truque.
user9517
@Iain Os passos que descrevo são equivalentes a copytruncateno logrotate. Mas nohup.outraramente é o tipo de arquivo que você configuraria para rotacionar um trabalho cron.
precisa saber é o seguinte
2

Você não pode.

Você pode desvincular o arquivo (rm), mas os dados ainda têm uma pegada no disco e continuarão sendo gravados enquanto houver um identificador de arquivo aberto.

Você pode renomear o arquivo - mas, novamente, isso não impede que ele seja gravado (mas se você estiver iniciando trabalhos em segundo plano regularmente, os mais novos gravarão no mesmo arquivo).

Realmente, você deve redirecionar explicitamente a saída do trabalho para algo projetado para lidar com isso (por exemplo, rotatelogs apache ).

symcbean
fonte
logrotate copytruncate alguém?
user9517
Isso depende totalmente se nohup é anexado a nohup.out linha por linha ou se ele mantém um ponteiro para a localização de nohup.out. Consulte serverfault.com/questions/221337/… para um exemplo.
pepoluan
1

O logrotate possui uma opção copytruncate disponível, que truncará (esvaziará) o arquivo especificado após ter sido copiado no esquema normal de rotação (e compactação, se definido).

   copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

Na página de manual do logrotate .

Sgaduuw
fonte
1

Você pode fazer algo assim:

cp nohup.out nohup.out.save # save it somewhere
echo "" > nohup.out

Você não precisa matar seu aplicativo.

Philippe Remy
fonte
1

Não tenho certeza se estou atrasado nisso. Mas para os outros que se deparam com este fórum agora, não precisei experimentar nada com açoites nem nada.

Meu trabalho começa assim:

nohup <my process> &

Isso inicia o meu trabalho e começa a anexar a um nohup.out nesse diretório.

Tudo o que eu precisava fazer era configurar um logrotate que normalmente vem com a distribuição e configurar algo como isso no /etc/logrotate.conf

~/my abosolute path/nohup.out {
    size 1024k
    copytruncate
    rotate 100
    maxage 100
}

E funcionou !! nohup.out estava sendo truncado ao obter os novos anexos no mesmo arquivo. O processo também não morreu. E um novo nohup.out como nohup.out-20190528este foi criado.

Espero que isto ajude.

Lokesh
fonte