O overlayfs redireciona arquivos abertos automaticamente na hora?

1

ou eu deveria fechar o arquivo - depois montar a sobreposição - e reabrir o arquivo novamente? ou seja,

#!/bin/bash
my_background_process >log.txt &
...
pkill my_background_process
mount overlay
my_background_process >>log.txt &
...

é necessário?

    
por bdimych 05.09.2017 / 16:58

2 respostas

1

Quando um arquivo é aberto, ele permanece aberto até que o processo seja fechado. Ler e escrever de um arquivo não importa se o arquivo ainda está disponível em seu nome original. O arquivo pode ter sido renomeado, excluído, sombreado ... ainda é o mesmo arquivo.

Se você abrir um arquivo /somewhere/somefile , monte um sistema de arquivos em /somewhere , depois desse ponto /somewhere/somefile designará um arquivo no novo sistema de arquivos. Mas isso só importa quando você abre /somewhere/somefile . Se um processo já tiver aberto /somewhere/somefile no sistema de arquivos original, isso não muda.

Redirecionamento abre um arquivo quando o shell processa o operador de redirecionamento. Depois disso, ele continua sendo o mesmo arquivo aberto, mesmo se vários processos estiverem envolvidos. Por exemplo, no snippet abaixo, program2 grava no arquivo em /mnt/log.txt na partição raiz, enquanto program3 grava em /log.txt on /dev/something .

do_stuff () {
  program1
  mount /dev/something /mnt
  program2
  program3 >/mnt/log.txt
}
do_stuff >/mnt/log.txt

Se você já iniciou um programa e deseja alterar o local de saída, é necessário solicitar que o programa o faça. Em teoria, você pode forçar o programa a fazê-lo usando um depurador - este tópico lista alguns programas que podem fazê-lo. Mas ficar abatido e sujo com um programa como esse pode derrubá-lo.

Se você realmente precisa mudar onde a saída do programa vai no meio do caminho, você precisa retransmitir a saída por meio de um auxiliar capaz de alterar sua própria saída. Aqui está uma minúscula prova de conceito em um script de shell:

my_background_process | {
  while IFS= read -r line; do
    printf '%s\n' "$line" >>/mnt/log.txt
  done
} &

Este script abre o arquivo de saída para cada linha, portanto, se o arquivo designado por /mnt/log.txt for alterado (porque o arquivo foi movido, porque um novo sistema de arquivos foi montado em /mnt , etc.), as linhas subsequentes será gravado no novo arquivo. Observe que você precisa especificar o nome do diretório: com apenas >log.txt , isso sempre abriria o arquivo no diretório atual, portanto, ele não seria afetado por uma operação de montagem (o diretório atual funciona como um arquivo aberto: A montagem de algo no /mnt não afeta o que os processos vêem como seu diretório atual, mesmo que seu diretório atual seja /mnt ).

    
por 06.09.2017 / 01:10
0

Não há suporte no Linux para redirecionar automaticamente os arquivos que foram abertos em um sistema de arquivos arbitrário. É necessário fazer você mesmo.

    
por 05.09.2017 / 17:21