您的位置:首页 > 运维架构 > Shell

Shell 脚本小试牛刀(3) -- libc库版本记录

2014-04-23 17:26 260 查看
一个完整的项目应该包括记录完整的环境,所以你的程序中可能需要记录:Linux内核版本、使用系统板本、文件系统版本、gcc版本等等,而这些记录的系统信息在程序维护以及升级时都是极为重要的宝贵资源。

当然这些信息你可以使用一个脚本记录到某一个文档中,或者直接插入数据库中,不管对结果怎么处理,使用shell脚本记录是一个很方便而且是可重用的。

但是使用脚本中一定要注意的问题是脚本的通用性!当然你也很难遇测以后的系统中文件的路径会不会发生变化!我就遇到这样的问题:我们的记录环境信息的脚本中记录 libc 库的版本行出错,打开找到该行,原版本市这么写的:

libc_verion=$(ls
-l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')

这段代码在一台老机器上运行是正常的:

root@debian:/tmp$ ls -l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g'

2.11.3

但是我在我电脑上试运行 “
ls -l /lib/libc.so.6 ”
时,会报错:

long@Debian-PC:~$ ls -l /lib/libc.so.6

bash: ls -l /lib/libc.so.6: No such file or directory

所以出现的问题也很明显,那就是在我的系统上 libc 库的路径发生了变化,那么经过我的不懈努力呢(额,夸张了点哈)发现,在我的Debian 7 下libc 库被挪到了“ /lib/i386-linux-gnu/libc.so.6 ”路径下,于是,我写了如下小脚本替换了原来的查找 libc 库版本的命令行:

#!/bin/bash
# (C) 2014 Yunlong Zhou <reaper888@yeah.net>  
# Under licence  GPL  
# File :   record_libc_version.sh   
# Introduction:  
#       This script is using for record the libc library version  
# Useage :  
#       $ ./record_libc_version.sh 
#       Your system is : Debian-7.4
#       Your arch is :i686
#       Your kernel version is :3.12.1
#       Your libc library version is :2.13

echo "Your system is : Debian-"`cat /etc/debian_version`
echo "Your kernel version is :"`uname -r | cut -d "-" -f1`
echo "Your arch is :"`uname -a | cut -d " " -f14`
ls -l /lib/libc.so.6  &>/dev/null
if [ $? == 0 ] ;then
    libc_version=$(ls -l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
else
    uname -a >/tmp/system_version
    if grep -q "x86_64" /tmp/system_version ; then
        libc_version=$(ls -l /lib/x86_64-linux-gnu/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
    elif grep -q "i386" /tmp/system_version || grep "i686" /tmp/system_version ; then
        libc_version=$(ls -l /lib/i386-linux-gnu/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
    else
        libc_version=$(ls -l /lib/*-linux-gnu*/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
    fi
    rm /tmp/system_version
fi

echo "Your libc library version is :"$libc_version


进行替换后,无论是在我的32位还是64位系统,亦或旧版本的机器上运行此脚本都是正常的:

在我的32位Debian台式机上运行结果为:

long@Debian-PC:/tmp$./record_libc_version.sh

Your system is : Debian-7.4

Your kernel version is :3.12.1

Your arch is :i686

Your libc library version is :2.13

在我的64位Debian笔记本上运行结果为:

zhouyl@wheezy:~$ /tmp/record_libc_version.sh

Your system is : Debian-7.4

Your kernel version is :3.12.9

Your arch is :x86_64

Your libc library version is :2.13

在旧机器上运行结果:

root@debian:/tmp$ ./record_libc_version.sh

Your system is : Debian-6.0.9

Your kernel version is :3.12.1

Your arch is :i686

Your libc library version is :2.11.3

注: 目前手头没有旧版本的Debian机器,所以没有更旧版本的运行结果,如果你那运行有问题,请在留言处给我回复哦!!谢谢


事实证明,else中使用匹配模式 " ls -l /lib/*-linux-gnu*/libc.so.6 "还是很有用的,我同学手里有一款 PcDuino ,亲测有效:

ubuntu@ubuntu:/tmp$ ./record_libc_version.sh

Your system is : Debian-wheezy/sid

Your kernel version is :3.4.29+

Your arch is :armv7l ---arm 架构的哦!

Your libc library version is :2.15

而,在这一款板子上,Libc库所在位置是:

ubuntu@ubuntu:/tmp$ ls -l /lib/arm-linux-gnueabihf/libc.so.6

lrwxrwxrwx 1 root root 12 Oct 6 2012 /lib/arm-linux-gnueabihf/libc.so.6 -> libc-2.15.so

因此,匹配成功~~ OK,效果不错,了罢此文~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: