编辑:我完全忘记了这个线程。原来我的硬盘坏了。我们不得不重新部署这台服务器以满足其他需求,所以我终于开始更换一个坏磁盘,我们又恢复了业务。
几个星期以来,我无法弄清楚为什么我无法删除这个特定文件。作为 root 我可以,但我的 shell 脚本以不同的用户身份运行。所以我去运行 ls -la 并且它不存在。但是,如果我将它作为参数调用,它就会出现!果然,所有者是root,因此我无法删除。
注意,6535 不见了……
[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
现在,如果您直接调用它,它就会显示出来。
[root@server]# ls -la 6535
-rw-rw-r-- 1 root root 3486 Mar 26 01:01 6535
这里有一些有趣的东西。所以我发现了这个问题,因为在我的 shell 脚本中,它无法删除,因为 6535 归 root 所有。在我运行“rm -rf”后,该文件实际上会显示出来。我之前尝试过,但无法删除目录,因为它告诉我目录不为空。我进去看了看,果然,文件“6535”终于出现了。不知道为什么要这样做。
strace 说以下
#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
这有点令人担忧。我会通过与已知的良好文件进行比较来验证您的
ls
文件是否未被修改。您可以使用您的发行版的软件包工具来验证隔离系统上的文件。有时文件名中会包含奇怪的字符,例如光标移动序列。试试这个以确保:
它应该显示问号而不是控制字符(它可能是默认值,但可能不是)。
这部分说明了可能存在的问题类型:
我也会尝试:
查看是否定义了别名或函数,或者查看二进制文件是否位于奇怪的位置或已被修改。
您可能想要 fsck 该卷。
如果我相信'ls'已被修改,我通常会做这样的事情......
python -c "import os; print os.listdir('.')"
当然 Python、C 库、内核或文件系统也可以修改,但通常只是 shell 实用程序。
您可以使用 strace 准确查看 ls 正在做什么,这可能会告诉您为什么它避免显示该文件名。
看看那个,看看发生了什么。
输出将如下所示:
如果你看到类似的东西
小心,你已经被 0wned 了……
这不是一个决定性的测试,但它是一个很好的指标......
(如果您使用的是 solaris 或其他操作系统,您可能需要使用 truss 或其他类似的实用程序而不是 strace)
(如果您使用的是 csh/tcsh 派生的 shell,您可能需要不同的重定向语句)
快速更新,我们因其他原因不得不更换服务器。这是文件系统。现在一切都好!!!谢谢大家。
hack 理论很有趣,但我有另一种理论。Unix 文件删除语义将保留文件,直到所有进程都关闭指向它的打开文件句柄。也许有人暂停了 SVN 签出/提交,或者服务器线程挂起。如果重新启动 SVN 进程(或 Apache)可以解决您的问题,这就是我的责任所在。
也许您可以识别仍在使用此文件的进程
lsof | grep 6535
?