mesmo assim falhar / atrasar um processo cp?

4

Este é um cenário hipotético. Digamos que tenho uma pasta específica que está sendo sincronizada por um processo que está recebendo arquivos / pastas pela Internet. Agora, enquanto esta operação está em andamento, pelo bem do sincronizador, não deve haver operações de cp em seu diretório. De qualquer forma isso pode ser alcançado?

    
por deostroll 07.07.2012 / 10:09

3 respostas

1

Seu sincronizador está gravando no diretório em vez de ler, certo? Então, tirar uma foto do sistema de arquivos ou configurar o bit imutável está fora.

Se você estiver executando o sincronizador como root, você pode alterar a propriedade do diretório para root e as permissões para 700 (rwx ------; somente o proprietário pode fazer qualquer coisa). Isso impedirá que novos processos não sejam executados como root, mas qualquer processo que já tenha um arquivo ou subdiretório aberto ainda poderá fazer alterações.

No Linux, se você quiser encontrar todos os processos que possuem arquivos atualmente abertos em sua árvore, você pode fazer lsof +D my_directory . O que você faz com esse conhecimento, no entanto, depende da situação.

    
por 07.07.2012 / 22:08
3

Existem pelo menos duas soluções possíveis:

  1. Crie um script de wrapper para o cp, que verifica se a sincronização está em execução, verificando se o processo está sendo executado ou testando um arquivo de bloqueio e anulando ou atrasando a operação.
  2. Use LD_PRELOAD para ligar write e outras chamadas.

O problema com a primeira solução é que você teria que agrupar todos os comandos usados para gravar na pasta, por exemplo, mv , cp , rsync , rm , ln , cat … Por outro lado, é bastante simples, mas também funcionará apenas para o usuário atual.

Para a segunda solução, você teria que escrever uma biblioteca compartilhada com todos os syscalls usados para alterar / modificar o diretório, por exemplo, write , unlink , rename . Mas essa solução funcionaria com todos os executáveis dinamicamente vinculados - portanto, não há necessidade de ajustar todos os outros programas.

    
por 07.07.2012 / 11:09
2

Se você sabe que o processo de sincronização está em execução e sabe que a única operação possível é cp , você pode enviar SIGSTOP para todos os processos para pausar a execução. Após a conclusão da sincronização, você envia SIGCONT para todos os processos para continuar.

Para isso, você pode usar kill -s SIGSTOP $(pidof cp) ou killall -s SIGSTOP cp . Em um terminal, você pode usar Ctrl + Z para fazer o background de uma tarefa ("pause"). Para continuar a execução, use o comando fg ("foreground", consulte help fg ).

    
por 07.07.2012 / 12:17