有一个特定的目录 ( /var/www
),当我运行它ls
(带或不带某些选项)时,命令会挂起并且永远不会完成。 中只有大约 10-15 个文件和目录/var/www
。大部分只是文本文件。以下是一些调查信息:
[me@server www]$ df .
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_dev-lv_root
50G 19G 29G 40% /
[me@server www]$ df -i .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_dev-lv_root
3.2M 435K 2.8M 14% /
find
运行正常。此外,我还可以输入cd /var/www/
并按 TAB 键,然后按 Enter 键,它将成功完成其中所有文件/目录的制表符补全列表:
[me@server www]$ cd /var/www/
cgi-bin/ create_vhost.sh html/ manual/ phpMyAdmin/ scripts/ usage/
conf/ error/ icons/ mediawiki/ rackspace sqlbuddy/ vhosts/
[me@server www]$ cd /var/www/
由于挂起,我不得不多次终止我的终端会话ls
:
[me@server ~]$ ps | grep ls
gdm 6215 0.0 0.0 488152 2488 ? S<sl Jan18 0:00 /usr/bin/pulseaudio --start --log-target=syslog
root 23269 0.0 0.0 117724 1088 ? D 18:24 0:00 ls -Fh --color=always -l
root 23477 0.0 0.0 117724 1088 ? D 18:34 0:00 ls -Fh --color=always -l
root 23579 0.0 0.0 115592 820 ? D 18:36 0:00 ls -Fh --color=always
root 23634 0.0 0.0 115592 816 ? D 18:38 0:00 ls -Fh --color=always
root 23740 0.0 0.0 117724 1088 ? D 18:40 0:00 ls -Fh --color=always -l
me 23770 0.0 0.0 103156 816 pts/6 S+ 18:41 0:00 grep ls
kill
即使使用 sudo,似乎也不会对进程产生任何影响。
我还应该做什么来调查这个问题?它今天突然开始随机发生。
更新
dmesg
这是一大堆问题,大部分与我安装过多次的外部 USB 硬盘有关,并且已达到最大安装次数,但我认为这是无关的问题。在底部dmesg
我看到了以下内容:
INFO: task ls:23579 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
ls D ffff88041fc230c0 0 23579 23505 0x00000080
ffff8801688a1bb8 0000000000000086 0000000000000000 ffffffff8119d279
ffff880406d0ea20 ffff88007e2c2268 ffff880071fe80c8 00000003ae82967a
ffff880407169ad8 ffff8801688a1fd8 0000000000010518 ffff880407169ad8
Call Trace:
[<ffffffff8119d279>] ? __find_get_block+0xa9/0x200
[<ffffffff814c97ae>] __mutex_lock_slowpath+0x13e/0x180
[<ffffffff814c964b>] mutex_lock+0x2b/0x50
[<ffffffff8117a4d3>] do_lookup+0xd3/0x220
[<ffffffff8117b145>] __link_path_walk+0x6f5/0x1040
[<ffffffff8117a47d>] ? do_lookup+0x7d/0x220
[<ffffffff8117bd1a>] path_walk+0x6a/0xe0
[<ffffffff8117beeb>] do_path_lookup+0x5b/0xa0
[<ffffffff8117cb57>] user_path_at+0x57/0xa0
[<ffffffff81178986>] ? generic_readlink+0x76/0xc0
[<ffffffff8117cb62>] ? user_path_at+0x62/0xa0
[<ffffffff81171d3c>] vfs_fstatat+0x3c/0x80
[<ffffffff81258ae5>] ? _atomic_dec_and_lock+0x55/0x80
[<ffffffff81171eab>] vfs_stat+0x1b/0x20
[<ffffffff81171ed4>] sys_newstat+0x24/0x50
[<ffffffff810d40a2>] ? audit_syscall_entry+0x272/0x2a0
[<ffffffff81013172>] system_call_fastpath+0x16/0x1b
而且,还strace ls /var/www/
吐出了一大堆信息。我不知道这里面有什么用处……最后几行:
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=68, ws_col=145, ws_xpixel=0, ws_ypixel=0}) = 0
stat("/var/www/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/var/www/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
getdents(3, /* 16 entries */, 32768) = 488
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 9), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3093b18000
write(1, "cgi-bin conf create_vhost.sh\te"..., 125cgi-bin conf create_vhost.sh error html icons manual mediawiki phpMyAdmin rackspace scripts sqlbuddy usage vhosts
) = 125
close(1) = 0
munmap(0x7f3093b18000, 4096) = 0
close(2) = 0
exit_group(0) = ?
答案1
运行strace ls /var/www/
并查看它挂在什么地方。它肯定挂在 I/O 上——这就是输出D
中的状态ps
所表示的意思(并且由于kill
没有帮助,它是不可中断的 I/O 系统调用之一)。大多数挂起都涉及 NFS 服务器已停止运行,但根据您的情况,df
这里的情况并非如此。为了以防万一,快速检查dmesg
与文件系统或磁盘相关的任何内容可能是值得的。
答案2
希望这会有所帮助,我在 Ubuntu 14.04 中使用 AUFS 驱动程序时出现了上述症状docker
。docker compose
挂起ls <dir>
,并strace ls <dir>
显示它挂起在getdents
通话中。停止所有正在运行的容器使我能够按预期开始使用驱动器。
答案3
我遇到了同样的问题。原来,我在该目录中有一个指向 GVFS 上的 SMB 挂载的符号链接。
lrwxrwxrwx 1 alex alex 45 Sep 16 2011 foo -> /home/alex/.gvfs/bar on foo/data/
通常ls
情况下,无论共享是否已安装,都会立即完成。但在这种情况下,我暂停并恢复了机器,并且安装总体表现不佳。重新安装共享解决了问题。
答案4
Womble 的建议非常好,您应该首先尝试一下,但如果他们不修复它,当文件系统变得自不一致时(通过不稳定的硬件、模糊的内核错误甚至宇宙射线),我就遇到过这个问题。
如果您认为可能是这样,您可以通过执行以下操作在重启时强制执行 fsck touch /forcefsck; reboot
。观察启动时显示的内容,看看 fsck 是否发现任何不一致之处。
警告:这将对连接到机器的所有文件系统进行 fsck;如果你还连接了多 PB 磁盘阵列,请不要这样做,这可能需要天. fsck
文件系统也可能导致数据丢失;如果你的文件系统确实存在不一致,e2fsck 会将其从看起来正确但不能完全正常工作的文件系统更改为正常工作但可能不包含您期望的所有内容的文件系统。