AFAIK, find
pesquisa os diretórios do sistema de arquivos. Se esse arquivo foi excluído, mas ainda existe porque está aberto (um truque comum no unix), ele não será encontrado por find
.
Eu não tentei no Solaris, mas aqui é uma observação sobre o uso lsof
para identificar os arquivos "excluídos, mas abertos" e se recuperando por meio de um cat /proc/<procid>/fd/<fdid> > /tmp/xxxx
Editar :
parece que você já identificou este é o caso, mas ainda se perguntando como é possível. aqui está uma breve explicação:
no sistema de arquivos POSIX, os arquivos são manipulados pelo seu inode
, e os diretórios são pouco mais que um mapeamento "path = > inode". Você pode ter mais de um caminho 'apontando' para o mesmo inode (ele é chamado de hardlink), e o inode mantém uma contagem de quantos links ele possui. O comando rm
simplesmente chama unlink()
nesse caminho, o que reduz a contagem de links e 'possivelmente' exclui o próprio arquivo.
Mas um caminho na árvore de diretórios não é a única referência possível a um inode, um fd
aberto em um processo em execução também conta e um arquivo 'excluído' não será realmente removido até que ele seja 0 .
Como mencionei acima, é um truque comum: se você tem um arquivo temporário que não quer manter depois que o processo termina de ser executado, basta abri-lo e excluí-lo imediatamente. O identificador aberto funcionará de forma confiável e, quando o processo for concluído (normalmente, morto ou travado), o sistema removerá o identificador e excluirá o arquivo temporário.
Um arquivo de log não é um candidato provável para esse arquivo 'autodeleting oculto'; mas não é difícil fazer isso acidentalmente.
Como seu arquivo de log apagado ainda está ativo e coletando dados, parece que simplesmente copiar o conteúdo não ajudaria muito. então tente criar um novo hardlink para o / proc // fd / file, algo como ln /proc/4366/fd/1 /tmp/xxxx
. Note que não há -s
flag, então ln
deve criar um novo hardlink com o mesmo inode do original, não um link simbólico (que é pouco mais que um ponteiro para um caminho existente, e não o que você quer). / p>
Editar :
O comando ln /proc/... /tmp/...
não pode funcionar porque / proc e / tmp estão em sistemas de arquivos diferentes. Infelizmente, não sei como criar um nome de caminho para um inode existente. Alguém poderia querer que o link()
syscall levasse um número de inode e um caminho, mas ele toma caminhos de origem e de destino.