Edição: Eu esqueci totalmente sobre esta discussão. Acontece que eu tinha um disco rígido ruim. Tivemos que reimplementar esse servidor para outras necessidades, então finalmente consegui substituir o disco defeituoso e estamos de volta aos negócios.
Por algumas semanas, eu não conseguia entender por que não consegui excluir esse arquivo em particular. Como root, posso, mas meu script de shell é executado como um usuário diferente. Então eu corro ls -la e não está lá. No entanto, se eu chamá-lo como parâmetro, ele aparece! Com certeza, o proprietário é root, portanto, não consigo excluir.
Observe que 6535 está faltando ...
[root@server]# ls -la 653*
-rw-rw-r-- 1 svn svn 24002 Mar 26 01:00 653
-rw-rw-r-- 1 svn svn 7114 Mar 26 01:01 6530
-rw-rw-r-- 1 svn svn 8653 Mar 26 01:01 6531
-rw-rw-r-- 1 svn svn 6836 Mar 26 01:01 6532
-rw-rw-r-- 1 svn svn 3308 Mar 26 01:01 6533
-rw-rw-r-- 1 svn svn 3918 Mar 26 01:01 6534
-rw-rw-r-- 1 svn svn 3237 Mar 26 01:01 6536
-rw-rw-r-- 1 svn svn 3195 Mar 26 01:01 6537
-rw-rw-r-- 1 svn svn 27725 Mar 26 01:01 6538
-rw-rw-r-- 1 svn svn 263473 Mar 26 01:01 6539
Agora ele aparece se você ligar diretamente.
[root@server]# ls -la 6535
-rw-rw-r-- 1 root root 3486 Mar 26 01:01 6535
Aqui está algo interessante. Então, eu peguei esse problema porque, no meu script de shell, ele falharia em excluir porque o 6535 pertence ao root. O arquivo realmente aparece depois que eu executo "rm -rf". Eu tentei anteriormente e ele não conseguiu remover o diretório, pois me dizia que o diretório não está vazio. Entrei e olhei e, com certeza, o arquivo "6535" finalmente aparece. Não faço ideia por que está fazendo isso.
strace diz o seguinte
#strace ls -la 653* 2>&1 | grep ^open
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/tls/librt.so.1", O_RDONLY) = 3
open("/lib64/libacl.so.1", O_RDONLY) = 3
open("/lib64/libselinux.so.1", O_RDONLY) = 3
open("/lib64/tls/libc.so.6", O_RDONLY) = 3
open("/lib64/tls/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libattr.so.1", O_RDONLY) = 3
open("/etc/selinux/config", O_RDONLY) = 3
open("/proc/mounts", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY) = 3
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/share/locale/en_US.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/nsswitch.conf", O_RDONLY) = 3
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/libnss_files.so.2", O_RDONLY) = 3
open("/etc/passwd", O_RDONLY) = 3
open("/etc/group", O_RDONLY) = 3
open("/etc/mtab", O_RDONLY) = 3
open("/proc/meminfo", O_RDONLY) = 3
open("/etc/localtime", O_RDONLY) = 3
fonte
Respostas:
Isso é um pouco preocupante. Verificaria se o seu
ls
arquivo não foi modificado comparando com um arquivo válido. Você pode usar as ferramentas de pacote da sua distribuição para verificar o arquivo em um sistema isolado.fonte
ls
tenha sido modificado para ocultar um PID específico, possivelmente 6535. #Às vezes, os nomes de arquivos têm caracteres estranhos, como sequências de movimento do cursor. Tente isso para garantir:
Ele deve mostrar pontos de interrogação em vez de caracteres de controle (provavelmente é o padrão, mas pode não ser).
Isso demonstra parcialmente o tipo de problema que pode estar presente:
Eu também tentaria:
para ver se um alias ou função está definido ou se um binário está em um local estranho ou foi modificado.
fonte
ls
modificado,md5sum
o sistema também pode ter sido potencialmente modificado. Você precisa de um ambiente sadio conhecido para verificar e chegar a uma conclusão definitiva.Você pode querer fsck esse volume.
fonte
Normalmente faço algo assim se acredito que 'ls' foi modificado ...
python -c "import os; print os.listdir('.')"
É claro que o Python, a Biblioteca C, o kernel ou o sistema de arquivos também podem ser modificados, mas geralmente são apenas os utilitários de shell.
fonte
*.*
mostrará apenas arquivos com caracteres seguidos de um ponto seguido de caracteres. Definitivamente, isso não é tudo no sistema * nix. Eu não tenho certeza echo irá mostrar-lhe tudo em um comando, eu era capaz de fazê-loecho * && echo .*
Você pode analisar exatamente o que o ls está fazendo usando strace, e isso pode lhe dizer por que está evitando mostrar esse nome de arquivo.
veja isso e veja o que está acontecendo.
A saída será assim:
e se você vir algo como
tenha cuidado, você foi 0wned ...
Este não é um teste conclusivo, mas é um bom indicador ...
(se você estiver usando solaris ou outros sistemas operacionais, pode ser necessário usar treliça ou outro utilitário semelhante em vez de strace)
(se você estiver usando um shell derivado do csh / tcsh, provavelmente precisará de instruções de redirecionamento diferentes)
fonte
strace
utilitário é realmente um canivete suíço. Você chega ao nível de chamada do sistema e ignora toda uma pilha de complicações arbitrárias. É uma das primeiras coisas que qualquer administrador de sistema. vale um centavo deve despejar em uma máquina recém-instalada.Atualização rápida, tivemos que substituir o servidor por outros motivos. Foi o sistema de arquivos. Está tudo bem agora !!! Obrigado a todos.
fonte
A teoria do hack é interessante, mas eu tenho uma teoria alternativa. A semântica de exclusão de arquivo Unix manterá o arquivo por perto até que todos os processos tenham fechado os identificadores de arquivo aberto apontando para ele. Talvez alguém tenha pausado um check-out / confirmação de SVN ou um encadeamento do servidor desligado. Se reiniciar o processo SVN (ou Apache) resolver seu problema, é aqui que eu colocaria a culpa.
Talvez você possa identificar o processo que ainda está usando este arquivo
lsof | grep 6535
?fonte