Evitar que o processo já em execução grave em um arquivo existente

4

Eu tenho um processo P que grava o conteúdo em um arquivo F. Eu preciso ser capaz de dinamicamente ativar / desativar P para escrever para F. Eu tentei alterar as permissões para o usuário / grupo, mas isso requer que o processo seja reiniciado (na verdade todo o sistema). No final, eu deveria ser capaz de executar um "script" que faz o seguinte:

EnablePWriteF  
sleep 10  
DisablePWriteF  

e, como resultado, P poderá escrever nos primeiros 10 segundos e não depois disso. Eu estou usando a distribuição do Debian.

Isso é possível?

Atualização: O caso de uso real é que estou tentando filtrar um determinado processo para gravar em um arquivo de dispositivo específico / dev / fb0 Eu tenho dois processos que estão escrevendo para esse arquivo e eu quero ser capaz de determinar exatamente um dos dois que tem permissão para gravar nesse arquivo em um determinado momento sem precisar matar / parar os processos.

    
por Aleksandar Dimitrov 15.03.2017 / 14:30

2 respostas

5

Pelo menos na minha versão do Linux, parece que você pode usar bloqueios obrigatórios. Eu testei apenas com /dev/null , mas não vejo nenhum motivo para não funcionar com outros dispositivos, como os buffers de quadros:

Como root:

mount -t tmpfs -o mand locked-fb some-dir
cp -a /dev/fb0 some-dir/fb0-for-process-A
cp -a /dev/fb0 some-dir/fb0-for-process-B
chmod g+s some-dir/fb0-for-process-[AB] # enable mand-lock

Então, por exemplo, usando perl e o módulo File::FcntlLock (ou faça isso diretamente em C):

#! /usr/bin/perl
use File::FcntlLock;

$l = new File::FcntlLock;
$l->l_type(F_RDLCK);

open my $fba, '<', 'some-dir/fb0-for-process-A' or die$!;

sleep 10; # writing OK
$l->lock($fba, F_SETLK); # writing blocked on fb0-for-process-A

sleep 10;
exit; # lock now released (or do an explicit unlock)

Faça um processo abrir o dispositivo fb0 através do arquivo fb0-for-process-A e o outro via fb0-for-process-B e aplique o bloqueio a ambos os arquivos para decidir qual processo pode gravar em um determinado momento.

    
por 15.03.2017 / 16:11
5

Não, não realmente (até onde eu sei). As permissões de acesso a arquivos só são verificadas quando o arquivo é aberto ( e não há nenhuma chamada de sistema para revogá-las ), portanto, se o processo tem um identificador de arquivo com permissão de gravação, ele tem permissão de gravação.

(Se você fizer um simples chmod no arquivo, não precisará de um reinício. Se você alterar, por exemplo, associações a grupos, precisará fazer login novamente para que as alterações entrem em vigor.)

O que você poderia fazer, em geral, seria direcionar a saída para um pipe e fazer com que o final de leitura do pipe controlasse se deveria manipular (ou encaminhar) os dados ou descartá-los. (O esclarecimento posterior sobre o caso de uso, sendo certos arquivos de dispositivos, torna isso um pouco discutível.)

    
por 15.03.2017 / 14:34