df -h无响应问题解决
问题1:
一、问题描述
1、linux下执行df -h 查看已挂在各分区的空间和目录情况,但执行后无反馈
二、影响
1、由于脚本程序调用df -h 判断磁盘空间情况进行日志等清理,故障导致磁盘空间占满不能清理,服务器不能访问。
三、问题分析
1、df -h和分区挂载有关,命令 mount 查看挂载情况发现以下问题

11.10.127.83:/www/repo/uploads on /etc/yum.repos.d type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=11.10.127.82,local_lock=none,addr=11.10.127.83)
因为上午刚对11.10.127.83做了防火墙策略阻止了该服务器nfs服务远程挂载的访问,df -h 读取不到挂在点的信息。
四、问题就解决
1、umount -f 11.10.127.83:/www/repo/uploads 立即解决
否则用umount -l 看看是否可以解决
干脆 umount -fl 11.10.127.83:/www/repo/uploads
-f 强制卸载(在无响应的NFS系统的情况下)
-l 隔离文件系统后,全部清除
2、对11.10.127.83 调整防火墙策略允许该服务器访问
3、脚本程序可写成 df -hl

问题二:
strace命令的应用——执行df命令卡死
  在1台CentOS机器执行“ls”、“df”命令,都会卡死。时间久一点,“ctrl”+“c”都不一定能退出,只能关掉远程连接,重新连接登录。
  执行命令:
[root@iZ23l20815kZ ~]# strace df -h

statfs("/yqd/war", {f_type=“NFS_SUPER_MAGIC”, f_bsize=1048576, f_blocks=503838, f_bfree=228849, f_bavail=203233, f_files=32768000, f_ffree=32667496, f_fsid={0, 0}, f_namelen=255, f_frsize=1048576}) = 0
statfs("/yqd/logs/share/web3_43.110", ^C <unfinished …>
  发现卡死在挂载到10.253.43.110服务器。
  检查挂载情况:
[root@iZ23l20815kZ ~]# mount

10.253.40.94:/yqd/logs/tomcat on /yqd/logs/share/api1_40.94 type nfs (rw,vers=4,addr=10.253.40.94,clientaddr=10.253.43.120)
//10.253.40.38/IMG1 on /mnt/data type cifs (rw)
  强制卸载10.253.43.150:这台机器在几天前已经下线关机,肯定挂载失败
[root@iZ23l20815kZ ~]# umount -lf /yqd/logs/share/api3_43.150
  果然,还是会卡死:
[root@iZ23l20815kZ ~]# df -h
^C
  强制卸载10.253.43.110:
[root@iZ23l20815kZ ~]# umount -lf /yqd/logs/share/web3_43.110
  恢复正常:
[root@iZ23l20815kZ ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 40G 5.9G 32G 16% /

问题原因:
  该问题通常是由于系统内挂载 NFS共享分区,而NFS响应缓慢或文件较多,导致统计NFS分区相关信息耗时很久。
相应的解决办法:
耐心等待统计完成后返回
卸载NFS分区的挂载后重新统计
检查NFS分区访问情况
检查服务器端NFS服务是否开启

针对当前案例,是因为一台服务器的tomcat服务去年就已经去掉,挂载目录已经没有日志和目录,造成切换到挂载目录无法响应,执行df命令也没有响应。至于卸载另一台服务器的挂载,是因为另外服务器前几天已下线关机,导致挂载状态发生变化。执行umount命令卸载,问题解决。
参考文档:
https://blog.csdn.net/lufeisan/article/details/53150319——Linux df 命令长时间没有返回

问题三:
Linux操作系统执行df -h命令卡死的解决方案
df -h命令是常用的Linux命令。但有时在执行df -h命令时,经常会出现卡死的情况,那么应该怎么解决呢?经过raksmart.idcspy.com简单分析,最终发现此问题一般都是因为mount对端服务失效,本地目录卡死造成的。因此大家可以按照以下步骤进行解决。
1、首先使用strace ls命令跟踪查看执行到哪一步卡死
strace ls /…

lgetxattr("/chaichuan_test", “system.posix_acl_default”, 0x0, 0) = -1 ENODATA (No data available) lstat("/mnt", {st_mode=S_IFDIR|0775, st_size=4096, …}) = 0
lgetxattr("/mnt",
可以看到,命令执行到 /mnt这个目录时,停止不动了

也可以使用cat /proc/mounts 查看当前mount状态,发现确实有对mnt目录的记录
cat /proc/mounts 192.168.10.149:/opt/ /mnt nfs4 …

2、fuser查看问题目录进程
问题定位/mnt目录,使用fuser 查看此目录占用进程
fuser -m /mnt 无法获取 /proc/4110/fd/255 的文件状态: 失效文件句柄
无法获取 /proc/9492/fd/255 的文件状态: 失效文件句柄
无法获取 /proc/29965/fd/255 的文件状态: 失效文件句柄
3、kill命令解决
找到进程号直接kill
kill -9 4110 # kill -9 9492 # kill -9 29965
问题解决
strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的, 具体使用可以查看帮助。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐