de qualquer maneira, falhar/atrasar um processo cp?

de qualquer maneira, falhar/atrasar um processo cp?

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

Responder1

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

  1. Crie um script wrapper para cp que verifica se a sincronização está em execução, verificando se o processo está em execução ou testando um arquivo de bloqueio, e aborta ou atrasa a operação.
  2. Use LD_PRELOADpara conectar writee outras chamadas.

O problema com a primeira solução é que você teria que agrupar todos os comandos usados ​​para escrever 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 todas as syscalls usadas para alterar/modificar o diretório, por exemplo write, , unlink, rename. Mas esta solução funcionaria com todos os executáveis ​​vinculados dinamicamente - portanto, não há necessidade de ajustar todos os outros programas.

Responder2

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

Para isso, você pode usar kill -s SIGSTOP $(pidof cp)ou killall -s SIGSTOP cp. Em um terminal, você pode usar Ctrl+ Zpara colocar uma tarefa em segundo plano ("pausa"). Para continuar a execução, utilize o fgcomando ("foreground", veja help fg).

Responder3

Seu sincronizador está gravando no diretório em vez de ler, certo? Portanto, tirar um instantâneo do sistema de arquivos ou definir o bit imutável está fora de questão.

Se você estiver executando o sincronizador como root, poderá 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á a entrada de novos processos que 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 abertos em sua árvore, você pode fazer lsof +D my_directory. O que você faz com esse conhecimento, porém, depende da situação.

informação relacionada