内容


一个 UNIX 开发者需要掌握的 AIX 技巧

Comments

正在使用哪个版本的 AIX? 在需要帮助时 , 提供详细信息 !

做为一个 UNIX 开发、维护者,当然要知道当前登陆系统的具体版本。这样当需要和其它技术人员交流经验,分享乐趣,以及寻求帮助的时候,你可以让他们尽快而详解的了解你的系统的基本信息。从 2006 年后,AIX 的版本管理更加细化全面, 但复杂的层次也更容易让不了解的人产生混乱。先看一个输出例子:

 $ oslevel -s 
 5300-06-05-0806 
 $

这里列出的版本信息可以具体解释为,当前的系统环境是 AIX 版本 5, ML (Maintenance Level)3,TL(Technical Level)06,SP(Service Pack)05。

TL 是 IBM 会较长时间支持的版本, 对于每个发布的 TL,AIX 产品部门每隔 6 周左右都会发布更新的 SP 来发布新的硬件支持, 解决系统已知的漏洞等。

另外一个更全面的命令, 经常为 AIX 系统工程师,AIX 系统管理员使用的是一个 AIX 4.3.3 以来即支持的命令,prtconf (或者 lsconf)。它的示例输出如下:

清单 1.prtconf 命令输出样本
 $ prtconf 
 System Model: IBM,8203-E4A 
 Machine Serial Number: XXXXXXX 
 Processor Type: PowerPC_POWER6 
 Processor Implementation Mode: POWER 6 
 Processor Version: PV_6_Compat 
 Number Of Processors: 1 
 Processor Clock Speed: 4204 MHz 
 CPU Type: 64-bit 
 Kernel Type: 64-bit 
 LPAR Info: 3 aix53 
 Memory Size: 6208 MB 
 Good Memory Size: 6208 MB 
 Platform Firmware level: EL320_076 
 Firmware Version: IBM,EL320_076 
 Console Login: enable 
 Auto Restart: true 
 Full Core: false 

 Network Information 
        Host Name: aix53 
        IP Address: 9.125.241.55 
        Sub Netmask: 255.255.255.0 
        Gateway: 9.125.241.1 
        Name Server: 9.181.2.101 
        Domain Name: cn.ibm.com 

 Paging Space Information 
        Total Paging Space: 2048MB 
        Percent Used: 4% 

 ............................... 
 $

我们可以看到这个命令详细的列出了系统的硬件配置, 包括硬盘,CPU,内存的配置以及网络地址等信息。这比我们使用 ifconfig – a、uname、lsdev 等命令分别去收集快多了。

监控系统性能,不是超级用户也可以做到!

开发者和系统普通用户如 DBA 也需要关注系统的性能。AIX 系统也在其环境下也为我们这些非 root 的普通用户准备了足够的监控工具。

首先介绍一个窗口式的工具 topas,在不同的 UNIX 或者 Linux 下的命令 top 有所不同,AIX 中使用的是 topas。使用这个命令我们可以在同一个界面下,全局性的观察到系统中各个资源 - CPU,网络,磁盘, 内存和交换区等使用情况。常常我们需要关注的参见如下图框选的各个部分:

图 1.topas 命令的系统界面截图
图 1.topas 命令的系统界面截图
图 1.topas 命令的系统界面截图

框选的部分分别代表了系统 CPU 等待时间(这个指标常常影响着 CPU 性能), 磁盘的繁忙程度以及进程占用 CPU 的百分比, 交换区的使用情况。这些是最常用和基本的指标。

另外常用的普通用户可以使用的监控命令包括 iostat 和 vmstat。 前者报告存储 IO 的使用情况, 而后者主要用于监控内存和 CPU 的使用情况。常常用于系统日常运行状态的信息收集。使用起来很简单, 比如“iostat 3”和 “vmstat 1 10” 等。需要注意 vmstat 的第一行表示的是系统启动以来的统计信息, 在进行实时数据统计和分析的时候需要排除这一行。

识别你当前的 session – 使用变量 "PS1"

如果细心观察,你会发现,不同人使用的命令行界面常常是不同的,即使在同一个系统里边(当然这里不是指 $ 和 #,一个为普通用户在 AIX 下默认的命令提示符,另一个则为超级用户 root 的默认提示符)。你可以看到提供很多有效信息的命令提示符,比如:

 zhudany@Testing1:/home/zhudany/Scripts>

这个提示符里纪录了当前登陆用户 ID 以及登陆的机器的主机名,当前你所在的文件系统路径。在同时使用多个系统的时候,这些信息可以帮助你始终正确鉴别是否在正确的服务器、用户、文件目录下做正确的事情,而不用不时的输入系统命令来查看确认这些信息。

如何配置出这样的提示?很简单,使用如下命令即可:

 PS1=`whoami`'@'`hostname`':$PWD\>'

也就是设置变量 PS1 即可。当这个命令输入后,你当前的命令提示符立即更新为你个性化的模样了。怎么样, 还不试试?

安全的设置系统的关键变量之一 - "PATH"

大量的 UNIX 安全相关的书籍都会建议,“为了安全起见,请使用绝对路径来运行脚本 / 命令。”为什么需要这样?让我们结合一个常见的环境变量 PATH 来揭开谜底。

首先看一个问题,如果给我们两个设置环境变量 PATH 的方法:

选择 1 PATH=/usr/bin:/etc:/usr/sbin:/usr/vac/bin/:/usr/ucb:.

选择 2 PATH=.:/usr/bin:/etc:/usr/sbin:/usr/vac/bin/:/usr/ucb

可以看到,唯一的区别是路径“.”的位置。你会选择哪种呢?也许你会说无所谓。好,让我们来看看其中的差别。

首先我们知道,路径“.”代表当前的工作目录。在揭晓谜底前我们先看个实验。具体步骤如下:

实验的目标很简单,我们希望删除 experiment 目录下的大量的 machineLog 开头的文件:

清单 2. 实验初始环境
 root@Testing1:/experiment>ls -l 
 total 124 
 drwxr-xr-x    2 root     system         8192 Apr 08 16:02 ABB 
 -rw-r--r--    1 root     system            0 Apr 08 16:06 machineLog0.log 
 -rw-r--r--    1 root     system            0 Apr 08 16:06 machineLog1.log 
……
 -rw-r--r--    1 root     system            0 Apr 08 16:07 machineLog106.log 
……
 -rw-r--r--    1 root     system            0 Apr 08 16:06 machineLog209.log 
 -rwxr--r--    1 root     system           30 Apr 08 16:07 rm 
 -rw-r--r--    1 root     system            0 Apr 08 16:13 rm123333d 
 -rw-r--r--    1 root     system            0 Apr 08 16:14 rmddsf 
 -rw-r--r--    1 root     system            0 Apr 08 16:13 rmdfcdt45 
 -rw-r--r--    1 root     system            0 Apr 08 16:14 rmewrksadf 
 -rw-r--r--    1 root     system            0 Mar 26 23:40 t11aoopiupupo5t 
 -rw-r--r--    1 root     system            0 Mar 26 23:41 t123dsfdsaf3t 
 root@Testing1:/experiment>

同时在 /experiment/ABB 目录下,有大量的项目源代码等重要文件,这些是我们绝对不希望丢失的重要文件:

清单 3. 重要文件清单
 root@Testing1:/experiment/ABB>ls -1 
 ProjectAFileA.java 
 ProjectACore.jar 
 ProjectASub1.jar 
……
 ProjectAFileZ.jsp 
 root@Testing1:/experiment/ABB> 

我们当前的 PATH 设置为:
 root@Testing1:/experiment>echo $PATH 
 .:/usr/bin:/etc:/usr/sbin:/usr/vac/bin/:/usr/ucb 
 root@Testing1:/experiment>

也就是采用了“选择 2”。

现在我们输入 AIX 命令 rm 来清理那些 machineLog 开头的文件:

 root@Testing1:/experiment>rm machineLog*.log 
 root@Testing1:/experiment>

命令正常结束,返回到提示符,很好,一切正常。现在看目录下很干净了:

 root@Testing1:/experiment>ls 
 ABB              rm123333d        rmdfcdt45        t11aoopiupupo5t 
 rm               rmddsf           rmewrksadf       t123dsfdsaf3t 
 root@Testing1:/experiment>

实现目标。但是,别高兴太早, 我们再看看那个存放重要文件的目录,

 root@Testing1:/experiment>cd ABB 
 root@Testing1:/experiment/ABB>ls 
 root@Testing1:/experiment/ABB>

什么都没有了!我们最不期望的事情发生了。这是为什么?不要急,让我们仔细观察这个命令的输出:

清单 4. 当前目录文件清单
 root@Testing1:/experiment>ls 
 ABB              rm123333d        rmdfcdt45        t11aoopiupupo5t 
 rm               rmddsf           rmewrksadf       t123dsfdsaf3t 
 root@Testing1:/experiment>

看到了么,在当前目录下,有一个文件就叫做 rm (在大量文件混杂的复杂目录下,很容易忽略它)!看看它的内容:

清单 5. 伪造的 rm 命令内容
 root@Testing1:/experiment>cat rm 
 /usr/bin/rm -rf /experiment/ABB/* 
 /usr/bin/rm $1 
 root@Testing1:/experiment>

原来是它删除了我们重要的文件!它实际是一个经过伪装的 shell 脚本,我们执行的时候没有发现异常,但是它已经偷偷删除了我们的重要文件。

这里只列举了一个简单的例子。实际在系统遭遇恶意的破坏时,脚本里边可能写的是更危险的命令, 或者设置后门等危及系统安全的操作。

由这个例子我们知道,使用绝对路径是多么的重要,它可以防止我们不慎运行了不期望的命令,尤其是使用 root 用户操作的时候更要注意这一点。

另外,这里需要提及的一句是, UNIX 只在当前 shell 的 PATH 变量所设置的路径中搜寻你输入的命令所需要的执行文件。也就是说, 如果 PATH 里边没有’ . ’配置,UNIX 是不会搜寻当前目录下的可执行文件的。

为了操作方便,有时我们不想每次都使用绝对路径来执行命令,而这时又常常需要运行当前目录下的文件,这种情况下,使用“选择 1”也会保险的多!

使用 "history" 命令 , 复用你的输入 !

使用命令行的时候我们常常要输入很多命令,这些命令又经常会需要有很多参数配合,因此有时 AIX 的命令看起来显得很复杂冗长。尤其在调试的时候,常常会输入大量重复的命令。有没有办法可以提高工作效率? 这里解释一个复用历史命令的好方法。

首先介绍一下 AIX 的 shell 环境,默认情况下所有用户都使用 Korn Shell。Korn Shell 会在用户的 HOME 目录下维护一个命令日志文件 .sh_history 。默认情况下这个文件会纪录 128 条用户的历史命令信息。这是个文本文件,我们可以直接用文本工具查看它的内容。

现在看看如何重复使用这些历史命令。首先,AIX 提供了一个定制的别名(alias)命令 history,我们可以用它来查阅这些历史命令:

清单 6. 历史命令样例
 root@Testing1:/experiment>history 
 1220    df -k 
 1221    df -k 
 1222    df -k 
 1223    df -k 
 1224    id 
 1225    pwd 
 1226    history 
 1227    man history 
 1228    find /etc – user root -ls 
 1229    alias 
 1230    man fc 
 1231    which fc 
 1232    man alias 
 1233    man r 
 1234    alias 
 1235    history 
 root@Testing1:/experiment>

也可以在 history 后加参数, 比如 history -128 来查看更多的命令历史。 之后我们采用另外一个定制的别名命令 r 来调用这些历史命令纪录。这里举一个例子, 比如我们要再次使用刚刚输入过的命令 find /etc – user root – ls, 也就是我们需要调用标号为 1228 的历史命令,同时我们又期望这次不再查看用户 root,而是用户 user1 的情况,我们可以这样调用:

 root@Testing1:/experiment>r 1228 root=user1

这样实际上就是输入了历史命令“find /etc – user user1 – ls”。 现在我们知道别名命令 history 和 r 可以通过复用或者修改一处历史命令,来提高我们与系统交互的命令输入速度。如果想修改更多地方呢,有没有解决办法?强大的 shell 环境告诉我们, 可以!

我们还可以使用 set -o vi 来调用编辑器 vi 来直接修改这些历史命令,这样当需要大量修改历史命令的时候我们可以更有效率的工作。输入这个命令后,命令行即激活了编辑模式, 我们可以在需要使用历史命令的时候,敲“Esc”键进入 VI 编辑模式, 使用 VI 的“/”,“?”查找历史命令,使用 VI 的光标移动和编辑命令来修改找到的要修改的目标命令。具体的操作可以参考 VI 的 help 文档,这里不再赘述。

"." 命令 (csh 下则是 "source" 命令 )

做为一种重要的 UNIX 环境,要熟练使用 AIX,我们应该熟悉命令行界面。因此还是需要先介绍一下 shell 环境。

在 AIX 的默认 KSH 环境下,我们使用到的变量有两种类型,环境变量和本地变量。我们可以分别使用命令 env 和 set 来检查这两种变量的设置, 也可以使用 export 命令将本地变量输出为环境变量。

这两种变量的区别是什么?简单来说,本地变量只有当前 shell 可以使用,而环境变量则可以被当前 shell 以及它的子 shell 使用。

这种设置有时会给我们的脚本调试带来一些额外的工作。比如我们会遇到两个问题,而这时也是我们需要使用 source 命令来提高我们工作效率的时候:

1)、当我们调用子脚本的时候,为了传递必须的变量,我们必须调用 export 输出所有的子 shell 用到的变量。在变化的环境中有时这种手工的设置很难做到及时准确。当调试复杂脚本集的时候尤其如此。这时我们可以使用 .(csh 下为 source 命令 ) 命令来调用子脚本。所有的本地变量都可以在子脚本中使用。举个例子:

脚本 test5.sh 的内容为:

清单 7. 脚本 test5.sh
 #test5.sh 
 echo "Trying to print Var1: $Var1"

 zhudany@Testing1:/experiment>Var1="Local variable a"
 zhudany@Testing1:/experiment>./"test5.sh"
 Trying to print Var1: 
 zhudany@Testing1:/experiment>. ./"test5.sh"
 Trying to print Var1: Local variable a 
 zhudany@Testing1:/experiment>

2)、反过来,还有这样一种需求,我们每次使用新的 shell 环境时,需要先设置较多的本地变量,我们也可以将这些变量存入一个脚本文件,每次初始化 shell 环境的时候使用 source 命令调用这个脚本文件既可。一个典型的例子是 .profile 文件。比如做为 DB2 实例用户的 db2inst1 的 .profile 文件可能会有如下几行:

清单 8. 常用的 db2 用户 profile 内容
 if [ -f /home/db2inst1/sqllib/db2profile ]; then 
    . /home/db2inst1/sqllib/db2profile 
 fi

这就是使用 source 命令来引入了环境变量。

最后简单提一句,所谓 source 命令方式执行,其实是 shell 没有 fork 子进程 , 因此所有的变化被记录到当前的 shell 进程。

一些常用命令的技巧

下面介绍一些常用的有益的小技巧: 1)、合并文本文件: 还在用 windows 工具或者 vi 来合并文件么? 介绍一个简单的方法 ,我们可以采用

 cat fileA fileB >fileC

来合并文本文件 , 或者

 cat file?[1-9] >fileSum

来合并大量类似文件名的文件 ;

2)、实时监控日志文件(自动刷新内容,UNIX 流模式的最佳好处!), 命令很简单:

 tail -f FileName

这样既可!

3)、find 命令的力量:

Unix 下大量的实用程序极大的丰富了系统的功能 , 这里简单列举 find 的几个用法:

查询大于 1000 个 block 的文件并列出文件的详细信息;

 find . -size +10000 -exec ls -l {} \;

查询属主为 user1,group 组权限不为 rwx,类型为目录的信息,并生成修改其权限的脚本;

 find /projects -user user1 \( ! -perm -0020 -o ! -perm -0040  -o ! -perm -0010 \) 
 -type d -exec echo "chmod -R g+rwx " {} \; >/tmp/chmoduser1.sh 2>/tmp/error.log

一个好 AIX 命令 - "portmir", 分布环境下的好帮手!

portmir 是一个优秀的 AIX 独有的小工具。使用它我们可以甚至避免使用 Netmeeting 或者其它类似的远程桌面共享工具。我把它称为命令行界面的“桌面共享软件”。 它的使用很简单,十分适于分布环境下的开发团队、系统管理团队协同工作。 下面介绍一下使用的步骤,先假设你的使用环境是, 你的用户 ID 是 dev1,你希望 dev2 用户可以访问、附属(attach)到你的 login 界面,以便你们两个人都可以观察、使用同一个命令行界面, 就如同在同一个机器前 (当然如果你和远程用户使用同一个 ID 的时候共享命令行界面更加简单,但是这在很多开发场景里边可能是不允许的。) - 1)、使用用户 ID dev1 登陆 login 到你项目组里的 AIX 开发系统上, 这个过程在系统中会打开一个 tty 终端设备, 这里假设它是 "pts/1"; (确认自己当前登陆界面的 tty 终端设备, 只需要执行命令“who am i”,注意是 3 个分开的单词,命令 whoami 是不能显示这些信息的。) 2)、在你登陆的 ID 的 $HOME 目录下,创建一个文件 .mir - touch .mir 3)、编辑这个文件,在这个文件里边增加一行,内容就是你希望使用你的命令行界面的用户 ID, 也就是 dev2, 然后保存退出。 4)、配置结束,远程用户在使用 dev2 用户登陆系统,在他自己的命令行界面下, 输入命令“portmir -t pts/1”既可镜像到你的界面了!两个界面下都可以输入命令,输出会被完全一致的打印在两个命令行界面下。这里给一个简单的例子:

图 2.,portmir 命令输出情况系统界面截图
图 2.,portmir 命令输出情况系统界面截图
图 2.,portmir 命令输出情况系统界面截图
从例子里边可以看到,两个屏幕都可以输入命令,同步显示命令的输入以及输出。怎么样,是不是很神奇?尽情享受吧!

调试 shell 脚本

UNIX 的强大还体现在它的 shell 语言功能的强大,并且有十分丰富的系统工具。 在 AIX 下我们经常使用的是系统默认的 Korn Shell。通过 shell 语言我们可以写出十分复杂的脚本来自动化处理大量的系统管理任务甚至应用的业务逻辑。实际开发中,调试这些脚本也是很有必要的。 如何调试呢?这需要用到 shell 的内部命令 set。 我们可以通过在需要调试的脚本程序段前后分别执行 set – x 和 set +x 来打开、关闭 debug 开关。

简单来说打开这个 debug 开关后, shell 在运行脚本时会逐句打印要执行的命令,然后再输出命令执行的结果。通过这个命令我们可以快速定位到 shell 逻辑中存在 bug 或者错误的地方。

解决 "The parameter list is too long"问题

我们都使用 ls 命令来查看文件夹下的文件列表。 但是这个命令并不总是成功。比如常常我们会遇到“The parameter list is too long”的报错。 这是为什么?

这是因为 shell 本身对输入命令行是有长度限制的。比如在 AIX 默认的 K shell 环境下,命令行的最大长度是 6*4096 字节。(参考 sys0 设备的参数 ncargs)。 知道了问题的原因,解决方案也就随之而来了。 那就是, 我们可以修改这个参数(使用 smit chgsys)来增大系统的默认值,但是这需要 root 权限来执行。对于我们大多数的只有普通系统权限的用户, 可以采用减小通配结果的长度或者使用 UNIX 已有的工具来处理。 这里介绍一个常用的命令 xargs-

 find /tmp/ -mtime +7 -print | |xargs -n10 -ti rm {}

通过这个命令,我们可以找到 /tmp 目录下,七天之前修改的文件并且删除掉, 无论找到的文件有多少。

检查文件系统满的错误

我们都知道 UNIX 文件系统是层次结构的。一个路径很深的子目录下面往往可能存在一个很大的文件系统, 比如在 /tmp/tmp1/tmp2/tmp3/tmpx/ 下挂着(mount)一块来自 SAN 存储的大小为 300GB 的文件系统。 如果这个子目录的空间使用在一夜之间突然增加, 甚至让人意外的已经满了,向该子目录写入内容的程序都将报错甚至异常退出。 那么我们如何查找并定位到有问题的文件?也就是突然增大并填满子目录下的这块 300G 的文件系统的罪魁祸首是谁? 刚刚介绍的 find 命令在这里可以大展宏图了,假设这里我们想寻找一夜之内修改、更新过的,大小超过 100MB 的文件, 并且列出最大的十个文件-

 find /tmp -size +204800 -mtime -1 -ls|sort -rnk7|head

这样基本上我们可以立即定位到有问题的文件,并且进行相应的检查和处理。 简单的情况下我们也可以使用 du 命令来快速定位。 才用“du – sk *|sort – nk1”命令我们可以依次找到占用最大空间的子目录、文件, 从而快速定位问题的元凶

一个游戏 - 介绍如何正确使用命令 "ln"

我们一起做个小游戏。 来猜猜这些简单的命令的执行结果:

清单 9. 游戏涉及的命令
 cd /Lib/lab3 
 ln -s /Lib/lab3 abc 
 while true; do cd abc; sleep 1; done

等待 15 秒, 然后取消循环。

运行 pwd 命令,结果会是如何?!猜不到?现在来公布答案吧-

清单 10. pwd 命令输出
 /Lab/lab3/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc

有趣吧?!原来 UNIX 下不光有企业应用,用 script 我们可以写出贪吃蛇游戏, 也可以用来查看“奇迹”!

这个游戏也告诉我们要正确使用 ln命令。尤其是在使用符号链接来连接一个绝对路径的时候。

总结

AIX 是个丰富多彩的世界。本文通过实例由浅入深的介绍了对 AIX 环境下系统的检查(配置,运行情况)、配置(命令提示符,PATH 变量)、使用(history 命令复用,source 命令使用,一些命令技巧,好用的命令 portmir)、排错(调试 shell,解决命令使用报错,文件系统满,以及一个小游戏来介绍 ln 命令可能产生的错误和调整思路)的常用技巧,相信读者在细读本文后, 对 AIX 的使用必将达到一个新的层次。


相关主题

  • P Series and AIX Information Center,从这里 可以了解更多 AIX 相关技术。
  • AIX Commands Reference,可了解更多相关命令使用方法。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=508290
ArticleTitle=一个 UNIX 开发者需要掌握的 AIX 技巧
publish-date=08162010