作为整洁的系统pipe理员,我们希望确保小事情和大事情一样好(当时间允许的时候)。 其中一件事就是确保我们的系统没有被破坏的符号链接。
为什么这些小模块是一个问题? 因为他们让你觉得文件在那里,当他们不在的时候,他们可能是一个更恼人的东西的迹象,因为当我运行某些命令(比如grep -r时,我的(小的)OCD部分疯狂地带着所有这些警告)。
那么,如何去检测(通过电子邮件或监控系统报告)pipe理员负责的系统各个部分的断开连接(没有一点告诉我说~jbloggs有一堆破坏的符号链接,这就是他的问题)?
许多方法去皮肤猫
这是相当便携的(-L是POSIX要求)
find -L /path/you/care/about -type l 2>/dev/null | mail -s "Broken symlinks detected" [email protected]
你没有定义破坏,上面会发送你在你关心的文件系统中没有目标的断开的链接。 它还报告stderr文件系统循环和符号链接等问题。 如果你也关心他们,那么把stderrredirect到你的邮件
find -L /path/you/care/about -type l 2>&1 | mail ...
如果你发现支持它, -readable是有用和快速的
find /path/you/care/about -type l ! -readable | mail ...
以上内容包括链接在输出中存在太多级别的符号链接问题,但不包括文件系统循环。
那么,如果你关心的文件系统的部分有不同的path
find /path/you/care/about /another/path ...
-L的问题在于将search扩展到作为symlinks目标的子目录的副作用,这可能不是预期的或期望的。
用GNU findutils版本find :
<!-- language: bash --> find /path/to/search -xtype l
除了没有find循环的符号链接。
-execdir在另一个答案是不便携的,所以把它提炼成一个便携式的解决scheme,find包括循环链接在内的错误的符号链接:
<!-- language: bash --> find /path/to/search -type l -exec test ! -e {} \; -print
看到这个问题 ,或者进一步讨论ynform.org 。 有关详细信息,请参阅findutils文档 。 ynform.org链接还提供了一种仅检测循环链接的方法。
我会给你一个Linux的答案,你可以调整它到你的Unix,如果需要的话:
find . -type l ! -execdir test -e {} \; -print >> broken_symlinks.txt; mutt -s "Broken symlinks" [email protected] < broken_symlinks.txt; rm -f broken_symlinks.txt
第二个选项是ls -LR | grep 'cannot access' ls -LR | grep 'cannot access'或者上面find命令的一些修改。
编辑:
是的,这更好: find . -type l ! -execdir test -e {} \; -print | mail -s "Broken symlinks" [email protected] find . -type l ! -execdir test -e {} \; -print | mail -s "Broken symlinks" [email protected]
这是用GNU find做的一个很好的方法:
find <root_dir_of_find> -follow -lname '*' | mail sysadmin -s 'Broken symlink report'
这样做的原因是因为-lname与-follow (或-L)“…该testing返回false,除非符号链接被破坏”,根据查找手册页。
当服务器没有被大量使用时,运行这种types的磁盘扫描可能是明智的。 使用nice和/或ionice (请参阅本博客以了解ionice的一个很好的描述 )以减less运行此任务时服务器上的负载可能会很有用。