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:
- 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.
- Use
LD_PRELOAD
para conectarwrite
e 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 SIGSTOP
a todos os processos para pausar a execução. Após a conclusão da sincronização, você envia SIGCONT
para 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 fg
comando ("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.