日期:2014-05-16  浏览次数:20798 次

深入探测Linux cluster RPM 安装过程

今天同事在Suse的cluster 2+4的系统上准备安装给RPM,但是这个RPM中的Spec文件里的脚本需要检测当前系统的ifconfig信息,问题就来了。系统在启动的时候IP interface还没有完全起来,导致RPM重启某个服务不起作用。

第一次很简单的我就想到在Spec中先循环检测IP interface,当检测到已经起来了再进行服务重启。结果查看程序log,一直没有打印循环那一块的日志。再检查/var/log/message里系统的log发现系统log也没有写了,一直阻塞在我们打的RPM包那。由此可见cluster安装RPM是队列式安装的,并且Spec里的脚本阻塞也会导致整个cluster安装RPM阻塞!

解决方案:在Spec文件中对循环检测系统IP Interface的地方用多线程引出来,也就是shell中的后台运行。如何对shell脚本进行后台执行,请看下面的例子:

# !/bin/bash
for((i = 0 ;i < 5 ;i ++ )); do
{
    sleep 3 ;echo 1 >> aa  &&  echo " done! "
}
done
wait
cat aa | wc  - l
rm aa
这里程序会顺序执行,即需要15s,再看下面的程序:

# !/bin/bash
for((i = 0 ;i < 5 ;i ++ )); do
{
    sleep 3 ;echo 1 >> aa  &&  echo " done! "
} &
done
wait
cat aa | wc  - l
rm aa
这段程序只需3s,原因很简单,同时执行了,请注意for循环后面的&符号。此符号就是让程序在后台执行。另外再说下wait的作用,就是等上面的后台程序执行完后再执行后面的程序。