zoukankan      html  css  js  c++  java
  • linux系统中的一些典型问题汇总

    一、文件系统破坏导致系统无法启动:
    Checking root filesystem
    /dev/sda6 contains a file system with errors,check forced
    An error occurred during the file system check

    这个错误可以看出,操作系统/dev/sda6区分文件系统出现了问题,这个问题发生的几率很高,通常引起这个问题的原因主要是系统突然间断电,引起文件系统结构不一致,一般情况下,解决此问题的方法是采用fsck命令,进行强制修复
    umount /dev/sda6
    fsck.ext3 -y /dev/sda6

    二、"Argument list too long" 错误与解决方法
    crontab -e
    编辑完后保存退出后,报错no space left on device根据上面的报错了解到是磁盘空间满了,那么首先是检查磁盘空间
    df -h
    查看到是/var磁盘空间分区空间已经达到100%,至此定位了问题所在。是/var磁盘空间饱满导致,因为crontab会在保存时将文件信息写到/var目录下面,然后这个磁盘没有空间了,所以报错
    接着通过命令du -sh *命令查看/var目录下面的所有文件或者目录的大小,发现/var/spool/clientmqueue目录下的文件都是怎么产生的,能否删除,基本上都是邮件信息,可以删除
    rm *
    /bin/rm:argument list too long
    挡在linux系统中试图传递太多参数给一个命令时,就会出现“argument list too long”错误,这是linux系统一直以来都有的限制,查看这个限制可以通过命令"getconf ARG_MAX"来实现

    getconf ARG_MAX
    more /etc/issue
    解决方法:
    1、rm [a-n]* -rf
    rm [o-z]* -rf
    2、使用find命令来删除
    find /var/spool/clientmqueue -type -f -print -exec rm -f {};
    3、通过shell脚本
    #!/bin/bash
    RM_DIR='/var/spool/clientmqueue'
    cd ${RM_DIR}
    for i in `ls`
    do
    rm -rf ${i}
    done
    4、重新编译内核
    需要手动增加内核中分配给命令行参数的页数,打开kernel source下面的include/linux/binfmts.h文件,找到如下行:
    #denfine MAX_ARG_PAGES 32
    将32改为更大的值,例如62或者128,然后重新编译内核


    三、inode耗尽导致应用故障
    客户的一台oracle数据库如武器在关机重启后,oracle监听无法启动,提示报错linux error:No space left on device
    从输出信息看出来是因为磁盘耗尽导致监听无法启动,因为oracle在启动时需要创建监听日志文件,于是首先查看磁盘空间使用情况

    df -h
    从磁盘输出信息可知,所有的分区磁盘空间都还有剩余不少,而oracle监听写日志的路径在/var分区下,/var下分区空间足够
    解决思路:
    既然错误提示与磁盘空间有关,那就深入研究关于磁盘空间的问题,在linux系统中对磁盘空间的占用分为三个部分:第一个是物理磁盘空间,第二个是inode节点所占用的磁盘空间,第三个是linux用来存放信号量的空间,而平时接触较多的是物理磁盘空间。既然不是物理磁盘空间的问题,接着就检查是否是inode节点耗尽的问题,通过执行命令"df -i"查看可用的inode节点。由输出结果查看确实是因为inode耗尽导致无法写入文件

    通过下面的命令查看某个磁盘分区inode的总数
    dumpe2fs -h /dev/sda3 | grep 'inode count'
    每个inode都有一个号码,操作系统用inode号码来区分不同的文件,通过'ls -i'命令查看文件名对应的inode号
    如果要查看这个文件更详细的inode信息,可以通过stat命令来实现
    stat install.log
    解决问题
    find /var/spool/clientmqueue/ -name "*" -exec rm -rf {};

    四、文件已经删除,但是空间没有释放的原因
    运维监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实满了,这里先说一下服务器的一些删除策略,由于linux没有回收站功能,所以线上服务器所有要删除的文件都会先移动系统/tmp目录下,然后定期清除/tmp目录下的数据。这个策略本身没有什么问题,但是通过检查发现这台服务器的系统分区中并没有单独划分/tmp分区,这样/tmp下的数据其实占用根分区的空间,既然找到了问题,那么删除/tmp目录下一些占用空间较大的数据即可
    du -sh /tmp/* | sort -nr | head -n 3
    通过命令发现在/tmp目录下有个66G大小的文件access_log,这个文件应该是apache产生的访问日志文件,从日志大小来看,应该是很久没有清理apache日志文件了,基本判定是这个文件导致的根目录饱满,在确认这个可以删除后,删除如下命令
    rm /tmp/access_log
    df -h
    从输出来看,根分区空间任然没有释放,这是怎么回事,一般来说不会出现删除文件空空间不释放的情况,但是也存在例外,比如文件进程锁定,或者有进程一直在向这个文件写数据,要理解这个问题,就需要知道linux下文件的存储机制和存储结构
    一个文件在文件系统中存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清楚了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清楚后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除access_log文件后,空间还没有释放,就是因为httpd进程还在一直想这个文件写入内容,导致虽然删除了access_log文件,但是由于进程锁定,文件对应的指针部分并未从meta-data中清除,而由于指针并未删除,系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放
    解决问题:到这里问题就基本排查清楚了,解决这一类问题的方法有很多,最简单的方式就是关闭或者重启httpd进程,当然重启操作系统也是可以。不过这些并不是最好的办法,对待这种进程不断对文件写日志的操作,要释放文件占用的磁盘空间,最好的办法是在线清空这个文件,具体可以通过如下命令完成
    echo ""> /tmp/access_log
    通过这种方法,磁盘空间不但可以马上释放,也可以保障进程继续向文件写入日志,这种方法经常用于在线清理apache /tomcat/nginx等web服务产生的日志文件

    五、"too many open files"错误与解决办法
    问题现象:这是一个基于java的web应用系统,在后台添加数据时提示无法添加,于是登录服务器查看tomcat日志,发现如下异常信息
    java.io.IOException:Too many open files
    通过这个报错信息,基本判断是系统可以用的文件描述符不够了,由于tomcat服务是系统www用户启动的,于是以www用户登陆系统,通过ulimit -m命令查看系统可以打开最大文件描述符的数量,输出如下:
    ulimit -n
    65535
    可以看到这台服务器设置的最大可以打开的文件描述符已经是65535了,这么大的值应该够用了,但是为什么提示这样的错误呢。
    解决思路,这个案例涉及ulimit命令的使用
    在使用ulimit时,有以下几种使用方法:
    1、在用户环境变量中加入如果用户使用的是bash,那么可以在用户目录的环境变量文件.bashrc或者.bashrc_profile中加入"ulimit -u 128"来限制用户最多可以打开使用128个进程
    2、在应用程序的启动脚本中加入如果应用程序是tomcat,那么可以再tomcat的启动脚本startup.sh中加入‘ulimit -n 65535’来限制用户最多可以使用65535个文件描述符
    3、直接在shell命令终端执行ulimit命令这种方法的资源限制仅仅在执行命令的终端生效,在退出或者关闭终端后,设置失效,并且这个设置不影响其他shell终端

    解决问题:
    在了解ulimit知识后,接着上面的案例,既然ulimit设置没有问题,那么一定是设置没有生效导致的,接下来检查下启动tomcat的www用户环境变量是否添加ulimit限制,检查后发现,www用户并无ulimit限制。于是继续检查tomcat启动脚本startup.sh文件是否添加了ulimit限制,检查后发现也没有添加。最后考虑是否将限制加到了limits.conf文件中,于是检查limits.conf文件,操作如下:
    cat /etc/security/limits.conf | grep www
    www soft nofile 65535
    www hard nofile 65535
    从输出可知,ulimit限制加在limits.conf文件中,既然限制已经添加了,配置也没有什么错,为何还会报错,经过思考,判断只是一种可能,那就是tomcat的启动时间早于ulimit资源限制的添加时间,于是首先查看下tomcat启动时间,操作如下:
    uptime
    Up 283 days
    pgrep -f tomcat
    4667
    ps -eo pid,lstart,etime | grep 4667
    4667 Sat Jul 6 09:33:39 2013 77-05:26:02
    从输出可以看出,这台服务器已经有283没有重启了,而tomcat是在2013年7月6日9点启动的,启动了近77天,接着继续看看limits.conf文件的修改时间
    stat /etc/security/limits.conf
    通过stat命令清楚的看到,limits.conf文件最后的修改时间是2013年7月12晚于tomcat启动时间,清楚问题后,解决问题的方法很简单,重启一下tomcat就可以了

    六、Read-only file system错误与解决方法
    解析:出现这个问题的原因有多种,可能是文件系统数据块出现不一致导致的,也可能是磁盘故障造成的,主流ext3/ext4文件系统都有很强的自我修复机制,对于简单地错误。文件系统一般都可以自行修复,当遇到致命错误无法修复的时候,文件系统为了保证数据一致性和安全,会暂时屏蔽文件系统的写操作,将文件系统变为只读。
    手工修复文件系统致命错误的命令式fsck,在修复文件系统前,最好卸载文件系统所在的磁盘分区
    umount /www/data
    Umount: /www/data:device is busy
    提示无法卸载,可能是这个磁盘中海油文件对应的进程在运行,检查如下
    fuser -m /dev/sdb1
    /dev/sdb1:8800

    接着检查8800端口对应的是什么进程
    ps -ef | grep 8800
    检查后发现是apache没有关闭,停止apache
    /usr/local/apache2/bin/apachectl stop
    umount /www/data
    fsck -V -a /dev/sdb1
    mount /dev/sdb1 /www/data

  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/1111zhiping-tian/p/8136035.html
Copyright © 2011-2022 走看看