一、背景
因我们日常使用Linux系统过程中,会不时遇到系统崩溃的事,但这时系统界面除了呈现一片告警字符外,无发执行任何其他操作,留给我们的要不重启,要不就是尴尬等待指令。那面对会这种情况,还到底有没有可操作的空间呢?未必,也许可绝处逢源。
二、Linux系统崩溃
2.1、OOM
OOM是Out of Memory的简写,也就是内存不足。可能原因有系统bug,内存泄露。有时候服务过载,比如短时间内连接数飙升,数据量大导致内存飙升,OOM宕机 ;另外还有就是Java类程序导致,最常见的是四类:堆溢出(Heap), 栈溢出(Stack), 永久代溢出(常量池/方法区), 直接内存溢出。
2.2、其他
检查发现:内存占用前三的进程
三、紧急措施
linux死机后按电源建强制关机,非常容易进一步损坏系统或者硬件,导致重启后二次故障;实际除了这种果断措施,还能尝试以下挽救措施:
1.一种方式是进入终端界面进行操作,按ctrl+alt+f1(或者f2~f6)进入tty,使用top命令查看一下进程,把一直占用资源很大的进程kill掉,如果是在图形界面下死机的话,不要再依赖任何图形界面的工具,切换到非图形界面尝试 Alt+F7;
2.如果进入不了tty或者进入tty后不管用,可以采取终极大杀器–reisub方法,这个方法可以在系统死机的情况下安全的重启计算机,数据还不会丢失;具体操作是:按住alt+SysRq,再依次按下reisub几个键,按完b键就会重启
其实:Sys Rq 是一种叫做系统请求的东西,按住 Alt-Print/PrtSc 的时候就相当于按住了 Sys Rq 键,这个时候输入的一切都会直接由 Linux 内核来处理,它可以进行许多低级操作。这个时候 reisub 中的每一个字母都是一个独立操作,他们分别表示:
nRaw:将键盘控制从 X Server 那里抢回来
tErminate:给所有进程发送 SIGTERM 信号,让他们自己解决善后
kIll:给所有进程发送 SIGKILL 信号,强制他们马上关闭
Sync:将所有数据同步至磁盘
Unmount:将所有分区挂载为只读模式
reBoot:重启
另外需要注意下,不要快速连续地按下这几个键,他们执行需要时间,因此可大概每个间隔10秒左右执行下一个,尤其s键之后因为同步数据比较慢,可以停20秒或更长一点。
四、附录:
1、怀疑本机对外大量tcp外访扫描:有大量syn_sent请求
#抓SYN, ACK:
#TCP标记值:tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg
#-s 0是抓取完整数据包,否则默认只抓68字节;-c参数指定抓多少个包
tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
#计算抓10000个SYN包花费多少时间,可以判断访问量大概是多少
time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
2、系统故障辅助工具
Memtest86:用于检测系统内存是否存在问题。可以使用Live CD或USB启动Memtest86并运行测试。
Systemtap:用于跟踪系统的执行过程。可以使用Systemtap来查找并修复可能导致系统死机的问题。
GDB(GNU调试器):用于调试系统中的程序。可以使用GDB来分析系统死机时的堆栈信息,并找出引发故障的代码。