Como encontro e relato automaticamente links simbólicos quebrados?

9

Como administradores de sistemas, gostamos de garantir que as pequenas coisas sejam tão bem cobertas quanto as grandes (quando o tempo permitir). Uma dessas coisas é garantir que nossos sistemas não estejam cheios de links simbólicos quebrados.

Por que esses pequenos lutadores são um problema? Porque eles fazem você pensar que os arquivos estão lá quando eles não estão, eles podem ser uma indicação de algo mais chato, e porque o (pequeno) OCD parte de mim enlouquece com todos esses avisos ao executar certos comandos (como grep -r ).

Então, como alguém poderia detectar (e relatar, via e-mail ou sistema de monitoramento) links quebrados nas partes de um sistema pelas quais o administrador é responsável (não adianta dizer que ~jbloggs tem um monte de links simbólicos quebrados, esse é o problema dele?

    
por womble 31.07.2011 / 02:58

4 respostas

7

O problema com -L é que tem o efeito colateral de expandir a pesquisa em subdiretórios que são os alvos de symlinks , o que pode não ser esperado ou desejado.

Com GNU findutils versão de find :

<!-- language: bash -->
find /path/to/search -xtype l

exceto que não encontra links simbólicos cíclicos.

-execdir na outra resposta não é tão portátil, o que remete a uma solução portátil que encontra links simbólicos quebrados, incluindo links cíclicos:

<!-- language: bash -->
find /path/to/search -type l -exec test ! -e {} \; -print

Veja esta pergunta ou ynform.org para uma discussão mais aprofundada. Consulte também a documentação do findutils para obter detalhes. O link ynform.org também apresenta um método para detectar apenas links cíclicos.

    
por 29.09.2012 / 18:16
5

Muitas maneiras de esfolar um gato

Isto é bastante portátil (-L é requisito posix)

find -L /path/you/care/about -type l 2>/dev/null | mail -s "Broken symlinks detected" [email protected]

Você não definiu quebrado, o acima lhe enviaria links quebrados que não têm destino na parte do sistema de arquivos de seu interesse. Ele também informa sobre loops do sistema de arquivos stderr e muitos níveis de problemas de links simbólicos etc. Se você se preocupa com eles também, então redirecione o stderr para o seu e-mail

find -L /path/you/care/about -type l 2>&1 | mail ...

Se a sua pesquisa for compatível, -readable é útil e rápido

find /path/you/care/about -type l ! -readable | mail ...

O item acima inclui links com muitos níveis de problemas de link simbólico em sua saída, mas não em loops do sistema de arquivos.

Se as partes do sistema de arquivos de que você gosta têm caminhos diferentes, então

find /path/you/care/about /another/path ...
    
por 31.07.2011 / 10:50
1

Eu lhe darei uma resposta do Linux e você poderá ajustá-la ao seu Unix, se necessário:

find . -type l ! -execdir test -e {} \; -print >> broken_symlinks.txt; mutt -s "Broken symlinks" [email protected] < broken_symlinks.txt; rm -f broken_symlinks.txt

A segunda opção é ls -LR | grep 'cannot access' ou algumas modificações do comando find acima.

Editar:

Sim, isso é ainda melhor: find . -type l ! -execdir test -e {} \; -print | mail -s "Broken symlinks" [email protected]

    
por 31.07.2011 / 04:33
0

Esta é uma boa maneira de fazer isso com o GNU find:

find <root_dir_of_find> -follow -lname '*' | mail sysadmin -s 'Broken symlink report'

A razão pela qual isso funciona é porque -lname com -follow (ou -L) "... este teste retorna false, a menos que o link simbólico seja quebrado", de acordo com a página man find.

Provavelmente seria aconselhável executar esse tipo de verificação de disco quando o servidor não for muito usado. Pode ser útil usar nice e / ou ionice (veja este blog para uma boa descrição de ionice ) para reduzir a carga no servidor durante a execução desta tarefa.

    
por 31.07.2011 / 12:44