首页 > 代码库 > Linux服务器挂死案例分析

Linux服务器挂死案例分析

问题现象:

在linux服务器上运行一个指定的脚本时,就会出现无数个相同进程的,而且不停的产生,杀也杀不掉,最后系统就陷入死循环,无法登陆,只能人工去按机器的电源键才可以。这够崩溃的吧?

问题分析过程:

在分析过程中发现这个特定的脚本有些特别,和系统中已有的命令的名字是相同的。

以free命令为例:

这个脚本名字就叫做free(后面没有带.sh),而且这个脚本文件里又去调用了free命令。

这个脚本的本意应该是要去调用free命令来完成一个任务。

那是否就是因为这样就会导致问题呢?

其实光这样是不会出问题的,因为脚本的调用一般要采用如下两种方式来调用:

方式一、sh free

方式二、./free

如果直接执行free,会去调用系统命令中的free,而不是当前这个脚本,那也就不会出现问题了。

另外一个条件就是环境变量的配置(Linux中环境配置文件可能为:.bash_profile .profle .bashrc):

对于PATH这个变量的配置,如果这个变量中包含了.,如

PATH=.:xxx:/sbin:/bin:/usr/sbin

在PATH中包含了. 之后,会发生什么样的效果呢,执行命令时,会在当前目录下去查找命令,如果我们把点加到了PATH变量的最前面,那就会优先在当前目录下查找命令。

此时再在当前目录下执行free,就会执行我们命名为free的脚本文件,而脚本文件又会调用自身,以此形成死循环。


总结:

1.PATH中如果增加点,那么执行命令时,操作系统会在当前目录下查找命令,如果点放到PATH的最前面,则会优先执行当前目录下的命令

2.不要将脚本文件命令为与系统命令相同,不要去掉.sh后缀。坚持一些开发的基本原则,很多时候会避免很多不必要的麻烦。