﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-jinfeng_wang</title><link>http://www.blogjava.net/jinfeng_wang/</link><description>G-G-S,D-D-U!</description><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 10:55:13 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 10:55:13 GMT</pubDate><ttl>60</ttl><item><title>  linux 的库操作命令 ar和nm      </title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/06/08/280748.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Mon, 08 Jun 2009 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/06/08/280748.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/280748.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/06/08/280748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/280748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/280748.html</trackback:ping><description><![CDATA[http://dev.csdn.net/article/69/69405.shtm<br />
http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds1/ar.htm<br />
<span id="ArticleContent1_ArticleContent1_lblContent">&nbsp;
<p>当我们的程序中有经常使用的模块，而且这种模块在其他程序中也会用到，这时按照软件重用的思想，我们应该将它们生成库，使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm，用来对库操作。 </p>
<p><strong>1.ar基本用法<br />
2.nm基本用法命令</strong></p>
<p>　当我们的程序中有经常使用的模块，而且这种模块在其他程序中也会用到，这时按照软件重用的思想，我们应该将它们生成库，使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm，用来对库操作。 </p>
<p><strong>1.ar基本用法</strong></p>
<p>　　ar命令可以用来创建、修改库，也可以从库中提出单个模块。库是一单独的文件，里面包含了按照特定的结构组织起来的其它的一些文件（称做此库文件的member）。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。</p>
<p>　　下面是ar命令的格式：</p>
<p>ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...<br />
</p>
<p>　　例如我们可以用<strong><font color="#ff0000">ar rv libtest.a hello.o hello1.o</font></strong>来生成一个库，库名字是test，链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有&#8216;-'字符，也可以没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项，而[abcfilNoPsSuvV]部分称为任选项。</p>
<p>　　{dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个，它们的含义如下：</p>
<ul>
    <li>d：从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v则列出被删除的每个模块。
    <li>m：该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义)，则成员的位置顺序很重要。如果没有指定任选项，任何指定的成员将移到库的最后。也可以使用'a'，'b'，或'I'任选项移动到指定的位置。
    <li>p：显示库中指定的成员到标准输出。如果指定任选项v，则在输出成员的内容前，将显示成员的名字。如果没有指定成员的名字，所有库中的文件将显示出来。
    <li>q：快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a'，'b'，或'I'任选项对此操作没有影响，模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时，库的符号表没有更新，可以用'ar s'或ranlib来更新库的符号表索引。
    <li>r：在库中插入模块(替换)。当插入的模块名已经在库中存在，则替换同名的模块。如果若干模块中有一个模块在库中不存在，ar显示一个错误消息，并不替换其他同名模块。默认的情况下，新的成员增加在库的结尾处，可以使用其他任选项来改变增加的位置。
    <li>t：显示库的模块表清单。一般只显示模块名。
    <li>x：从库中提取一个成员。如果不指定要提取的模块，则提取库中所有的模块。 </li>
</ul>
<p>　　下面在看看可与操作选项结合使用的任选项：</p>
<ul>
    <li>a：在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a，则应该为命令行中membername参数指定一个已经存在的成员名。
    <li>b：在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b，则应该为命令行中membername参数指定一个已经存在的成员名。
    <li>c：创建一个库。不管库是否存在，都将创建。
    <li>f：在库中截短指定的名字。缺省情况下，文件名的长度是不受限制的，可以使用此参数将文件名截短，以保证与其它系统的兼容。
    <li>i：在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i，则应该为命令行中membername参数指定一个已经存在的成员名(类似任选项b)。
    <li>l：暂未使用
    <li>N：与count参数一起使用，在库中有多个相同的文件名时指定提取或输出的个数。
    <li>o：当提取成员时，保留成员的原始数据。如果不指定该任选项，则提取出的模块的时间将标为提取出的时间。
    <li>P：进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名（这样的库文件不符合POSIX标准），但是有些工具可以。
    <li>s：写入一个目标文件索引到库中，或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。
    <li>S：不创建目标文件索引，这在创建较大的库时能加快时间。
    <li>u：一般说来，命令ar r...插入所有列出的文件到库中，如果你只想插入列出文件中那些比库中同名文件新的文件，就可以使用该任选项。该任选项只用于r操作选项。
    <li>v：该选项用来显示执行操作选项的附加信息。
    <li>V：显示ar的版本。 </li>
</ul>
<p><strong>2.nm基本用法命令</strong></p>
<p>　　nm用来列出目标文件的符号清单。下面是nm命令的格式：</p>
<p>nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle] [-D|--dynamic] [-s|--print-armap][-o|--print-file-name] [-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort] [--size-sort][-u|--undefined-only] [-l|--line-numbers] [--help][--version] [-t radix|--radix=radix][-P|--portability] [-f format|--format=format][--target=bfdname] [objfile...]<br />
</p>
<p>　　如果没有为nm命令指出目标文件，则nm假定目标文件是a.out。下面列出该命令的任选项，大部分支持"-"开头的短格式和"—"开头的长格式。</p>
<ul>
    <li>-A、-o或--print-file-name：在找到的各个符号的名字前加上文件名，而不是在此文件的所有符号前只出现文件名一次。
    <p>例如nm libtest.a的输出如下：</p>
    CPThread.o:<br />
    00000068 T Main__8CPThreadPv<br />
    00000038 T Start__8CPThread<br />
    00000014 T _._8CPThread<br />
    00000000 T __8CPThread<br />
    00000000 ? __FRAME_BEGIN__<br />
    .......................................<br />
    <p>则nm -A 的输出如下：</p>
    libtest.a:CPThread.o:00000068 T Main__8CPThreadPv<br />
    libtest.a:CPThread.o:00000038 T Start__8CPThread<br />
    libtest.a:CPThread.o:00000014 T _._8CPThread<br />
    libtest.a:CPThread.o:00000000 T __8CPThread<br />
    libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__<br />
    ..................................................................<br />
    <li>-a或--debug-syms：显示调试符号。
    <li>-B：等同于--format=bsd，用来兼容MIPS的nm。
    <li>-C或--demangle：将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
    <li>-D或--dynamic：显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
    <li>-f format：使用format格式输出。format可以选取bsd、sysv或posix，该选项在GNU的nm中有用。默认为bsd。
    <li>-g或--extern-only：仅显示外部符号。
    <li>-n、-v或--numeric-sort：按符号对应地址的顺序排序，而非按符号名的字符顺序。
    <li>-p或--no-sort：按目标文件中遇到的符号顺序显示，不排序。
    <li>-P或--portability：使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
    <li>-s或--print-armap：当列出库中成员的符号时，包含索引。索引的内容包含：哪些模块包含哪些名字的映射。
    <li>-r或--reverse-sort：反转排序的顺序(例如，升序变为降序)。
    <li>--size-sort：按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
    <li>-t radix或--radix=radix：使用radix进制显示符号值。radix只能为"d"表示十进制、"o"表示八进制或"x"表示十六进制。
    <li>--target=bfdname：指定一个目标代码的格式，而非使用系统的默认格式。
    <li>-u或--undefined-only：仅显示没有定义的符号(那些外部符号)。
    <li>-l或--line-numbers：对每个符号，使用调试信息来试图找到文件名和行号。对于已定义的符号，查找符号地址的行号。对于未定义符号，查找指向符号重定位入口的行号。如果可以找到行号信息，显示在符号信息之后。
    <li>-V或--version：显示nm的版本号。
    <li>--help：显示nm的任选项。 </li>
</ul>
<p><br />
<br />
<br />
&nbsp;</p>
<h2 id="a0949a5b">ar 命令</h2>
<p><a id="idx111" name="idx111"></a><a id="idx112" name="idx112"></a><a name="a0949a5c"></a></p>
<h3 id="a0949a5c">用途</h3>
<p><a name="eb000d9086mela"></a></p>
<p id="eb000d9086mela">维护链接编辑器使用的索引库。</p>
<p><a name="d720e41316jani"></a></p>
<h3 id="d720e41316jani">语法</h3>
<p><strong>ar</strong> [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#by5zf2d3clif"><strong>-c&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#dy5zf25bclif"><strong>-l&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971130mkm"><strong>-g</strong></a> | <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a1z5zf1b0clif"><strong>-o </strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a0949a6f"><strong>-s&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zz5zf3d8clif"><strong>-v&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#vhsai81kbar"><strong>-C&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zcsai194kbar"><strong>-T&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#minusz"><strong>-z&nbsp;</strong></a>] {&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#y36zf371clif"><strong>-h&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#f46zf2d9clif"><strong>-p&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#k56zf180clif"><strong>-t&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a666zf172clif"><strong>-x&nbsp;</strong></a>} [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971050mkm"><strong>-X&nbsp;</strong> {<strong>32</strong>|<strong>64</strong>|<strong>32_64</strong>|<strong>d64</strong>| <strong>any</strong>}]</a> <em>ArchiveFile</em> [&nbsp;<em>File&nbsp;</em>...&nbsp;]</p>
<p><strong>ar</strong> [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#by5zf2d3clif"><strong>-c&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#dy5zf25bclif"><strong>-l&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971130mkm"><strong>-g</strong></a> | <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a1z5zf1b0clif"><strong>-o</strong></a> ] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a0949a6f"><strong>-s&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zz5zf3d8clif"><strong>-v&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#vhsai81kbar"><strong>-C&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zcsai194kbar"><strong>-T&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#minusz"><strong>-z&nbsp;</strong></a>] {&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a8q5zf5eclif"><strong>-m&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a3d6zf8cclif"><strong>-r&nbsp;</strong></a>[&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a526zf35cclif"><strong>-u&nbsp;</strong></a>]&nbsp;} [&nbsp;{&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a0949a63"><strong>-a&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#azq5zf356clif"><strong>-b&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#ja5zfe6clif"><strong>-i&nbsp;</strong></a>} <em>&nbsp;PositionName&nbsp;</em>&nbsp;] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971050mkm"><strong>-X&nbsp;</strong> {<strong>32</strong>|<strong>64</strong>|<strong>32_64</strong>|<strong>d64</strong>|<strong>any</strong>}]</a> &nbsp; <em>ArchiveFile File</em> ...</p>
<p><strong>ar</strong> [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#by5zf2d3clif"><strong>-c&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#dy5zf25bclif"><strong>-l&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971130mkm"><strong>-g</strong></a> | <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a1z5zf1b0clif"><strong>-o</strong></a> ] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a0949a6f"><strong>-s&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zz5zf3d8clif"><strong>-v&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#vhsai81kbar"><strong>-C&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zcsai194kbar"><strong>-T&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#minusz"><strong>-z&nbsp;</strong></a>] {&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#q36zf38aclif"><strong>-d&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#q46zf96clif"><strong>-q&nbsp;</strong></a>} [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971050mkm"><strong>-X&nbsp;</strong> {<strong>32</strong>|<strong>64</strong>|<strong>32_64</strong>|<strong>d64</strong>|<strong>any</strong>}]</a> <em>ArchiveFile</em><em> File</em> ...</p>
<p><strong>ar</strong> [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#by5zf2d3clif"><strong>-c&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#dy5zf25bclif"><strong>-l&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zz5zf3d8clif"><strong>-v&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#vhsai81kbar"><strong>-C&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#zcsai194kbar"><strong>-T&nbsp;</strong></a>] [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#minusz"><strong>-z&nbsp;</strong></a>] {&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971130mkm"><strong>-g</strong></a> | <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a1z5zf1b0clif"><strong>-o</strong></a> |&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#a0949a6f"><strong>-s&nbsp;</strong></a>|&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#g56zf78clif"><strong>-w&nbsp;</strong></a>} [&nbsp; <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971050mkm"><strong>-X&nbsp;</strong> {<strong>32</strong>|<strong>64</strong>|<strong>32_64</strong>|<strong>d64</strong>|<strong>any</strong>}]</a> <em>ArchiveFile</em></p>
<p><a name="a0949a5f"></a></p>
<h3 id="a0949a5f">描述</h3>
<p><a name="eb000da227mela"></a></p>
<p id="eb000da227mela"><strong>ar</strong> 命令维护链接编辑器使用的索引库。<strong>ar</strong> 命令将一个或多个指定的文件并入单个写成 <strong>ar</strong> 压缩文档格式的压缩文档文件。当 <strong>ar</strong> 命令创建库时，它创建可传输格式的报头；当它创建或更新库时，它重建符号表。有关格式和索引压缩文档和符号表的结构的信息，请参阅 <strong>ar</strong> 文件格式条目。</p>
<p><strong>ar</strong> 命令识别两种文件格式。&#8220;大压缩文档格式&#8221;<a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.files/doc/aixfiles/ar_big.htm#lawsa072497bcl1245"><strong>ar_big</strong></a>，是缺省文件格式并支持 32 位和 64 位目标文件。&#8220;小压缩文档格式&#8221;可用于创建在比 AIX 4.3 更老的版本上可识别的压缩文档，请参阅 <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971130mkm"><strong>-g</strong></a> 标志。如果将一个 64 位的对象添加到小格式压缩文档，除非指定了 <strong>-g</strong>，否则 <strong>ar</strong> 首先将它转换为大格式。缺省情况下，<strong>ar</strong> 仅处理 32 位目标文件；压缩文档中任何 64 位目标文件在没有提示的情况下被忽略。要更改此行为，请使用 <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds1/ar.htm#i0817971050mkm"><strong>-X</strong></a> 标志或设置 <strong>OBJECT_MODE</strong> 环境变量。</p>
<p><a name="a0949a61"></a></p>
<h3 id="a0949a61">标志</h3>
<p><a name="eb000da548mela"></a></p>
<p id="eb000da548mela">在 <strong>ar</strong> 命令中，可以从集 <strong>cClosTv</strong> 中指定任何数量的可选标志。必须从标志集 <strong>dhmopqrstwx</strong> 中指定一个标志。如果选择 <strong>-m</strong> 或 <strong>-r</strong> 标志，您可能还要指定一个位置标志（<strong>-a</strong>、<strong>-b</strong> 或 <strong>-i</strong>）；对于 <strong>-a</strong>、<strong>-b</strong> 或 <strong>-i</strong> 标志，您必须还指定在 <em>ArchiveFile</em>（<em>PositionName</em>）中一个文件的名称，此名称紧跟在标志列表后，并由空格隔开。</p>
<p><a name="wq342"></a>
<table id="wq342" rules="none" width="100%" summary="" border="0" frame="void">
    <tbody valign="top">
        <tr>
            <td width="25%"><a id="a0949a63" name="a0949a63"></a><strong>-a</strong><em> PositionName</em></td>
            <td width="75%">在 <em>PositionName</em> 参数标识的现有文件后安置指定的文件。</td>
        </tr>
        <tr>
            <td><a id="azq5zf356clif" name="azq5zf356clif"></a><strong>-b</strong><em> PositionName</em></td>
            <td>在 <em>PositionName</em> 参数标识的现有文件前安置指定的文件。</td>
        </tr>
        <tr>
            <td><a id="by5zf2d3clif" name="by5zf2d3clif"></a><strong>-c</strong></td>
            <td>禁止在创建<em>库</em>时产生的正常消息。</td>
        </tr>
        <tr>
            <td><a id="vhsai81kbar" name="vhsai81kbar"></a><strong>-C</strong></td>
            <td>阻止解压缩的文件替换文件系统中同名的文件。</td>
        </tr>
        <tr>
            <td><a id="q36zf38aclif" name="q36zf38aclif"></a><strong>-d</strong></td>
            <td>从库中删除指定的文件。</td>
        </tr>
        <tr>
            <td><a id="i0817971130mkm" name="i0817971130mkm"></a><strong>-g</strong></td>
            <td>对压缩文档成员进行排序以确保用最小数量的未用空间获得最大的加载效率。在几乎所有情况下，<strong>-g</strong> 标志以压缩文档成员的逻辑链接顺序物理地安置它们。最终生成的压缩文档通常写成小格式，这样该标志可用来将大格式压缩文档转换成小格式压缩文档。包含 64 位 <strong>XCOFF</strong> 对象的压缩文档不能创建成或转换至小格式。</td>
        </tr>
        <tr>
            <td><a id="y36zf371clif" name="y36zf371clif"></a><strong>-h</strong></td>
            <td>将指定的文件的成员报头中的修改时间设置为当前日期和时间。如果不指定任何文件名称，那么 <strong>ar</strong> 命令设置所有成员报头的时间戳记。此标志不能和 <strong>-z</strong> 标志一起使用。</td>
        </tr>
        <tr>
            <td><a id="ja5zfe6clif" name="ja5zfe6clif"></a><strong>-i</strong><em> PositionName</em></td>
            <td>在 <em>PositionName</em> 参数标识的现有文件前安置指定的文件（和 <strong>-b</strong> 相同）。</td>
        </tr>
        <tr>
            <td><a id="dy5zf25bclif" name="dy5zf25bclif"></a><strong>-l</strong></td>
            <td>将临时文件置于当前（本地）目录中，而非 <strong>TMPDIR</strong> 目录中（缺省为 <strong>/tmp</strong>）。</td>
        </tr>
        <tr>
            <td><a id="a8q5zf5eclif" name="a8q5zf5eclif"></a><strong>-m</strong></td>
            <td>将指定的文件移动到库中的某个其他位置。缺省情况下，它将指定的文件移动到库的末尾。使用位置标志（<strong>abi</strong>）来指定某个其他位置。</td>
        </tr>
        <tr>
            <td><a id="a1z5zf1b0clif" name="a1z5zf1b0clif"></a><strong>-o</strong></td>
            <td>对压缩文档成员进行排序以确保用最小数量的未用空间获得最大的加载效率。在几乎所有情况下，<strong>-o</strong> 标志以压缩文档成员的逻辑链接顺序物理地安置它们。最终生成的压缩文档通常写成大格式，这样该标志可用来将小格式压缩文档转换成大格式压缩文档。</td>
        </tr>
        <tr>
            <td><a id="f46zf2d9clif" name="f46zf2d9clif"></a><strong>-p</strong></td>
            <td>将 <em>Files</em> 参数中指定的文件的内容或在 <em>ArchiveFile</em> 参数中指定的所有文件（如果您不指定任何文件）都写至标准输出。</td>
        </tr>
        <tr>
            <td><a id="q46zf96clif" name="q46zf96clif"></a><strong>-q</strong></td>
            <td>将指定的文件添加到库的末尾。另外，如果指定同一个文件两次，它可能被放入库中两次。</td>
        </tr>
        <tr>
            <td><a id="a3d6zf8cclif" name="a3d6zf8cclif"></a><strong>-r</strong></td>
            <td>如果指定的文件已经存在于库中，那么替换它。因为指定的文件在库中占据它们替换的文件的同一个位置，位置标志没有任何附加的影响。当和 <strong>-u</strong> 标志（更新）一起使用时，<strong>-r</strong> 标志仅替换自从最后一次添加到库中以后修改的文件。
            <p>如果指定的文件不存在于库中，那么 <strong>ar</strong> 命令添加它。在这种情况下，位置标志影响放置。如果不指定位置，那么将新文件置于库的末尾。如果指定同一个文件两次，它可能被放入库中两次。</p>
            </td>
        </tr>
        <tr>
            <td><a id="a0949a6f" name="a0949a6f"></a><strong>-s</strong></td>
            <td>无论<strong> ar</strong> 命令是否修改了库内容都强制重新生成库符号表。请在库上使用 <strong>strip</strong> 命令之后，使用此标志来恢复库符号表。</td>
        </tr>
        <tr>
            <td><a id="k56zf180clif" name="k56zf180clif"></a><strong>-t</strong></td>
            <td>将库的目录写至标准输出。如果指定文件名称，那么仅显示指定的那些文件。如果不指定任何文件，<strong>-t</strong> 标志列出库中的所有文件。</td>
        </tr>
        <tr>
            <td><a id="zcsai194kbar" name="zcsai194kbar"></a><strong>-T</strong></td>
            <td>如果压缩文档成员名称比文件系统支持的长，那么允许文件名称截短。此选项无效，因为文件系统支持的名称长度等于 255 个字符的最大压缩文档成员名称。</td>
        </tr>
        <tr>
            <td><a id="a526zf35cclif" name="a526zf35cclif"></a><strong>-u</strong></td>
            <td>仅复制自它们最后一次复制起更改的文件（请参阅先前讨论过的 <strong>-r</strong> 标志）。</td>
        </tr>
        <tr>
            <td><a id="zz5zf3d8clif" name="zz5zf3d8clif"></a><strong>-v</strong></td>
            <td>将建立新库的详细的逐个文件的描述写至标准输出。当和 <strong>-t</strong> 标志一起使用时，它给出类似于 <strong>ls -l</strong> 命令给出的长列表。当和 <strong>-x</strong> 标志一起使用时，它在每个文件前加一个名称。当和 <strong>-h</strong> 标志一起使用，它列出成员名称和更新的修改时间。</td>
        </tr>
        <tr>
            <td><a id="g56zf78clif" name="g56zf78clif"></a><strong>-w</strong></td>
            <td>显示压缩文档符号表。每个符号和其中定义此符号的文件的名称一起列出。</td>
        </tr>
        <tr>
            <td><a id="a666zf172clif" name="a666zf172clif"></a><strong>-x</strong></td>
            <td>通过将指定的文件复制到当前目录来解压缩它们。这些副本和原始文件（保留在库中）具有相同的名称。如果不指定任何文件，<strong>-x</strong> 标志复制库中的所有文件。此过程不会更改库。</td>
        </tr>
        <tr>
            <td><a id="i0817971050mkm" name="i0817971050mkm"></a><strong>-X</strong><em> mode</em></td>
            <td>指定 <strong>ar</strong> 应检查的目标文件的类型。<em>mode</em> 必须是下列其中一项：
            <dl>
            <dt class="bold"><strong>32</strong>
            <dd>仅处理 32 位目标文件
            <dt class="bold"><strong>64</strong>
            <dd>仅处理 64 位目标文件
            <dt class="bold"><strong>32_64</strong>
            <dd>处理 32 位 和 64 位目标文件
            <dt class="bold">d64
            <dd>检测已终止的 64 位 XCOFF 文件（幻数 == U803XTOCMAGIC）。
            <dt class="bold">any
            <dd>处理所有受支持的对象文件。 </dd></dl>缺省值是处理 32 位目标文件（忽略 64 位对象）。<em>mode</em> 还可以用 <strong>OBJECT_MODE</strong> 环境变量来设置。例如，<strong>OBJECT_MODE=64</strong> 使 <strong>ar</strong> 处理任何 64 位对象并忽略 32 位对象。<strong>-X</strong> 标志覆盖 <strong>OBJECT_MODE</strong> 变量。</td>
        </tr>
        <tr>
            <td><a id="minusz" name="minusz"></a><strong>-z</strong></td>
            <td>创建压缩文档的临时副本并对副本执行所有要求的修改。当所有操作成功完成时，压缩文档的工作副本覆盖原始副本。此标志不能和 <strong>-h</strong> 标志一起使用。</td>
        </tr>
        <tr>
            <td><a id="w66zf235clif" name="w66zf235clif"></a><em>ArchiveFile</em></td>
            <td>指定压缩文档文件名称；必需。</td>
        </tr>
        <tr>
            <td><a id="d720e43683jani" name="d720e43683jani"></a><em>MemberName ...</em></td>
            <td>各压缩文档成员的名称。</td>
        </tr>
    </tbody>
</table>
<a name="aaf8f7b553lyn"></a></p>
<h3 id="aaf8f7b553lyn">退出状态</h3>
<p><a name="eb000de534mela"></a></p>
<p id="eb000de534mela">该命令返回以下退出值：</p>
<p><a name="wq343"></a>
<table id="wq343" rules="none" width="100%" summary="" border="0" frame="void">
    <tbody valign="top">
        <tr>
            <td width="5%"><a id="bf2b7b5198joy" name="bf2b7b5198joy"></a><strong>0</strong></td>
            <td width="95%">成功完成。</td>
        </tr>
        <tr>
            <td><a id="bf2b7b5269joy" name="bf2b7b5269joy"></a><strong>&gt;0</strong></td>
            <td>发生错误。</td>
        </tr>
    </tbody>
</table>
<a name="a0949a76"></a></p>
<h3 id="a0949a76">示例</h3>
<ol type="1">
    <li><a name="a0949a77"></a>要创建一个库，请输入：
    <p>&nbsp;</p>
    <a name="a0949a78"></a>
    <pre class="xmp" id="a0949a78">ar -v -q lib.a strlen.o strcpy.o</pre>
    <p class="indatacontent">如果 <tt>lib.a</tt> 库不存在，那么此命令创建它，并将文件 <tt>strlen.o</tt> 和 <tt>strcpy.o</tt> 的副本输入其中。如果 <tt>lib.a</tt> 库存在，那么此命令在不检查相同成员的情况下，将新的成员添加到末尾。<strong>v</strong> 标志设置详细方式，在此方式中 <strong>ar</strong> 命令在其进行时显示进程报告。</p>
    <li><a name="a0949a7a"></a>要显示库的目录，请输入：
    <p>&nbsp;</p>
    <a name="a0949a7b"></a>
    <pre class="xmp" id="a0949a7b">ar -v -t lib.a</pre>
    <p class="indatacontent">此命令列出了 <tt>lib.a</tt> 库的目录，显示类似于 <strong>ls -l</strong> 命令的输出的长列表。要只列出成员文件名称，那么省略 <strong>-v</strong> 标志。</p>
    <li><a name="a0949a7d"></a>要替换或添加新成员到库中，请输入：
    <p>&nbsp;</p>
    <a name="a0949a7e"></a>
    <pre class="xmp" id="a0949a7e">ar -v -r lib.a strlen.o strcat.o</pre>
    <p class="indatacontent">此命令替换成员 <tt>strlen.o</tt> 和 <tt>strcat.o</tt>。如果 <tt>lib.a</tt> 如示例 1 中显示的那样创建，那么替换 <tt>strlen.o</tt> 成员。因为不存在名为 <tt>strcat.o</tt> 的成员，所以它被添加到库的末尾。</p>
    <li><a name="a0949a80"></a>要指定在何处插入新成员，请输入：
    <p>&nbsp;</p>
    <a name="a0949a81"></a>
    <pre class="xmp" id="a0949a81">ar -v -r -b strlen.o lib.a strcmp.o</pre>
    <p class="indatacontent">此命令添加 <tt>strcmp.o</tt> 文件，并将该新成员置于 <tt>strlen.o</tt> 成员之前。</p>
    <li><a name="a0949a83"></a>要更新一个已经更改过的成员，请输入：
    <p>&nbsp;</p>
    <a name="a0949a84"></a>
    <pre class="xmp" id="a0949a84">ar -v -r -u lib.a strcpy.o</pre>
    <p class="indatacontent">此命令替换现有 <tt>strcpy.o</tt> 成员，但仅当文件 <tt>strcpy.o</tt> 自从最后一次添加到库后已经修改时才替换它。</p>
    <li><a name="a0949a86"></a>要更改库成员的顺序，请输入：
    <p>&nbsp;</p>
    <a name="a0949a87"></a>
    <pre class="xmp" id="a0949a87">ar -v -m -a strcmp.o lib.a strcat.o strcpy.o</pre>
    <p class="indatacontent">此命令将成员 <tt>strcat.o</tt> 和 <tt>strcpy.o</tt> 移动到紧跟在 <tt>strcmp.o </tt>成员之后的位置。保留 <tt>strcat.o</tt> 和 <tt>strcpy.o</tt> 成员的相对顺序。换句话说，如果在移动之前 <tt>strcpy.o</tt> 成员在 <tt>strcat.o</tt> 成员之前，那么（移动后）它依旧如此。</p>
    <li><a name="a0949a89"></a>要解压缩库成员，请输入：
    <p>&nbsp;</p>
    <a name="a0949a8a"></a>
    <pre class="xmp" id="a0949a8a">ar -v -x lib.a strcat.o strcpy.o</pre>
    <p class="indatacontent">此命令将成员 <tt>strcat.o</tt> 和 <tt>strcpy.o</tt> 分别复制到名为 <tt>strcat.o</tt> 和 <tt>strcpy.o</tt> 的文件。</p>
    <li><a name="a0949a8c"></a>要解压缩并重命名一个成员，请输入：
    <p>&nbsp;</p>
    <a name="a0949a8d"></a>
    <pre class="xmp" id="a0949a8d">ar -p lib.a strcpy.o &gt;stringcopy.o</pre>
    <p class="indatacontent">此命令将成员 <tt>strcpy.o</tt> 复制到一个名为 <tt>stringcopy.o</tt> 的文件。</p>
    <li><a name="a0949a8f"></a>要删除一个成员，请输入：
    <p>&nbsp;</p>
    <a name="a0949a90"></a>
    <pre class="xmp" id="a0949a90">ar -v -d lib.a strlen.o</pre>
    <p class="indatacontent">此命令从 <tt>lib.a</tt> 库中删除成员 <tt>strlen.o</tt>。</p>
    <li><a name="a0949a58"></a>要从多个用 <a href="http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.cmds/doc/aixcmds3/ld.htm"><strong>ld</strong></a> 命令创建的共享模块中创建一个压缩文档库，请输入：
    <p>&nbsp;</p>
    <a name="a144c1689"></a>
    <pre class="xmp" id="a144c1689">ar -r -v libshr.a shrsub.o shrsub2.o&nbsp;shrsub3.o&nbsp;...</pre>
    <p class="indatacontent">此命令从名为 <tt>shrsub.o</tt>、<tt>shrsub2.o</tt>、<tt>shrsub3.o</tt> 等等的共享模块中创建名为 <tt>libshr.a</tt> 的压缩文档库。要编译并链接使用 <tt>libshr.a</tt> 压缩文档库的 <tt>main</tt> 程序，请使用以下命令：</p>
    <a name="a144c168c"></a>
    <pre class="xmp" id="a144c168c">cc -o&nbsp;main&nbsp;main.c&nbsp;-L/u/sharedlib&nbsp;-lshr</pre>
    <p class="indatacontent"><tt>main</tt> 程序现在是可执行的。<tt>main</tt> 程序引用的任何符号（包含在<tt>libshr.a</tt> 压缩文档库中）已经因延迟分辨率而作了标记。<strong>-l</strong> 标志指定应在 <tt>libshr.a</tt> 库中搜索这些符号。</p>
    <li>要列出 <strong>lib.a</strong> 的内容（忽略任何 32 位目标文件），请输入：
    <p>&nbsp;</p>
    <pre class="xmp">ar -X64 -t -v lib.a</pre>
    <li>要从 <strong>lib.a</strong> 解压缩所有 32 位的目标文件，请输入：
    <p>&nbsp;</p>
    <pre class="xmp">ar -X32 -x lib.a</pre>
    <li>要列出 <strong>lib.a</strong> 中的所有文件，无论是 32 位、64 位或非对象，请输入：
    <p>&nbsp;</p>
    <pre class="xmp">ar -X32_64 -t -v lib.a</pre>
    </li>
</ol>
<p><a name="a0949a92"></a></p>
<h3 id="a0949a92">文件</h3>
<p>&nbsp;</p>
<p><a name="wq345"></a>
<table id="wq345" rules="none" width="100%" summary="" border="0" frame="void">
    <tbody valign="top">
        <tr>
            <td width="13%"><a id="a0949a93" name="a0949a93"></a><strong>/tmp/ar*</strong></td>
            <td width="86%">包含临时文件。</td>
        </tr>
    </tbody>
</table>
</p>
</span>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/280748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-06-08 21:57 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/06/08/280748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TUXEDO超时控制全功略 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278089.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278089.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/278089.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/278089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/278089.html</trackback:ping><description><![CDATA[http://kimva.blogbus.com/logs/10795776.html<br />
http://kimva.blogbus.com/logs/10795836.html<br />
<br />
<p>摘要：<br />
　　本《功略》集中了TUXEDO应用中，可能涉及到的所有时间参数，并分别对其进行详细描述，不但对其出处、取值等基本属性进行查证，而且，通过分析其内在的控制机制，给出设置建议，以期能够达到透彻理解、方便查阅、准确使用的目的。</p>
<p>1 前言<br />
　　金融、电信等众多行业的综合营业系统中，广泛使用了TUXEDO交易中间件，用来处理大量并发的联机事务处理（OLTP）业务。典型的OLTP业务，每笔业务的信息量较小，而且，具有一定的实时性，对时间的要求非常严格。</p>
<p>　　TUXEDO，联系着DATABASE和客户端软件，凭借其多层次的超时控制机制，达到客户端快速响应，服务器端稳定可靠的效果。</p>
<p>　　TUXEDO的多层次的超时控制机制中，涉及到的时间参数不少于10个，再加上与之紧密联系的DATABASE中的几个超时参数，确实比较复杂。遗憾的是，目前还没有的专门的文档对它们进行详细说明，而是分散在不同的专题中分别说明，而且，不同的专题中，解释的详细程度也不一样，在查阅过程中，多有不便。</p>
<p>　　本文试图将这些参数集中起来，对每一个都加以详细说明，并试图解释每个参数存在的原因。大部分参数时间长短的设置，除个别外，基本没有固定的模式，只要了解它们的具体含义，并结合具体应用系统的实际要求，相信大家都能够作出合理的配置。</p>
<p>2 全功略解读<br />
2.1 SCANUNIT<br />
2.1.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; RESOURCES -&gt; SCANUNIT 。</p>
<p>2.1.2 时间单位<br />
　　秒,且必须为5的倍数。</p>
<p>2.1.3 取值范围<br />
　　大于0小于等于60中5的倍数，即｛5，10，15，20，25，30，35，40，45，50，55，60｝。</p>
<p>2.1.4 默认取值<br />
　　10 。</p>
<p>2.1.5 用途解释 ⑴<br />
　　这个参数大家都会用，比较好理解，TUXEDO中，BBL是用来对Bulletin Board进行管理和监控的系统进程，它基于时间片的轮询方式，时间片的大小就是SCANUNIT的值，SCANUNIT是Tuxedo对系统进行管理的最基本时间单位。每隔SCANUNIT，BBL对Bulletin Board进行一次检查，看看有没有超时的事务或阻塞的服务请求。后面讲到的很多时间参数都是以SCANUNIT为单位。</p>
<p>2.1.6 超时后果<br />
　　仅仅是个轮询时间单位而已，到时间就轮询，如此而已。</p>
<p>2.1.7 设置考虑<br />
　　作为一个涉及到整个TUXDO系统的基本单位时间，如果业务需要，对时间参数控制比较严格，设置为5也不算小。如果系统业务对时间要求不严格，那就大点儿，60也没什么不可以；毕竟频繁轮询是要耗费更多系统资源的，而任何对资源的不必要的消耗都是浪费。</p>
<p>2.2 SANITYSCAN<br />
2.2.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; RESOURCES -&gt; SANITYSCAN 。</p>
<p>2.2.2 时间单位<br />
　　SCANUNIT 。</p>
<p>2.2.3 取值范围<br />
　　1 ～32767 。</p>
<p>2.2.4 默认取值<br />
　　大约120/SCANUNIT。</p>
<p>2.2.5 用途解释 ⑵<br />
　　进行系统健全性检查，主要包括Server进程状态和Bulletin Board数据结构，检查Server进程是否存活，如果已经不存在，会清理Bulletin Board中相应的数据项及IPC资源，并根据参数配置决定是否重新启动，如果设了RESTART=Y，所占的Message Queue不会被清除，Queue中的Request得到保留，仍会被处理。如果是MP模式，BBL还会给DBBL发状态消息。</p>
<p>2.2.6 超时后果<br />
　　仅仅是个系统健康检查的间隔时间而已，到时间就检查，如此而已。</p>
<p>2.2.7 设置考虑<br />
　　作为一个涉及到整个TUXDO系统健康检查的间隔时间，如果系统处在一个稳定的运行环境中，网络、数据库、应用都很稳定，那这个参数可以大一些；如果运行环境不稳定，系统繁忙，而且Server进程经常因异常（如超时）而死掉，那就设置小一些。设置的原则和SCANUNIT一样：不要随意浪费系统资源。</p>
<p>2.3 BBLQUERY<br />
2.3.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; RESOURCES -&gt; BBLQUERY。</p>
<p>2.3.2 时间单位<br />
　　SCANUNIT</p>
<p>2.3.3 取值范围 ⑶<br />
　　BBLQUERY必须大于等于SANITYSCAN，tmloadcf 时会强制检查，如果设的值小于SANITYSCAN，tmloadcf会自动调整为SANITYSCAN。</p>
<p>2.3.4 默认取值<br />
　　大约300/SCANUNIT。</p>
<p>2.3.5 用途解释 ⑷<br />
　　BBL检查，在MP模式下，BBL会每隔一段时间都发送了" I am ok "心跳信息给DBBL，这个间隔就是BBLQUERY。</p>
<p>2.3.6 超时后果 ⑸<br />
　　如果DBBL在规定时间间隔内没有收到某个BBL的信息，DBBL它会主动发送Request给那个BBL，判断其是否正常。（如果等了DBBLWAIT后仍然没有回复，DBBL会认为那台机器有问题，然后，将其隔离。）</p>
<p>2.3.7 设置考虑<br />
　　此设置仅仅在MP模式下才起作用。</p>
<p>　　在MP模式下，如果TUXEDO系统需要对不稳定的运行环境可能发生的故障作出快速的反应，那么BBLQUERY要设置小一些，让系统快速的自我检查。考虑网络传输时间、系统反应速度等因素，网络速度越慢，系统负载越重，取值越大；反之亦然。</p>
<p>　　如果系统运行环境很稳定，利用其默认值即可，甚至可以更大数值。</p>
<p>2.4 DBBLWAIT<br />
2.4.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; RESOURCES -&gt; DBBLWAIT。</p>
<p>2.4.2 时间单位<br />
　　SCANUNIT。</p>
<p>2.4.3 取值范围<br />
　　大于0。</p>
<p>2.4.4 默认取值<br />
　　1和20/SCANUNIT中的较大者 。</p>
<p>2.4.5 用途解释 ⑹<br />
　　如果DBBL在规定时间间隔BBLQUERY内没有收到某个BBL的"I AM OK"信息，它会发Request给那个BBL，其等待回复的时间就是DBBLWAIT。</p>
<p>2.4.6 超时后果 ⑺<br />
　　DBBL等了DBBLWAIT后仍然没有回复，DBBL会认为相关BBL的机器有问题，然后，将其隔离（partation）。</p>
<p>2.4.7 设置考虑<br />
　　此设置仅仅在MP模式下才起作用。</p>
<p>　　在MP模式下，考虑网络传输时间、系统反应速度等因素，网络速率越大，系统负载越轻，此数值越小；反之亦然。</p>
<p>2.5 BLOCKTIME<br />
2.5.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; RESOURCES -&gt; BLOCKTIME。</p>
<p>2.5.2 时间单位<br />
　　SCANUNIT。</p>
<p>2.5.3 取值范围<br />
　　大于0。</p>
<p>2.5.4 默认取值<br />
　　大约60/SCANUNIT。</p>
<p>2.5.5 用途解释<br />
　　Client端阻塞请求（Blocking call）服务的超时值，BBL发现有超时的Request时，会给相应的Client端发超时信息。</p>
<p>　　此参数仅仅在"阻塞请求"的情况下起作用，因此，理解它，关键要理解什么是阻塞请求（Blocking call）？习惯上，我们将"阻塞请求"理解为"同步请求"，将"异步请求"理解为"非阻塞请求"，是源于将"&lt;发送请求－得到结果&gt;"这一过程看成为一个整体。如果是整体的同步操作，就认为是"阻塞请求"；如果是分开异步的操作，就认为是"非阻塞请求"。</p>
<p>　　其实，异步操作中，同样存在"阻塞请求"，tuxedo中，tpacall和tpgetrply这两个异步操作各自本身就是"阻塞请求"，tpacall是将请求发送到请求队列，tpgetrply是将从结果队列中取出结果，如果没有特殊的设置，这两个操作本身都是阻塞的，BLOCKTIME将起作用。</p>
<p>　　以Request/Reply方式为例，将成功发送请求的时长设置为T1，将请求处理的时长(含排队等待)设置为T2,将成功取得结果的时长设置为T3，那么在下面不同的情况下，将触发BLOCKTIME，引起超时：</p>
<p>　　（1） tpcall（）不在transaction中，flag为0，当T1+T2+T3 &gt; BLOCKTIME时，发生超时 ;</p>
<p>　　（2） tpcall（）不在transaction中，flag为TPNOBLOCK，只有当一次调用即成功完成T1阶段发送请求的任务后，T2+T3 &gt; BLOCKTIME时，发生超时 ; </p>
<p>　　（3） tpacall（）不在transaction中，flag为0，当T1 &gt; BLOCKTIME时，发生超时 ;</p>
<p>　　（4） tpgetrply（）不在transaction中，flag为0，当T2+T3 &gt; BLOCKTIME时，发生超时 ;</p>
<p>　　（5） tpcall，tpacall,tpgetrply,在其他任何情况，BLOCKTIME都将不起作用。</p>
<p>　　（6） 如果请求处于事务交易（transaction）中，此参数不起作用，取代它的是 TransactionTimeOut。</p>
<p>2.5.6 超时后果<br />
　　在上面描述的四种情况下，Server端 BBL返回Client端超时错误：tperrno ＝ 13 （TPETIME）。同时，client端和Server端已经建立的联接不受任何影响，继续保持联接。</p>
<p>2.5.7 设置考虑<br />
　　此参数涉及整个TUXEDO系统，不能够直接适应业务系统中不同场合的不同时间等待要求，而且在应用过程中，存在误差，不适合进行精确到秒的时间控制。</p>
<p>　　准确有效的使用这个参数，需要考虑好以下几个问题： </p>
<p>　　（1） 应用中是否完全依赖这个参数进行时间控制？</p>
<p>　　（2） 有哪些业务依赖这个参数进行时间控制？</p>
<p>　　（3） 平衡各种业务，此参数设置为多少？</p>
<p>　　（4） 除此参数外，是否需要利用其他的超时控制机制？</p>
<p>2.6 WSL CLOPT [-T Client_timeout]<br />
2.6.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; SERVERS -&gt; WSL -&gt; CLOPT "-T"。</p>
<p>2.*** 默认取值<br />
　　0 ，意味着无限等待时间。</p>
<p>2.6.5 用途解释 ⑻<br />
　　系统允许的Client静默时长，即Client和WSH建立联接后，如果在此指定的时间内客户端没有发送任何请求，WSH会自动回收与此Client端相关的资源。</p>
<p>2.6.6 超时后果 ⑼<br />
　　WSH会自动释放和这个Client端的联接，并将此Client在Bulletin Board中的数据项清空，RollBack它未完成的事务 。</p>
<p>2.6.7 设置考虑<br />
　　此参数的设置目的，主要是从Server的角度进行考虑，防止在Client端意外失效的情况下仍然耗费Server端的资源。</p>
<p>　　如果设置太小，那么频繁的检测同样要消耗Server端一定的资源，而且，在使用长联接的系统中，系统空闲时，容易造成已经建立的长联接频繁的释放，影响正常业务的提供。</p>
<p>　　如果设置为0，不管发生什么状况，哪怕是Client端系统真的崩溃了，也不会触发此超时，这将造成Server端资源的无谓浪费。</p>
<p>　　建议：在业务负载不均衡的长联接业务系统中，根据业务实际空闲时间，适当加大此数值。</p>
<p>2.7 WSL CLOPT [-t timeout]<br />
2.7.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; SERVERS -&gt; WSL -&gt; CLOPT "-t"。</p>
<p>2.7.2 时间单位<br />
　　SCANUNIT。</p>
<p>2.7.3 取值范围<br />
　　大于0。</p>
<p>2.7.4 默认取值<br />
　　非安全应用为3，安全应用为6 。</p>
<p>2.7.5 用途解释<br />
　　建立联接时长，指workstation Client建立与server端WSH建立联接允许的最长时间，因为非安全应用建立联接时不需要进行用户校验等步骤，因此，建立联接需要的时间较短。同理，安全应用需要的时间较长。</p>
<p>2.7.6 超时后果<br />
　　建立联接失败。</p>
<p>2.7.7 设置考虑<br />
　　设置此参数，要分析业务系统中，网络带宽因素、用户验证的复杂程度等。<br />
<br />
<br />
</p>
<p>2.8 WSL CLOPT [-I init_timeout]<br />
2.8.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; SERVERS -&gt; WSL -&gt; CLOPT "-I"。</p>
<p>2.8.2 时间单位<br />
　　秒。</p>
<p>2.8.3 取值范围<br />
　　大于0。</p>
<p>2.8.4 默认取值<br />
　　60 。</p>
<p>2.8.5 用途解释 ⑽<br />
　　WorkStation Client端和后台建立联接的超时参数值。</p>
<p>　　（注：感觉上此参数和 WSL CLOPT [-t timeout]功能类似）</p>
<p>2.8.6 超时后果<br />
　　不确定，现有的文档没有一点儿解释。按照字面解释，应该是tpinit的超时时间，但是，在tpinit所有的错误中，只有TPESYSTEM可能承担这个超时后果，而且仅仅是可能。</p>
<p>2.8.7 设置考虑<br />
　　在使用过程中，没有感觉到这个参数的存在，也从来没有专门设置过。</p>
<p>2.9 WSL CLOPT [-N network_timeout]<br />
2.9.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; SERVERS -&gt; WSL -&gt; CLOPT "-N"。</p>
<p>2.9.2 时间单位<br />
　　秒。</p>
<p>2.9.3 取值范围<br />
　　大于等于0。</p>
<p>2.9.4 默认取值<br />
　　0 。</p>
<p>2.9.5 用途解释<br />
　　网络超时，指Workstation client利用网络接收数据（receive data）的等待时间。</p>
<p>　　我们同样需要分析触发Network Timeout的不同条件。</p>
<p>　　以Request/Reply方式中的tpcall为例，将成功发送请求的时长设置为T1，将请求处理的时长(含排队等待)设置为T2,将成功取得结果的时长设置为T3，那么在如下情况下，将触发Network Timeout，引起超时：</p>
<p>　　（1） tpcall（）不在transaction中，flag为0，当 BLOCKTIME&gt; T1+T2+T3 &gt; NetworkTimeout时，触发此超时 ;</p>
<p>　　（2） tpcall（） 在transaction中，flag为0，当TranactionTimeout&gt; TI+T2+T3 &gt; NetworkTimeout时，触发此超时 ;</p>
<p>　　（3） tpcall（）不在transaction中，flag为TPNOBLOCK，只有当一次调用即成功完成T1阶段发送请求的任务后，当 BLOCKTIME&gt; T2+T3 &gt; NetworkTimeout时，触发此超时 ;</p>
<p>　　（4） tpcall（）在transaction中，flag为TPNOBLOCK，只有当一次调用即成功完成T1阶段发送请求的任务后，当 TranactionTimeout&gt; T2+T3 &gt; NetworkTimeout时，触发此超时 ;</p>
<p>　　（5） tpcall（）不在transaction中，flag为TPNOTIME，当 T1+T2+T3 &gt; NetworkTimeout时，触发此超时 ;</p>
<p>　　（6） tpcall（）在transaction中，flag为TPNOTIME，当 TranactionTimeout&gt; TI+T2+T3 &gt; NetworkTimeout时，触发此超时 ;</p>
<p>　　（7） tpcall在其他任何情况，NetworkTimeout都将不起作用。</p>
<p>　　（8） 同理，可以确定NetworkTimeout在tpacall和tpgetrply中起的作用。</p>
<p>2.9.6 超时后果<br />
　　在上面描述的六种情况下， Client端操作失败，同时，client端断开与Server端已经建立的联接。Server端已经为此Client完成的操作和分配的资源不能立刻回滚和释放，Server端需要等待前面介绍过的Client_timeout时间后，再释放相关的资源。</p>
<p>2.9.7 设置考虑<br />
　　此参数的设置目的，主要是从Client的角度进行考虑，防止在Server端意外失效的情况下，仍然消耗Client端的资源。</p>
<p>　　设置参数，必须避免小于BLOCKTIME或TransactionTimeout的情况，因为在这种情况下，会出现业务正常等待中，联接却中断的现象，这是一定要避免的。</p>
<p>　　同时，由于此超时触发的联接中断，并不能立刻释放Server端的资源，带来业务执行过程中的不确定性，因此，此参数要谨慎使用。</p>
<p>2.10 SVCTIMOUT<br />
2.10.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; SERVICES -&gt; SVCTIMEOUT 。</p>
<p>2.10.2 时间单位<br />
　　秒</p>
<p>2.10.3 取值范围<br />
　　大于等于0。</p>
<p>2.10.4 默认取值 <br />
　　0，表示无限时长 。</p>
<p>2.10.5 用途解释<br />
　　服务处理时长（Service Processing Time），表示系统允许服务处理请求的时间长度。</p>
<p>　　此参数主要是维护Server端系统安全的角度，防止由于系统异常引起的失控服务占据系统资源，阻碍正常的后续业务请求。它起到了一个清道夫的作用，将不能有效提供服务的Services清除出系统，并依靠系统的其他机制，重新产生具有活力的Services。</p>
<p>2.10.6 超时后果<br />
　　超时后，此Service所属的Server将被系统的SIGKILL信号清除；此操作不会影响与此Server相关的其他正在运行的副本Servers。</p>
<p>　　如果系统设置SERVERS-&gt;RESTART=Y，那么，被清除的Server将立刻自动重新启动。重新启动的次数受随后介绍的MAXGEN和GRACE两个参数联合限制。</p>
<p>　　如果系统设置SERVERS-&gt;RCMD为有效命令文件，那么，在重启此Server时，将同时执行此命令，如向管理员发送通知邮件等。</p>
<p>　　如果SERVER没有RESTART＝Y设置，那么Server将不会自动重新启动。</p>
<p>2.10.7 设置考虑<br />
　　此参数不是系统全局参数，而是涉及到单个Service，可以根据不同的Service的处理时间进行设置。由于其主要起到系统清道夫的角色，因此，建议设置为正常Service处理时长的3倍较合适，以避免清除正常运行的Service，使正常运行的业务受到影响。</p>
<p>　　如果系统运行环境基本稳定，一旦出现底层网络或数据库系统故障，不是在短时间内能够恢复，建议将此参数增大，至少为平均恢复时间，甚至可以利用默认值0，无限等待，避免此自动机制，而用人工介入的方法进行服务恢复。因为系统自动的、频繁的SIGKILL将影响到整个TUXEDO系统的稳定。</p>
<p>2.11 GRACE<br />
2.11.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; SERVERS -&gt; GRACE 。</p>
<p>2.11.2 时间单位<br />
　　秒。</p>
<p>2.11.3 取值范围<br />
　　0-2147,483,647。</p>
<p>2.11.4 默认取值<br />
　　86400（24小时）。</p>
<p>2.11.5 用途解释<br />
　　此时间参数与其他两个参数紧密相关RESTART, MAXGEN。</p>
<p>　　关联起来解释就是，当Server异常终止时，如果RESTART=Y，那么此SERVER可立即自动重新启动，这个重新启动的次数被限制为在GRACE指定的时间间隔内，重启不超过MAXGEN-1 次。</p>
<p>　　如果RESTART这个参数为N，其他的相关参数将都无效。</p>
<p>2.11.6 超时后果<br />
　　此参数不仅仅是时间的限制，如果在GRACE时间段内，此SERVER重启次数已经达到MAXGEN-1，后续重启将不能执行。</p>
<p>2.11.7 设置考虑<br />
　　此组参数设置的综合目的是避免运行Server无限的重启，重启次数说明了系统目前异常状况的严重程度，如果在一定时间内，Server重启次数达到了一定的数量，说明这个Server相关的资源已经出现较严重的故障，需要人工进行干预了。</p>
<p>　　另外，经过调优的生产系统是不需要自动重启的，因此，RESTART这个参数更多是应用在系统测试版本中，在正常运行的生产系统中，应该有不同参数设置，谨慎使用，因为过多的重启将有可能严重影响Server端的整体稳定性。</p>
<p>2.12 Transaction TimeOut<br />
2.12.1 参数出处<br />
　　tpbegin(timeout,0)。</p>
<p>2.12.2 时间单位<br />
　　秒,且必须为SCANUINT的倍数。</p>
<p>2.12.3 取值范围<br />
　　大于等于0。</p>
<p>2.12.4 默认取值<br />
　　无，使用时必须明确指定。</p>
<p>2.12.5 用途解释<br />
　　交易时长，确定交易（transaction）的持续时间，如果超过此时间，系统将返回超时错误。</p>
<p>　　分析其触发条件，分两种情况：</p>
<p>　　（1） Server端发起交易，</p>
<p>　　对Client而言，因为Client不在交易范围内，即使BLOCKTIME设置小于此参数，起有效作用的仍然将是BLOCKTIME，而不是此参数。</p>
<p>　　（2） Client端发起交易。</p>
<p>　　对Client而言，因为Client在交易范围内，此时，BLOCKTIME将失效，此参数取而代之。只要处理时间超过此参数，将触发此超时，交易处理将随时中断。</p>
<p>2.12.6 超时后果<br />
　　相关交易将被标识为abort only。注意，仅仅是标识为abort only，而不是系统自动执行tpabort进行交易恢复。随后必须主动执行tpabort，恢复交易，保障交易完整性。如果没有执行tpabort，系统将通过其他机制，恢复交易，保障交易完整性。</p>
<p>2.12.7 设置考虑<br />
　　此参数的主要目的是将交易处理过程限制在合理的时间范围内，如果确实是完成交易的条件不具备，系统也能够作出反应，避免系统资源的长时间占用。因此，不管交易由Client还是由Server发起，此参数都要按照业务的实际状况进行设置。如果设置为0，就基本相当于无限时长。（系统unsigned long数据类型的最大值）</p>
<p>2.13 TRANTIME<br />
2.13.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; SERVICES -&gt; TRANTIME/AUTOTRAN。</p>
<p>2.13.2 时间单位<br />
　　秒,且必须为SCANUNIT的倍数。</p>
<p>2.13.3 取值范围<br />
　　0-2147,483,647。</p>
<p>2.13.4 默认取值<br />
　　30 。</p>
<p>2.13.5 用途解释<br />
　　此参数必须与AUTOTRAN配合使用，表示不需要调用tpbegin，就可自动发起的隐含交易（AUTOTRAN implicitly transactions）处理持续时长。其实，起到与tpbegin（timeout,0）中的timeout相同的作用。</p>
<p>　　其实，AUTOTRAN这个参数更为重要，其默认值为N, 其作用描述如下：</p>
<p>　　（1） 请求发起方不在交易模式，AUTOTRAN＝Y，Service将自动发起一个交易，TRANTIME将起作用；</p>
<p>　　（2） 请求发起方在交易模式，而且，其中的标记参数（flags）不是TPNOTRAN，那么，无论AUTOTRAN如何，Service将自动加入请求方交易中，TRANTIME将不起作用；</p>
<p>　　（3） 请求发起方在交易模式，而且，其中的标记参数（flags）是TPNOTRAN，如果AUTOTRAN＝N，Service将自动加入请求方交易中，TRANTIME将不起作用；</p>
<p>　　（4） 请求发起方在交易模式，而且，其中的标记参数（flags）是TPNOTRAN，如果AUTOTRAN＝Y，Service将不加入请求方交易中，而是产生一个新的交易，TRANTIME将在新交易中起作用；</p>
<p>2.13.6 超时后果<br />
　　与tpbegin(timeout,0)中的timeout相同。</p>
<p>2.13.7 设置考虑<br />
　　与tpbegin(timeout,0)中的timeout相同。</p>
<p>2.14 ORACLE XA OPENINFO参数：SESTM<br />
2.14.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; GROUPS -&gt; OPENINFO -&gt;SESTM 。</p>
<p>2.14.2 时间单位<br />
　　秒。</p>
<p>2.14.3 取值范围<br />
　　大于等于0，0表示无限时长。</p>
<p>2.14.4 默认取值<br />
　　无，使用时必须明确设置 。</p>
<p>2.14.5 用途解释<br />
　　会话静默等待时长，即全局交易中，作为资源管理器（resource manager）已经参与交易并完成相应的数据操作的数据库，等待全局交易中的其他参与方操作完成的时间长度。</p>
<p>　　举例说明：</p>
<p>　　假设一个全局交易由以下几个部分组成：</p>
<p>　　（1）tpbegin（T,0） -&gt; </p>
<p>　　（2）tpcall(S1) -&gt; DB1 完成耗时 T1;</p>
<p>　　（3）tpcall(S2) -&gt; DB2 完成耗时 T2;</p>
<p>　　（4）其他操作 耗时 T3</p>
<p>　　（5）tpcommit()</p>
<p>　　其中，tpcall(S1)访问数据库DB1, tpcall(S2)访问数据库DB2。</p>
<p>　　对DB1而言，如果T-T1&gt; T2+T3 &gt; SESTM1,则触发超时；</p>
<p>　　对DB2而言，如果T-T1-T2 &gt; T3 &gt; SESTM2,则触发超时；</p>
<p>　　由此可以看出，此参数的主要目的是对数据库进行资源保护，避免在全局交易中，已经完成任务的数据库，为等待其他参与方耗费过多的资源，毕竟ORACLE中并发全局交易的数量是很有限的。</p>
<p>2.14.6 超时后果<br />
　　触发此超时后，数据库将自己主动回滚已经完成的任务，释放全局交易资源。TUXEDO控制的全局交易进行TPCOMMIT时，如果总时间仍没有超过Transaction TimeOut，那么TPCOMMIT将失败，XALOG会记录下ORACLE错误："ORA-24756: Transaction does not exist"。确实如此，拿上面的例子来说，等到最后TPCOMMIT的时候，DB1已经主动回滚了所有的数据，不难理解，对DB1而言，它好像根本没有参加过这个全局交易，自然就会有这样的错误提示。</p>
<p>2.14.7 设置考虑<br />
　　这个参数是从数据库自我保护的角度设计的，对数据库而言，是不得已的办法。最好的措施还是TUXEDO能够控制时间，赶在SESTM之前，进行TPABORT，主动通知数据库进行数据回滚。</p>
<p>　　用一个简单的比方：冬天，客人出门时没有关门，SESTM时间后，客人还没有回来，主人感觉到冷了，只好自己去关门，不管什么理由，这样总是不太好。如果在SESTM时间内，客人能及时回来关门，主人就不会感觉那么差。</p>
<p>　　从前面的超时触发分析，我们也能发现，只要设置SESTM 能够大于 TransactionTimeOut的话，就能够尽量的不触发此超时机制，达到较好的效果。</p>
<p>2.15 ORACLE XA OPENINFO参数：SESWT<br />
2.15.1 参数出处<br />
　　UBBCONFIG配置文件 -&gt; GROUPS -&gt; OPENINFO -&gt; SESWT。</p>
<p>2.15.2 时间单位<br />
　　秒。</p>
<p>2.15.3 取值范围<br />
　　大于0。</p>
<p>2.15.4 默认取值<br />
　　60 。</p>
<p>2.15.5 用途解释<br />
　　会话繁忙等待时长，指全局交易中的一个交易分支（transaction branch）正在一个会话（session）中处理数据过程中，如果第二个会话也要对此交易分支进行操作，那么第二个会话必须等待第一个会话完成，如果在等待SESWT后，第一个会话仍然没有完成，那么第二个分支将触发此超时。</p>
<p>　　举例说明：</p>
<p>　　假设一个全局交易由以下几个部分组成：</p>
<p>　　（1）tpbegin（T,0） -&gt; </p>
<p>　　（2）tpcall(S1) -&gt; DB1 完成数据操作耗时 T1;</p>
<p>　　（3）tpcall(S2) -&gt; DB2 完成数据操作耗时 T2;</p>
<p>　　（4）其他操作 耗时 T3</p>
<p>　　（5）tpcommit()</p>
<p>　　其中，tpcall(S1)访问数据库DB1, tpcall(S2)访问数据库DB2，任何操作失败后，将调用tpabort。</p>
<p>　　假设 T1+T2 &gt; T &gt; T1，也就是说，在成功执行第二步tpcall(S1)后，应用执行到第三步tpcall(S2)，在执行过程中，将触发TransactionTimeout，tpcall（S2）将返回错误，应用将立即调用tpabort进行交易回滚，DB1的数据将立刻回滚；而DB2并不能中断tpcall(S2)引起的数据操作，对于ORACLE DB2而言，tpcall(S2)引起的数据操作属于第一个会话，而tpabort引起的数据库回滚操作是通过XA接口，属于第二个会话，所以，tpabort作用到DB2上，只有等待第一个会话完成，如果等待SESWT后，第一个会话仍然没有完成，即SESTM </p>
<p>2.15.6 超时后果<br />
　　系统将返回XA_RETRY错误，提示TMS此操作不能完成，需再试一次。如果应用程序对此没有再次尝试的话，仍以上例说明，DB2只能利用SESTM2，触发超时，自动回滚。</p>
<p>2.15.7 设置考虑<br />
　　查阅ORACLE相关资源，发现oracal9.2与以前版本效果不同，以前的版本都是第二个会话在等待SESWT后，如果第一个会话操作仍然没有结束，第二个会话能够使第一个会话操作立即进行有效的回滚，使第一个会话返回错误：ORA-24761。</p>
<p>　　不难理解，两者的区别是，打个简单比方说，A正在用杯子喝水时，B要A放下杯子，B等待SESWT后：</p>
<p>　　oracle9.2的做法很民主，A还没有用完，通知B，A还在用杯子，不能放下，还想让A放下杯子，可以，再来一次；也就是说，只要A在用，B就不能让人家放下杯子，某种程度上，A代表了强权。</p>
<p>　　Oracle9.2之前版本的做法很粗暴，通知A不能使用这个杯子了，必须放下，因为B让你放下，而且已经等很久了，某种程度上，B代表了强权。</p>
<p>　　因此，如果是ORACLE9.2后的版本，SESWT适当放长一些，毕竟还是希望能够等到能做事的时候，把想做的事情做了。如果是以前的版本，SESWT适当放短一些，反正一定能等到，为什么不少等一会儿呢？</p>
<p>2.16 ORACLE sqlnet.expire_time<br />
2.16.1 参数出处<br />
　　$ORACLE_HOME/network/admin/sqlnet.ora -&gt; expire_time 。</p>
<p>2.16.2 时间单位<br />
　　分钟。</p>
<p>2.16.3 取值范围<br />
　　大于0。</p>
<p>2.1*** 默认取值<br />
　　无 。</p>
<p>2.16.5 用途解释 ⑾<br />
　　死联接检测DCD(Dead Connection Detection)是 SQL*NetV2.1 和此版本以后的一个新特性, 当它检测到对方 c/s 或者s/s 联接意外终止时, 释放相关占用的资源。 </p>
<p>　　DCD 起初是专为客户机没有从会话中断开联接的情况下断电的环境设计的。 </p>
<p>　　DCD由服务端开始建立联接。 这时候SQL*Net 从参数文件中读取变量, 设置一个定时器定时产生信号。 这个时间间隔是sqlnet.ora文件中的SQLNET.EXPIRE_TIME提供的。 </p>
<p>　　当定时器设定的时间到了之后, 服务器上的SQL*Net 发送一个探测包到客户端。(如果是数据库联接, 目的端的服务器发送探测包到另一端)。 探测包是由空的SQL*Net包组成, 不体现SQL*Net层任何数据, 但会在下一层的网络协议中产生数据流量。 </p>
<p>　　如果客户端的联接仍然是活动的, 探测包被丢弃,计时装置复位。 如果客户端异常断掉，服务器将收到由发送探测包的调用发出的错误。 </p>
<p>2.16.6 超时后果<br />
　　服务器将收到由发送探测包的调用发出的错误，SQL*Net 将会通知操作系统释放联接占用的资源。</p>
<p>　　需要说明的是, SQL*Net 2.1.x中 一个活动的孤儿进程（active orphan process） ，如单独的查询进程，在查询完成之前不会被杀掉。 在SQL*Net 2.2中，孤儿进程占用的资源将会被无条件释放，不管查询是否结束。 </p>
<p>2.16.7 设置考虑<br />
　　ORACLE 在NT操作系统上，此功能表现很差，检测出的无效联接（dead connection）不能被尽快释放，而必须等到数据库重新启动时才释放。SQL*Net v2.3以后版本改善了以上问题。</p>
<p>　　此功能只是服务器的特性，如果不设置此参数，此功能将不启动。按照ORACLE的建议，对大多数应用来说，设置10分钟较合适，其实关键还是分析应用系统的实际情况。</p>
<p>　　同时，不难理解，作为一个数据库自我管理的机制，也是要占用数据库资源和网络资源的，太频繁的探测同样会降低系统和网络的性能。在低速网络上，设置此参数，就需更为慎重。</p>
<p>　　客户端不需要设置此参数。</p>
<p>2.17 ORACLE distributed_lock_timeout<br />
2.17.1 参数出处<br />
　　ORACLE初始参数文件：init.ora -&gt; distributed_lock_timeout。</p>
<p>2.17.2 时间单位<br />
　　秒。</p>
<p>2.17.3 取值范围<br />
　　大于0。</p>
<p>2.17.4 默认取值<br />
　　60 。</p>
<p>2.17.5 用途解释<br />
　　分布式事务锁等待超时（distributed transaction waiting for lock），指第二个事务处理需要的数据库资源，正被第一个分布式事务占用而锁定，那么，第二个事务将等待第一个分布式事务释放此资源，等待distributed_lock_timeout时间后，如果第一分布式事务仍然没有释放此资源，第二个事务触发此超时。</p>
<p>2.17.6 超时后果<br />
　　如果资源被第一个事务正常使用锁定，ORACLE回滚第二个事务，并返回错误："ORA-02049: time-out: distributed transaction waiting for lock "。</p>
<p>　　如果第一个事务处理完成，资源释放后，再尝试第二个事务，就会成功。如果第二个事务不能等待资源自动释放，那么可以采用处理数据库死锁（deadlock）的措施，人工介入，清除第一个事务，但一般不建议采用这种方式，因为第一个事务一般会正常结束的。</p>
<p>　　如果资源被第一个事务因为处于不确定分布事务状态（in-doubt distributed transaction）而锁定，ORACLE回滚第二个事务，并返回错误："ORA-01591: lock held by in-doubt distributed transaction identifier "。</p>
<p>　　这种错误遇到的可能性较小，一般只有在分布事务的关键提交阶段出现网络、系统故障，才可能出现此故障，而且，当网络、系统故障恢复后，ORACLE一般可以自己解决此问题，不需要人工介入。如果一定要人工介入，可以查阅ORACLE专门的手册。</p>
<p>2.17.7 设置考虑<br />
　　出现这样的超时，是因为特定数据库资源的使用碰撞，要分析应用系统的业务特点，确定碰撞可能发生的条件，在此条件下，资源可能被先来者锁定多长时间（T1），后来者又能够等多长时间（T2），再来设置此参数（T）的大小。如果在大多数情况下，T1 &lt; T2, 那么就设置T1 &lt; T &lt; T2；反之，大多数情况下，T1 &gt; T2，那么，就设置T &lt; T2。</p>
<p>　　因此，不分析业务特点，一味的增大和减小是不恰当的。</p>
<p>2.18 ORACLE Max_commit_propagation_delay<br />
2.18.1 参数出处<br />
　　ORACLE初始文件:init.ora -&gt; Max_commit_propagation_delay。</p>
<p>2.18.2 时间单位<br />
　　0.01秒。</p>
<p>2.18.3 取值范围 <br />
　　0 ～ 90000。</p>
<p>2.18.4 默认取值<br />
　　700 。</p>
<p>2.18.5 用途解释<br />
　　最大提交传播时延（MAX_COMMIT_PROPAGATION_DELAY，简称MCPD），在ORACLE RAC(或OPS)环境中才使用，表示在RAC系统中，一个instance系统提交产生的最新系统改变码（SCN），能够以多快的速度反应到另一个instance中。</p>
<p>　　举例说明，RAC系统，有A,B两个实例（instance），A、B本地系统改变码为SCN1，A更新数据DATA1提交， LGWR操作完成后，A本地系统改变码为SCN2，经过不大于MAX_COMMIT_PROPAGATION_DELAY时间后，B系统本地改变码才变为SCN2。</p>
<p>2.18.6 超时后果<br />
　　Global Cache Services 将刷新RAC中的SCN。不管SCN是否及时刷新，后续的数据查询都不会因此产生数据库错误。但，在此时间内，有可能查询结果不是最新数据，产生读一致性（read consistency）问题。</p>
<p>2.18.7 设置考虑<br />
　　RAC环境中的所有实例，此参数值必须相同。</p>
<p>　　ORACLE8i后，建议常用的两个值是0和700（默认），其他数值皆不建议。其实，这两个数值就代表了RAC环境中，两种SCN 产生机制：</p>
<p>　　Lamport Scheme和 Broadcast on Commit scheme。</p>
<p>　　设置为默认值700，表示采用Lamport Scheme，SCN改变不会完全同步，同步将在 7秒钟内完成，而不是总等待7秒钟后才完成。如果系统比较空闲，同步可能在0.5秒（甚至更短时间）内完成；不管系统多繁忙，同步时间也不可能超过7秒。不难理解，采用此模式，整个RAC系统的运行效率较高。</p>
<p>　　设置为0，表示采用Broadcast on Commit scheme，SCN改变完全同步。每当commit时（即LGWR 写redo log时）：</p>
<p>　　－ LGWR发送消息更新全局SCN（global SCN），</p>
<p>　　－ LGWR 发送消息给每个活动的实例更新其本地SCN（local SCN）。</p>
<p>　　有资料说，只要MCPD &lt; 700，系统将采用Broadcast on Commit scheme。</p>
<p>　　Lamport Scheme能够适应绝大部分应用的要求，只有个别实时性特别高的业务，才需要Broadcast on Commit scheme。通过分析，不难理解，Broadcast on Commit scheme将需要更多的系统资源。</p>
<p>3 总结<br />
　　以上所有时间参数，都是tuxedo系统或ORACLE数据库系统提供的时间控制机制，更多的是从维护本系统自身安全的角度，建立起相互之间沟通的规则。在Client 端，中间件服务器，数据服务器这相互联系的三者之间，用一个简单的比方，就是先保证自己尽量不给相关人带来麻烦；一旦相关人出了麻烦，自己能够自我保障，不受别人干扰。</p>
<p>　　这些时间参数还有的一个共性的特点就是"不精确"，如果业务需要要精确到1秒，则必须依靠业务程序中更精确的时间编程。</p>
<p>　　总之，要保障整个业务系统的有效性和健壮性，必须了解都有哪些时间参数？都表示什么意思？都起哪些作用？自己的业务应用对时间要求是怎样的？这些参数该如何配置才能满足应用的要求？希望本文能够在以上方面给大家带来一点方便。</p>
<p>4 后记<br />
　　自2002年真正在项目中利用TUXEDO起，就发现已有资料在时间参数解释方面的缺憾，那时，就有写这样一个专题的打算，开始收集这方面的资料。由于后来工作内容的变化，也就没有精力再作整理，但心里一直惦记着这件事情。直到前些天知道了BEA的这个活动，再到网络上搜集资料，发现已经有了一些类似的资料，但感觉仍然不够完整，不够透彻，因此，我认为整理这样一个专题资料，还是有必要的，便下决心借此机会做完这件事情。经过近十天的查阅、整理，终于完成，算是了我多年夙愿。</p>
<p>　　文中的参数，我仅仅使用过其中的12个，其他未用参数，主要是靠查阅资料和逻辑分析，根据我自己的理解进行解释，再加上时间仓促，或遗漏、不妥之处，敬请指正，让我们一起来使此《功略》更准确、更全面，让更多的人从中受益。</p>
<p>5 参考文献<br />
<a href="http://e-docs.bea.com/">http://e-docs.bea.com</a> BEA TUXEDO RELEASE 7.1 。 <br />
<a href="http://dev2dev.bea.com.cn/techdoc/tuxedo/20030230.html">http://dev2dev.bea.com.cn/techdoc/tuxedo/20030230.html</a> 《Tuxedo 中关于时间的参数的说明》作者：不详 。 <br />
《ORACLE8i Reference》。 <br />
《ORACLE9i Reference》。 <br />
《ORACLE8i Parallel Server Concepts and Administration》。 <br />
《ORACLE8i Application Developers Guide - Fundamentals》。 <br />
<a href="http://metalink.oracle.com/">http://metalink.oracle.com</a> 相关问题解决资料。 <br />
<a href="http://www.chinaunix.net/">http://www.chinaunix.net</a> 《DCD死联接检测》作者：yukaikai <br />
　　注：文章中标注⑴～⑽涉及的内容，引自参考文献-2 ，标注⑾涉及的内容，引自参考文献-8 。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/278089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 21:15 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于TUXEDO 负载均衡和MSSQ的探讨  zz </title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278088.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278088.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/278088.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/278088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/278088.html</trackback:ping><description><![CDATA[<a href="http://kimva.blogbus.com/logs/10795676.html">http://kimva.blogbus.com/logs/10795676.html</a>&nbsp;<br />
<br />
&nbsp;在使用TUXEDO的过程中，会遇到一些并发请求量很大的情况，比如某些帐单处理服务或者是在营业下班前的日操作清单服务。这时，一些SERVICE会接收到大量客户端，甚至长时间的请求，对service，甚至整个系统是严峻的考验。遇到这种情况，单个的server往往难以应付，或者性能不好，我们就想到负载均衡或者使用TUXEDO的MSSQ（Multi Server, Single Queue）。下面笔者根据自己在TUXEDO应用开发和管理配置方面的实践，结合实际系统压力测试的结果对相关的问题进行一些探讨。
<p>在没有负载均衡的情况下，是由一个server（可能包含一个或多个service）来处理客户端对其中service的请求，所有的请求首先放入这个server的队列里面，然后server逐个取出处理。在UNIX系统上，TUXEDO较多的使用了队列，并且也用到了共享内存和信号量，相关的UNIX系统参数会影响到系统的性能，但这个不在本文讨论范围之内，这里假设已经调到了合适的范围，具体请查阅TUXEDO关于IPC的文档。</p>
<p>现以一个帐单处理的server为例，负载均衡前server的ubb配置为：<br />
billpay SRVGRP=GROUP1 SRVID=1<br />
在单个server不能满足性能要求的情况下，就考虑采用TUXEDO的负载均衡方法。<br />
方法一是直接将相关server启多份，将上面的配置改为：<br />
billpay SRVGRP=GROUP1 SRVID=1 MIN = 5 MAX = 10<br />
这样tmboot的时候，就会有MIN = 5个billpay启动，类似下面的情况：<br />
billpay 00001.00001 GROUP1 1 0 0 ( IDLE )<br />
billpay 00001.00002 GROUP1 2 0 0 ( IDLE )<br />
（依此类推，共5个）</p>
<p>其中第二列是该server的队列名，"."前面是GRPNO,后面是SRVID，每个server有自己的队列。相关的另一个参数就是在ubb的*RESOURCES段的LDBAL，表示是否启动Load Balancing，默认是"N"（不启动），你可以通过设置成"Y"来启动。这里需要注意的是，为"N"的时候并不表示多个server不能分担负载。主要的差别是为"Y"时，TUXEDO在接收到请求时会按照它的负载均衡的算法来找到合适的server来处理，而设置成"N"时，总是由第一个可用的server来处理。通过这种方法可以让多个server来处理大量并发的请求，就达到了改善性能的目的。</p>
<p>方法二是采用MSSQ（Multi Server, Single Queue），顾名思义，就是有多份server，但是只有一个队列（请求队列）。具体的配置是：<br />
billpay SRVGRP=GROUP1 SRVID=1 MIN = 5 MAX = 10<br />
RQADDR=" billpay" REPLYQ=Y</p>
<p>启动后的情况如下：<br />
billpay billpay GROUP1 1 0 0 ( IDLE )<br />
billpay billpay GROUP1 2 0 0 ( IDLE )<br />
（依此类推，共5个）</p>
<p>我们发现几个billpay server都关联相同的名为billpay的队列，这就是所谓的Single Queue。</p>
<p>与直接多server相比，多了两个参数，RQADDR是这多个server共用的队列名，是一种逻辑名，可以自己命名，不和别的冲突就可以，REPLYQ是标示是否设置返回队列，在使用MSSQ的时候是强烈建议设置，因为这样可以将请求和返回分开，避免多个server共用队列时造成混乱。相关的其它参数这里没有详细列出。</p>
<p>到底两种方式和没有负载均衡时有什么不同，后面将提供相关的测试结果。先分析一下两种方法。方法一有多个队列可以容纳请求，但是这些大量的请求怎样放入这些队列必定有一定的策略，而且根据LDBAL的设置会不同，但是这个策略本身的运算也是一种消耗，因为每个请求都面临着这个选择。因为这种情况下每个队列是和server对应的，所以队列的选择就意味着选择了相应的那个server，这样大量的请求就被分流。虽然有选择的消耗，但是额外的好处也是显而易见的，那就是有多个queue可用，有效避免了请求并发量很大时队列的溢出，这种情况在实际的压力测试中发生过。使用方法二时，放入队列时不用做选择，然后每个server的任务就是从队列取出请求去处理，考虑到多个server并发取队列，所以用MSSQ时其server的数目不宜太多，官方文档建议2－12。而且在这种情况下，建议不要设置LDBAL=Y，因为MSSQ本身就是一种基于single queue的负载均衡的方法，这时再使用系统的策略已经没有意义。这种方法也有一个问题，如果相对于请求数来说，处理得不够快，就比第一种方法更容易造成队列溢出。</p>
<p>因为我们无法知道TUXEDO一些具体的算法和策略，那就用一些具体的测试来比较吧。笔者在一个和实际生产系统配置相同的UNIX+ORACLE+TUXEDO8.0系统上做了一下试验，被测服务是一个帐单查询服务，每次根据一批ID从数据库查询出具体的帐单，由于都是实际数据和实际使用的服务，有一定的说明力，但是也不排除一些情况造成的误差。以下是测试的一些结果，每个server的实际运行份数都是10。</p>
<p>一：客户端数目为1，循环调用100次。 </p>
<p>1． 方法一，LDBAL = Y or N。结果发现所有的请求都由其中的一个server处理，其它全部空闲。在此基础上再进行两次循环调用，结果还是一样。<br />
2． 用方法二，LDBAL = Y or N。其中两次测试的情况是：<br />
&lt;1&gt;19，19，2，2，1，18，18，1，1，19<br />
&lt;2&gt;23，8，23，23，23，（其它空闲）<br />
以上数据说明了两种方式的调度策略是不一样的，在单客户端循环的情况下方法二更合适。 </p>
<p>二：客户端数目50，每个循环80次，统计总的执行时间。<br />
1． 用single server。两次测试的处理时间分别是219s和196s。<br />
2． LDBAL = Y 方法一：三次测试时间为：63s，79s，69s<br />
3． LDBAL = N 方法一：三次测试时间为：74s，79s，85s<br />
4． LDBAL = Y 方法二：三次测试时间为：74s，73s，77s<br />
5． LDBAL = N 方法二：三次测试时间为：78s，76s，75s </p>
<p>通过以上数据可以看出不管用那种方法，使用负载均衡相比单个server都可以在大量请求并发时得到更好的性能。但是同时也发现后四种情况的总时间差别不大，考虑一些实际的误差，很难断定哪种更好。</p>
<p>通过前面的分析，并查阅相关的文档，建议采用的是两种方式：多个server，不用MSSQ,设置LDBAL = Y；用MSSQ，设置LDBAL = N。当然，在使用TUXEDO的应用系统中，不能绝对的说哪一种方式更好，只能是根据具体的情况来分析，并通过实际的压力测试来进行选择，而且这个和具体server的特点也是有关的。</p>
<p>以上是一些个人分析和测试的结果，算是写出来和大家探讨，也希望大家提出自己的看法并讨论。</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/278088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 21:14 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中间件在电信行业中的应用 zz </title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278087.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278087.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/278087.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/278087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/278087.html</trackback:ping><description><![CDATA[<br />
<a href="http://kimva.blogbus.com/logs/10687711.html">http://kimva.blogbus.com/logs/10687711.html</a> <br />
<br />
<p>一、中间件技术在系统设计规划方面的经验总结</p>
<p>1.1、中间件应用架构的选择 <br />
这种架构选择的焦点就是业务逻辑到底是放在前台应用中还是放在后台中间件应用中。其实，引入中间件平台的原因之一就是业务逻辑的集中管理，出现这种争论的原因主要是开发商对这种业务逻辑集中的理解不深，在应用设计的过程中仍然没有摆脱以前两层结构的影响，再加上因为业务逻辑集中会增加程序开发量，才出现了这种情况。我们认为，把业务逻辑集中在中间件服务器上不仅对于业务逻辑的集中管理有好处，而且对于系统的后期运行维护、软件的升级管理都有着明显的优势。当然,在开发的工作量方面，业务逻辑集中时工作量大很多。</p>
<p>1.2、中间件服务分布的设计和优化原则<br />
在Tuxedo中，Server可以理解成为Unix的一个进程，Service可以理解成为应用进程Server中的一个函数。用户可以任意划分Server和Service：既可以把所有的Service放在一个单一的Server中，也可以采用&#8220;一个Service一个Server&#8221;的方式。Tuxedo对此没有任何限制。<br />
中间件应用的性能直接影响到营业前台服务的稳定性和连续性，而影响中间件应用性能的因素除了硬件资源的保证、数据库响应时间、中间件应用软件本身的质量之外，中间件应用服务的分布也起着至关重要的作用。我们有着这样的一个例子，在前台进入收费界面的时候，应用程序需要调用一个SERVICE名字叫A，A分布在一个叫SA的server中，而SA中又包含着很多其他的在线统计的SERVICE B，结果造成了SA响应B调用的时候执行时间比较长，所有的SA都在执行SERVICE B ，前台请求SERVICE A得不到响应，收费的界面怎么都进不去，从而导致前台收费业务中断。这就是个典型的因为服务分布不当造成的系统故障。<br />
我们在系统规划设计过程中遵循的一个最基本原则就是尽量将&#8220;类似的Service&#8221;捆绑在一个Server之内。所谓&#8220;类似的Service&#8221;是指这些函数有相似的大小、执行时间、复杂度或者功能。我们来考虑一个极端的例子：假设一个Service A是完成非常简单工作的，它的平均执行时间是100毫秒。另一个Service B进行数据库的查询，它的执行时间可能长达20秒。如果将这两个Service捆绑在一起使用，就会出现非常严重的后果。大家知道，操作系统的基本调度单位是进程。在一个进程中的Service执行是串行的。Tuxedo把发往同一个Server的请求交易包放在同一个消息队列中。当Service B在执行的时候，Service A的请求包必须在队列里面等待20秒以上才可能被执行，虽然它的执行时间仅仅100毫秒。这显然是不能容忍和应该避免的。<br />
实际上，用户在设计和开发应用程序的时候，并不能完全估计出每个Service的执行时间和频度。所以对Server和Service的划分优化是在应用程序开发完毕后进行调整的。调整的依据就是在系统运行的时候记录每个Service的执行时间和频度，然后根据这些数据来进行优化调整。下面就是我们在实际当中获得经验的一些系统总结。<br />
1、 区分Service的不同类型：是业务操作还是简单的数据访问<br />
在中间件应用中的Service可以进一步细分成负责完成业务操作和负责数据访问的两种类型。在设计的时候，最好把这两种不同类型的Service区别出来。所谓完成业务操作的类型其实就是进行数据修改的操作，负责数据访问的类型其实就是进行数据查询的操作。但是在实际的系统运行过程中，凡是涉及到数据修改的操作过程中必然会有数据查询的操作，这种类型的操作也应该规整到第1种类型中去。<br />
2、 请求/响应类型的Service要和会话Service分开在不同的Server中<br />
在Tuxedo中，一个Server要么支持请求/响应类型类型的Service，要么支持会话方式的Service。会话方式和请求/响应方式是两种互斥的通讯方式。请求/响应方式效率比较高，是使用最频繁的通讯类型。Tpcall/tpacall/tpforward都是这种类型的函数。会话方式适合大量的数据传输，但是它的代价是效率的下降。所以这两种类型的Service要分开放在不同的Server里面。<br />
3、 执行时间相似的Service放在同一个Server里面<br />
在Tuxedo应用环境中，可能有成百上千的Service，这些Service的执行时间显然是不同的。对于单线程的Server来说，虽然它可能有多个Service，但是这些Service的执行是串行的。如果某个Server拥有两个Service，A和B。A的执行时间是100ms，B的执行时间是1000ms，也就是说执行一次B的时间可以执行十次A。那么当B在执行的时候，可能会有十个A在队列里面等待。这种情况会急剧降低该Server处理Service的吞吐率。因此很自然的一个原则是把执行时间相似的Service放在同一个Server里面。<br />
4、 具有相同执行频度的Service放在同一个Server里面<br />
在一个典型的Tuxedo应用系统中，并不是所有的Service的执行频率都是相同的。可能一些Service被频繁的执行，而另外一些Service只是偶尔才被执行几次。把这些SERVICE分开可以避免偶尔调用的SERVICE堵塞频繁调用的SERVICE。<br />
5、 避免死锁的情况发生<br />
在Tuxedo中的死锁情况有两种，第一种是一个Server中的Service A去调用同在一个Server中的Service B。这种死锁发生的原因是，对于单线程的Server来说，它其中的Service是串行执行的。Service A去调用Service B的时候，Service A还没有执行完，它等待Service B的返回结果。 但是Service B不能执行，因为该Server还处于执行Service A的状态。最终导致Service A超时而出错。<br />
第二种情况是两个Server中的Service互相调用。例如Server1和Server2，Server1中的Service A去调用Server2中的Service X。同时Server2中的Service Y去调用Server1中的Service B。这种情况发生的死锁和第一种情况非常类似，都是因为进程只能串行实行Service导致的。<br />
这两种死锁情况在应用设计时特别要注意避免。第一种情况是比较容易察觉的，但是第二种情况就不大容易察觉。<br />
1.3、中间件系统应用平台FAILOVER方式的选择在真实的生产运行环境中，运行平台的failover是一个必须考虑的问题。Tuxedo平台上的实现failover机制基本上有两种，一种是利用tuxedo自己的failover机制配合前台配两个WSNADDR地址来实现failover。一种是利用双机软件来实现。<br />
第一种方式是指使两台的中间件服务器处于MP工作模式下，在每一台都启动WSL进程，然后在中间件前台配置两个ip地址。通过自己实验发现利用tuxedo自己的failover机制只有如下好处即不需要额外的操作系统和软件的支持，但是其缺点确很多，主要缺点如下：<br />
1、两台中间件平台的MASTER切换必须要手工完成，无法自动完成。<br />
2、前台配置的两个WSNADDR地址，如果第一个地址失败，要重新连接到第二个地址需要很长的时间，并且在每次服务调用时都要等待同样的时间。<br />
通过双机软件来实现FAILOVER是指两台中间件服务器都配置在SHP模式下，然后利用双机软件的ip切换功能来实现failover。这种方法需要在各自的配置文件中加入另外一台主机的WSL的信息，在另外一台主机故障时，通过双机软件进行IP切换，再通过双机切换脚本将这台主机的备用WSL启动即可。采用这种方式有以下优点<br />
1、机器切换自动完成，不需要人工干预。<br />
2、前台业务不受影响，能保证业务开展的连续性。<br />
缺点主要有<br />
1、在正常情况下，每一台主机的启动中间件时，备用的WSL服务会启动失败，不过这不影响正常使用，备用的WSL只在另外一台主机故障后才起作用。<br />
2、需要额外的双机配置和脚本配置工作。<br />
经过这些比较，我们选定了采用双机软件的方案实现了中间件的failover机制。在以后的运行维护过程中起到了好的效果。<br />
1.4、中间件与数据库的连接方式的选择在TUXEDO中间件应用中连接数据库的方式有两种，一种为通过XA方式连接数据库，另外一种是在应用程序中自己连接数据库。<br />
通过XA方式连接数据库是指利用关系型数据库的XA接口，在tuxedo的配置文件中的OPENINFO段中加入连接信息，然后在server程序的初始化代码的中调用中tp_open（或xa_open），当SERVER启动时进行数据库连接。<br />
通过应用程序直接连接数据库，数据库的连接操作不一定是在SERVER启动时进行的。<br />
这两种方式的连接在BOSS系统中都会用到，其中的区别主要就在于如果业务操作的事务为分布式事务时，则必须要用XA方式。详细比较如下：<br />
1、通过XA连接的方式可以实现分布式事务，即能够保证事务在不同数据库中的一致性。但是正是因为如此，它对中间件系统和数据库系统都有额外的开销，有时候这种开销甚至会影响系统的性能。<br />
2、通过应用程序直连数据库的方法不能够实现分布式事务，但是同时也因此减少了对系统的压力。 <br />
综上，选择数据库的连接方式对整个系统的性能影响也是至关重要的，我们有个原则，凡是在不涉及到分布式事务的地方就不用XA连接。过多的依赖了XA接口，会给系统带来了许多额外的负担和压力，也会造成许多额外的故障。</p>
<p>二、中间件技术在系统维护方面的经验总结在中间件的日常维护中，我们了解了一些TUXEDO的基本知识，摸索了一套行之有效的故障排除方法，积累了一些常见故障的排除经验，现在与大家介绍如下：<br />
2.1、LICENSE数的问题tuxedo的license由文本文件lic.txt来控制，位于udataobj目录下，分为SDK/RTK两种，两种LICENSE不能合并使用。它控制的是并发用户数并且有10%的冗余，这里的并发用户数是指在某一时刻前台程序已经发起tpinit还没有作tpterm的连接数，所以在tuxedo中间件的使用中存在着长连接和短连接的问题。长连接是指tpinit后就开始一系列的服务调用，只在系统重启或系统非常空闲的时候才做tpterm，而短连接是指每次服务调用前作tpinit，调用结束后立即作tpterm调用。因为短连接下的服务调用需要额外的连接时间消耗，这对系统响应时间会有影响，而长连接又会占用系统的并发用户数。所以在系统设计时需要针对不同的应用情况做出不同的设计，比如针对接口类型的应用因为服务调用比较频繁，进行连接的时间就会占比较大的比重，这时就需要使用长连接，而对于前台应用类型的应用，连接过程的时间对于业务操作的时间来说是可以忽略的，这时就要用短连接来节约license资源。</p>
<p>2.2、客户端连接的问题当客户端无法连接中间件时，我们需要确认的是<br />
1、 客户端的WSNADDR是否设置或是否设置正确。<br />
2、 系统配置文件中的MAXWSCLIENTS和MAXACCESS是否正确设置。<br />
3、 WSL是否启动，WSH的个数是否足够。<br />
4、 是否有防火墙，如果有防火墙存在，则需要在WSL的配置中作相应的地址映射和端口指定。<br />
5、 操作系统是否有足够的SCOKET资源使用。<br />
解决了这些问题后，一般就可以解决客户端连接不上的问题了。<br />
在TUXEDO中，参数TMTRACE对故障的定位和排除很有作用，它是一个环境境变量。我们一般在系统监控的工作终端上将此参数设置为on，在前台报系统故障的时候，我们直接进入故障模块将故障重现，然后在终端机器的c:\或者tuxedo的安装目录下打开一个ULOG文件，在此文件中会发现tpcall服务的失败信息，根据这个信息查找对应的SERVER和SERVICE的对应表，很快就可以找到问题服务。采用这种方式，维护人员不需要了解程序的具体流程就可以定位错误解决故障。<br />
在TUXEDO的服务端，有几类文件需要关注，这些文件包括ULOG文件、XA接口的trc文件、数据库连接故障的sqlnet.log、标准输出文件stdout（也可以被应用程序自己定义）。在这些文件中包含着丰富的系统运行错误告警信息。ULOG记载关于中间件的启停记录和系统本身的一些配置运行告警信息。XA的trc文件记录的是XA接口方面的一些的错误信息，关于分布式事务的一些错误在这个文件中都有记录。sqlnet.log记录了应用程序和数据库连接故障的信息，只要有当前日期时间的这个文件存在，应用和数据库的连接就会存在问题。标准输出文件stdout记录了应用程序本身的运行信息。这些文件的跟踪检查对于及时主动的发现故障有着重要的意义。</p>
<p>2.3、事务控制的问题1、事务边界的问题：在这里我们要遵循谁发起发起事务，谁就结束的原则，这里的谁主要是指中间件的前台和后台。我们知道在TUXEDO中事务的发起既可以在前台程序中发起，也可以在后台程序中发起。无论放在前台还是放在后台都有其优缺点。事务放在前台增加了网络传输的流量，当时可以保证异常情况下前后台操作的一致性，事务放在后台可以减少网络流量，但是对于异常情况下前后台操作的一致性很难保证。我们采用的是事务放在前台程序中。但是无论放在前台还是后台，都要遵循谁发起，谁结束的原则。<br />
2、XA接口使用的注意事项：首先是XA资源文件的配置，在oracle数据库中一般用到的是libclntsh.a，我们可以先Make sample，提取其中用到的连接库加入到RM文件中即可。其次在oracle8i之前要对XA进行授权，要在oracle的DBA用户下执行grant select on dba_pending_transactions to public。<br />
3、事务挂起的问题：在使用XA的情况下，我们经常会遇到这种情况，SERVER进程还在，可就是不做事。在相关的日志文件中总是报&#8220;当前的进程已经在一个本地事务中了&#8221;的错误，这时只有重启该SERVER，才能排除故障。其实这是一个事务控制的问题，它产生的根本原因是在开启全局事务前，该SERVER执行了一个本地的事务并且没有提交或回滚。在程序代码上表现为如下三种原因：<br />
（1）、在调用该SERVER的某个带DML语句的service前没有加tpbegin。<br />
（2）、在调用tpbegin后没有判断返回值。<br />
（3）、tpbegin后的tpcall服务调用没有判断返回值，在全局事务超时后没有能够及时的退出后续的调用，导致下一个tpcall产生了一个本地事务。<br />
此外，还会有一类比较特殊的问题，那就是TMS服务挂起的问题，利用tmadmin中的pq命令发现TMS的队列中有很多请求存在，在这种情况下，一般只能等待其执行完成，情况严重时，则需要调整相应的数据库参数，在ORACLE中该参数应该设为max_commit_propagation_delay&gt;=90000。<br />
在实际的运行维护中，我们发现即使把数据库参数调整了，有时还会有TMS挂起的故障发生。针对这件事情我们专门作了研究，TMS之所以挂起是因为TMS在等待数据库中DX独占锁的释放，这种独占锁加锁的对象一般都是ORACLE的系统对象，而这种独占锁的产生一般是在全局事务中执行着DML语句，当这种DML语句执行比较慢时，就会引起TMS的锁等待现象。此外，我们还发现，一般的查询语句是不会产生锁的（OPS的lm_lock锁除外），但是如果将查询放入一个全局事务中时，它就会产生一个共享的DX锁，如果这个在全局事务中的查询的调用是通过ORACLE的工具包DBMS_SQL来进行的话，那就会产生一个DX的排他锁。基于这些结果，我们建议在程序的开发过程中要遵循能不用XA全局事务的情况下就不用，能将查询放到事务之外的就不要放到事务之内，能不用ORACLE工具包进行开发的就不要用。我们也按照这个原则要求我们的开发商，取得了比较好的效果。<br />
4、事务超时设置的问题<br />
中间件应用系统的事务超时控制很重要，不设置超时时间对系统来说简直就是一种灾难。我们曾经就有过因为超时时间的设置没设和设置不当造成了严重的系统故障，最直接的故障就是系统报全局事务数不够的错误，无法开启新的事务，从而导致前台业务的终止。TUXEDO的超时主要有三种，一个是在代码中的tpbegin超时（值为其参数）T1，他控制整个事务的完成时间，第二个为XA连接的超时（配置文件中的open_info中的SesTm ）T2，他控制同一连接中对于分布式事务锁的等待超时时间，还有一个为数据库中等待数据库对象非分布式事务锁释放的超时时间（_dirstributed_lock_timeout）T3。这三个超时共同作用并且有如下的关系 T1</p>
<p>2.4、服务不能正常启动的问题在实际的维护工作中，经常会出现服务不能正常启动的现象。明明所有的服务都已经关闭了，tmboot就是起不来。这种原因一般是因为系统的IPC资源没有释放。IPC资源是操作系统用来进行进程间通讯的系统资源，主要包括信号灯、共享内存、消息队列。在UNIX操作系统下通过IPCS命令可以清楚的看到IPC资源的使用情况。当服务无法启动的时观察IPCS就会发现tuxedo运行环境的用户下的ipc资源没有被释放，这时使用ipcrm命令清除相应的IPC资源，再启动服务就可以了。<br />
&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/278087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 21:13 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>config the jolt pool in your weblogic</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278060.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278060.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/278060.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/278060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/278060.html</trackback:ping><description><![CDATA[1)copy your jolt lib to the weblogic domain. and this jar lib will be appended to the end of the weblogic classpath<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">root@rhelserver&nbsp;lib</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">#&nbsp;cp&nbsp;/home/oracle/tuxedo10gR3/udataobj/jolt/jolt.jar&nbsp;&nbsp;./<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">root@rhelserver&nbsp;lib</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">#&nbsp;cp&nbsp;/home/oracle/tuxedo10gR3/udataobj/jolt/joltjse.jar&nbsp;&nbsp;./<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">root@rhelserver&nbsp;lib</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">#&nbsp;cp&nbsp;/home/oracle/tuxedo10gR3/udataobj/jolt/joltwls.jar&nbsp;&nbsp;./</span></div>
<br />
<br />
2)add the startup and&nbsp;shutdown class in your domain.<br />
&nbsp; <br />
3)add the joltpool&nbsp;to your weblogic.&nbsp; <br />
<br />
4)write your servlet program to call the tuxedo service:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.ServletException;<br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServlet;<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletResponse;<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;bea.jolt.pool.SessionPoolManager;<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;bea.jolt.pool.servlet.ServletSessionPool;<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;bea.jolt.pool.servlet.ServletSessionPoolManager;<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;Servlet&nbsp;implementation&nbsp;class&nbsp;TestJolt<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #008000">&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestJolt&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;HttpServlet&nbsp;{<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Default&nbsp;constructor.<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;TestJolt()&nbsp;{<br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;constructor&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@see</span><span style="color: #008000">&nbsp;HttpServlet#doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse<br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response)<br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doGet(HttpServletRequest&nbsp;request,<br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />
</span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bea.jolt.pool.servlet.ServletResult&nbsp;result;<br />
</span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(</span><span style="color: #000000">"</span><span style="color: #000000">text/html;charset=UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.PrintWriter&nbsp;out&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;response.getWriter();<br />
</span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;begin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletSessionPoolManager&nbsp;bool_mgr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(ServletSessionPoolManager)&nbsp;SessionPoolManager.poolmgr;<br />
</span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletSessionPool&nbsp;pool_session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(ServletSessionPool)&nbsp;bool_mgr<br />
</span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getSessionPool(</span><span style="color: #000000">"</span><span style="color: #000000">joltConnectionPool</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">set&nbsp;your&nbsp;weblogic's&nbsp;joltpool&nbsp;name</span><span style="color: #008000"><br />
</span><span style="color: #008080">42</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pool_session&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
</span><span style="color: #008080">44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;fail</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
</span><span style="color: #008080">46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
</span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(pool_session);<br />
</span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">50</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sendvalue;<br />
</span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendvalue&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getParameter(</span><span style="color: #000000">"</span><span style="color: #000000">STRING</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">this&nbsp;is&nbsp;your&nbsp;input&nbsp;parameter&nbsp;to&nbsp;the&nbsp;TOUPPER&nbsp;service.</span><span style="color: #008000"><br />
</span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(sendvalue);<br />
</span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">OK!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pool_session.call(</span><span style="color: #000000">"</span><span style="color: #000000">TOUPPER</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;request);<br />
</span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;return&nbsp;val：</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;result.getValue(</span><span style="color: #000000">"</span><span style="color: #000000">STRING</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">));<br />
</span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(bea.jolt.pool.SessionPoolException&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;busy</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(bea.jolt.pool.ServiceException&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">63</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080">65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(bea.jolt.pool.ApplicationException&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">66</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(bea.jolt.pool.servlet.ServletResult)&nbsp;e.getResult();<br />
</span><span style="color: #008080">68</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080">69</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">70</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">71</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080">72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">73</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
</span><span style="color: #008080">76</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">78</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">79</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">80</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@see</span><span style="color: #008000">&nbsp;HttpServlet#doPost(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse<br />
</span><span style="color: #008080">81</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response)<br />
</span><span style="color: #008080">82</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">83</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doPost(HttpServletRequest&nbsp;request,<br />
</span><span style="color: #008080">84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />
</span><span style="color: #008080">85</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doGet(request,&nbsp;response);<br />
</span><span style="color: #008080">86</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">87</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">88</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">89</span>&nbsp;</div>
<br />
<br />
5) deploy your web war to weblogic , and browser to access your servlet:<br />
&nbsp;&nbsp;&nbsp;&nbsp; URL :&nbsp; http://192.168.226.129:7001/TestJolt/TestJolt?STRING=aaaaaaaaaa
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/278060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 18:09 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>edit the vmare machine's memory manually</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278055.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278055.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/278055.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/278055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/278055.html</trackback:ping><description><![CDATA[go to the vmare machine's directory<br />
and fine the file named "Red Hat Linux.vmx"<br />
use your editor open this file , and fine the line begins with "memsize" <br />
now your can change your memory size.<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">.encoding&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">GBK</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />config.version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">8</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />virtualHW.version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">4</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />scsi0.present&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">TRUE</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<span style="color: red"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />memsize&nbsp;=&nbsp;"512"</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />MemAllowAutoScaleDown&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">FALSE</span><span style="color: #000000">"</span></div>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/278055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 17:35 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>install weblogic on Linux</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278038.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278038.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/278038.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/278038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/278038.html</trackback:ping><description><![CDATA[<strong>1 创建用户组weblogic</strong><br />
<span style="color: #0000ff"># groupadd weblogic</span><br />
<br />
<strong>2 创建用户weblogic, 它属于用户组weblogic, 密码为weblogic</strong><br />
<span style="color: #0000ff"># adduser -g weblogic -p weblogic weblogic</span><br />
<br />
<strong>3 安装WebLogic</strong><br />
<span style="color: #0000ff"># ./server816_ja_linux32.bin</span><br />
3.1 介绍, 下一步<br />
3.2 同意协议, 下一步<br />
3.3 选择BEA Home安装路径, 下一步<br />
3.4 选择完全安装, 下一步<br />
3.5 安装中<br />
3.6 选择WebLogic安装路径, 下一步<br />
3.7 安装完成, Done<br />
<br />
<strong>4 配置WebLogic</strong><br />
<span style="color: #0000ff"># cd /opt/weblogic/bea/weblogic81/common/bin</span><br />
<span style="color: #0000ff"># sh config.sh</span><br />
4.1 创建一个WebLogic配置文件, 下一步<br />
4.2 选择配置文件的模板Base WebLogic Server Domain, 下一步<br />
4.3 选用默认配置, 下一步<br />
4.4 创将管理用户, 用户名:weblogic, 密码:weblogic, 下一步<br />
4.5 选择JDK, 选中Sun SDK, 下一步<br />
4.6 创建WebLogic配置文件, 创建<br />
4.7 创建成功, Done<br />
<br />
<strong>5 启动WebLogic服务</strong><br />
<span style="color: #0000ff"># cd /opt/weblogic/bea/user_projects/domains/mydomain/</span><br />
<span style="color: #0000ff"># sh startWebLogic.sh</span><br />
<br />
<br />
<span style="color: red">COMMENT: you must wait and wait and wait SOME MINUTES, for the console is initialized .</span><br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/278038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 16:39 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>how to config jolt?</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278025.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278025.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/278025.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/278025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/278025.html</trackback:ping><description><![CDATA[refer : http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277988.html<br />
<br />
1) edit the ubbconfig file:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*RESOURCES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IPCKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">69345</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Example:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#IPCKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">123456</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DOMAINID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simpapp<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MASTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple<br />
<span style="color: red"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXACCESSERS&nbsp;&nbsp;&nbsp;&nbsp;100</span></span><span style="color: #000000"><br />
<span style="color: red"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXSERVERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXSERVICES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40<br />
</span></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MODEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SHM<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LDBAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*MACHINES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEFAULT:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/test/atmi</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/test/atmi/tuxconfig</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/oracle/tuxedo10gR3</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Example:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/me/simpapp</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/me/simpapp/tuxconfig</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/usr/tuxedo</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rhelserver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXWSCLIENTS</span><span style="color: #000000">=</span><span style="color: #000000">50</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*GROUPS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />GROUP1&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GRPNO</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;OPENINFO</span><span style="color: #000000">=</span><span style="color: #000000">NONE<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />WSGRP&nbsp;&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GRPNO</span><span style="color: #000000">=</span><span style="color: #000000">2</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JSLGRP&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GRPNO</span><span style="color: #000000">=</span><span style="color: #000000">100</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JREPGRP&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GRPNO</span><span style="color: #000000">=</span><span style="color: #000000">101</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*SERVERS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEFAULT:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOPT</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-A</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />simpserv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRVGRP</span><span style="color: #000000">=</span><span style="color: #000000">GROUP1&nbsp;SRVID</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />WSL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRVGRP</span><span style="color: #000000">=</span><span style="color: #000000">WSGRP&nbsp;SRVID</span><span style="color: #000000">=</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;RESTART</span><span style="color: #000000">=</span><span style="color: #000000">Y&nbsp;MAXGEN</span><span style="color: #000000">=</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;GRACE</span><span style="color: #000000">=</span><span style="color: #000000">3600</span><span style="color: #000000">&nbsp;CLOPT</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-A&nbsp;--&nbsp;-n//192.168.247.129:7110&nbsp;&nbsp;&nbsp;-m&nbsp;5&nbsp;-M&nbsp;10&nbsp;-x&nbsp;5</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<span style="color: red"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JSL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRVGRP=JSLGRP&nbsp;&nbsp;SRVID=100&nbsp;CLOPT="-A&nbsp;--&nbsp;-n&nbsp;//192.168.247.129:9110&nbsp;-m&nbsp;3&nbsp;-M&nbsp;10&nbsp;-x5"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JREPSVR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRVGRP=JREPGRP&nbsp;SRVID=101&nbsp;CLOPT="-A&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;-W&nbsp;-P&nbsp;/home/oracle/tuxedo10gR3/udataobj/jolt/repository/jrepository"<br />
</span></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*SERVICES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TOUPPER</span></div>
<br />
<span style="color: red">&nbsp;&nbsp; now ,you must compile the ubbconfig file , and boot youre tuxedo server.&nbsp;<br />
</span><span style="color: red">&nbsp;&nbsp;&nbsp; $ tmloadcf&nbsp;&nbsp; ubbsimple<br />
&nbsp;&nbsp;&nbsp; $ tmboot</span><br />
2)edit the&nbsp; jolt respository file:<br />
&nbsp;&nbsp;&nbsp;&nbsp; a) edit and save&nbsp;simpapp.rep: (<span style="color: red"><strong>YOUR MUST REMVE ALL THE BLANKS IN THE HEAD AND TAIL OF THE LINE.</strong></span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">service</span><span style="color: #000000">=</span><span style="color: #000000">TOUPPER<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />inbuf</span><span style="color: #000000">=</span><span style="color: #000000">STRING<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />outbuf</span><span style="color: #000000">=</span><span style="color: #000000">STRING<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />export</span><span style="color: #000000">=</span><span style="color: #000000">true<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />param</span><span style="color: #000000">=</span><span style="color: #000000">STRING<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />type</span><span style="color: #000000">=</span><span style="color: #000000">string<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />access</span><span style="color: #000000">=</span><span style="color: #000000">inout</span></div>
<br />
&nbsp;&nbsp; b) config the JAVA's CLASSPATH and run jbld command and import the simpapp.rep to jolt respository<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ export&nbsp; CLASSPATH=.:/home/oracle/jrockit_160_05/lib/dt.jar:/home/oracle/jrockit_160_05/lib/tools.jar:/home/oracle/tuxedo10gR3/<br />
udataobj/jolt/jolt.jar:/home/oracle/tuxedo10gR3/udataobj/jolt/joltadmin.jar&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ <span style="color: red">java bea.jolt.admin.jbld -p SIMPSERV //192.168.247.129:9110&nbsp; simpapp.rep<br />
<br />
<br />
3)&nbsp;&nbsp; write your java code in your client. certarnly, you must config your classpath.<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">import&nbsp;bea.jolt.JoltRemoteService</span><span style="color: #008000">;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">import&nbsp;bea.jolt.JoltSession</span><span style="color: #008000">;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">import&nbsp;bea.jolt.JoltSessionAttributes</span><span style="color: #008000">;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />public&nbsp;class&nbsp;Test&nbsp;{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String</span><span style="font-weight: bold; color: #800000">[]</span><span style="color: #000000">&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JoltSession&nbsp;session</span><span style="color: #008000">;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JoltSessionAttributes&nbsp;sattr</span><span style="color: #008000">;<br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JoltRemoteService&nbsp;toupper</span><span style="color: #008000">;<br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sattr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;new&nbsp;JoltSessionAttributes()</span><span style="color: #008000">;<br />
</span><span style="color: #008080">13</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sattr.setString(JoltSessionAttributes.APPADDRESS</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">//192.168.247.129:9110</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #008000">;<br />
</span><span style="color: #008080">14</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sattr.setInt(JoltSessionAttributes.IDLETIMEOUT</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">300</span><span style="color: #000000">)</span><span style="color: #008000">;<br />
</span><span style="color: #008080">15</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;new&nbsp;JoltSession(sattr</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;null</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;null</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;null</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;null)</span><span style="color: #008000">;</span><span style="color: #008000">&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toupper&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;new&nbsp;JoltRemoteService(</span><span style="color: #000000">"</span><span style="color: #000000">TOUPPER</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;session)</span><span style="color: #008000">;<br />
</span><span style="color: #008080">18</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toupper.setString(</span><span style="color: #000000">"</span><span style="color: #000000">STRING</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">hello,wolrd!</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #008000">;<br />
</span><span style="color: #008080">19</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toupper.call(null)</span><span style="color: #008000">;<br />
</span><span style="color: #008080">20</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(toupper.getStringDef(</span><span style="color: #000000">"</span><span style="color: #000000">STRING</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;null))</span><span style="color: #008000">;<br />
</span><span style="color: #008080">21</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.endSession()</span><span style="color: #008000">;<br />
</span><span style="color: #008080">22</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}</span></div>
<br />
</span>&nbsp;&nbsp; 
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/278025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 16:03 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/278025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java通过Jolt调用Tuxedo服务 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277993.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277993.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277993.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277993.html</trackback:ping><description><![CDATA[<p>http://blog.csdn.net/liwei_cmg/archive/2006/06/02/769150.aspx<br />
<br />
http://blog.csdn.net/liwei_cmg/archive/2006/06/03/771906.aspx<br />
<br />
Java通过Jolt调用Tuxedo服务</p>
<p>草木瓜 2006-6-1</p>
<p>------------------------<br />
一、简介<br />
------------------------</p>
<p>外部应用访问Tuxedo服务是很经常的事，一般有两种方法WTC和Jolt,网上很多关于Jolt调用Tuxedo服务<br />
文章，描述的太多笼统，其实通过Jolt并不是很复杂的事情，这里使用Eclipse3.1+Jolt+WebLogic8.1<br />
+Tuxedo9.0环境描述调用服务的全过程。</p>
<p>Jolt是Bea Tuxedo自带的jar组件，在Tuxedo9.0的安装过程中可以看到安装的Jolt组件。</p>
<p>调用服务理论步骤是这样的：</p>
<p>1.先准备Tuxedo服务端代码<br />
2.在Tuxedo中配置Jolt相关文件<br />
3.启动Tuxedo服务<br />
4.配置WebLogic服务与Tuxedo Jolt相关的参数<br />
5.配置Eclipse3.1启动WebLogic服务<br />
6.编写Eclipse Servlet代码，运行调用服务。</p>
<p>本例使用了《Windows Tuxedo的安装配置-数据库补充》一文中的Tuxedo数据服务文件，所以在启动<br />
Tuxedo服务前，必须先启动数据库实例，因为在tpsvinit()里面就配置了数据连接。关于Tuxedo配置<br />
要点需参阅《Tuxedo的安装配置-...》的四篇文章。</p>
<p>------------------------<br />
二、Tuxedo服务文件全代码<br />
------------------------</p>
<p>这里把server.pc服务文件代码再次列出。其中包括三个服务DBREAD（读数据库）和TOUPPER（转换大写）。<br />
本例不使用TOUPPER，所以不用理会那段代码。</p>
<p>其中<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#105;&#119;&#101;&#105;&#47;&#108;&#105;&#119;&#101;&#105;&#64;&#119;&#105;&#110;&#100;&#98;">liwei/liwei@windb</a>连接的表tuxedo_test，结构如下：</p>
<p>CREATE TABLE TUXEDO_TEST(<br />
ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(2),<br />
NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(10)<br />
)</p>
<p>ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
------------------------<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aaaaaaa<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bbbbbbb</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;ctype.h&gt;<br />
#include &lt;atmi.h&gt;&nbsp;/* TUXEDO Header File */<br />
#include &lt;userlog.h&gt;&nbsp;/* TUXEDO Header File */</p>
<p>EXEC SQL BEGIN DECLARE SECTION;<br />
VARCHAR ora_no[2];<br />
int ora_id;<br />
VARCHAR ora_value[10];<br />
VARCHAR ora_cn[30];<br />
EXEC SQL END DECLARE SECTION;<br />
EXEC SQL INCLUDE sqlca;</p>
<p>tpsvrinit()<br />
{<br />
&nbsp;&nbsp;strcpy(ora_cn.arr,"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#105;&#119;&#101;&#105;&#47;&#108;&#105;&#119;&#101;&#105;&#64;&#119;&#105;&#110;&#100;&#98;">liwei/liwei@windb</a>");<br />
&nbsp;&nbsp;ora_cn.len = strlen(ora_cn.arr);<br />
&nbsp;&nbsp;ora_cn.arr[ora_cn.len]='\0';</p>
<p>&nbsp;&nbsp;//EXEC SQL WHENEVER SQLERROR GOTO cnError;<br />
&nbsp;&nbsp;EXEC SQL CONNECT :ora_cn;<br />
&nbsp;&nbsp;return(0);<br />
}<br />
tpsrvdone()<br />
{<br />
&nbsp;&nbsp;EXEC SQL COMMIT WORK RELEASE;<br />
}</p>
<p>DBREAD(TPSVCINFO *rqst)<br />
{<br />
&nbsp;<br />
&nbsp;strcpy(ora_no.arr,(char *)rqst-&gt;data);<br />
&nbsp;ora_no.len=strlen(ora_no.arr);<br />
&nbsp;ora_no.arr[ora_no.len]='\0';</p>
<p>&nbsp;userlog("ERRSRV: %s",ora_no.arr);<br />
&nbsp;EXEC SQL select name into :ora_value from tuxedo_test where id=:ora_no;<br />
&nbsp;if(sqlca.sqlcode!=0)<br />
&nbsp;{<br />
&nbsp;&nbsp;userlog("ERRSRV: select name from tuxedo_test where id=, sqlcode=%ld , sqlerr=\n",sqlca.sqlcode);<br />
&nbsp;&nbsp;strcpy(rqst-&gt;data,sqlca.sqlerrm.sqlerrmc);<br />
&nbsp;&nbsp;tpreturn(TPFAIL, 0, rqst-&gt;data, 0L, 0);<br />
&nbsp;}</p>
<p>&nbsp;/* Return the transformed buffer to the requestor. */<br />
&nbsp;strset(rqst-&gt;data,"");<br />
&nbsp;strcpy(rqst-&gt;data,ora_value.arr);<br />
&nbsp;tpreturn(TPSUCCESS, 0, rqst-&gt;data, 0L, 0);<br />
}</p>
<p>TOUPPER(TPSVCINFO *rqst)<br />
{</p>
<p>&nbsp;int i;</p>
<p>&nbsp;for(i = 0; i &lt; rqst-&gt;len-1; i++)<br />
&nbsp;&nbsp;rqst-&gt;data[i] = toupper(rqst-&gt;data[i]);</p>
<p>&nbsp;/* Return the transformed buffer to the requestor. */<br />
&nbsp;tpreturn(TPSUCCESS, 0, rqst-&gt;data, 0L, 0);<br />
}</p>
<p>------------------------<br />
三、编译服务<br />
------------------------</p>
<p>编译命令的注意事项，以前Tuxedo系列文章都提过。</p>
<p>proc server.pc include=%TUXDIR%\include<br />
buildserver -o server -f server.c -s DBREAD -s TOUPPER -v -l orasql9.lib</p>
<p>------------------------<br />
四、配置Tuxedo服务的config文件<br />
------------------------</p>
<p>完全文件如下：</p>
<p>#Liwei</p>
<p>*RESOURCES<br />
IPCKEY&nbsp;&nbsp;123456<br />
DOMAINID&nbsp;liweiapp<br />
MASTER&nbsp;&nbsp;lw<br />
MAXACCESSERS&nbsp;150<br />
MAXSERVERS&nbsp;100<br />
MAXSERVICES&nbsp;100<br />
MODEL&nbsp;&nbsp;SHM<br />
LDBAL&nbsp;&nbsp;N</p>
<p>*MACHINES<br />
LWYM<br />
&nbsp;LMID = lw <br />
&nbsp;TUXDIR = "E:\bea\tuxedo9.0"<br />
&nbsp;TUXCONFIG = "G:\Liwei\Tuxedo\dbread\tuxconfig"<br />
&nbsp;APPDIR = "G:\Liwei\Tuxedo\dbread"<br />
&nbsp;MAXWSCLIENTS=1<br />
&nbsp;TLOGDEVICE = "G:\Liwei\Tuxedo\dbread\TLOG"<br />
&nbsp;TLOGNAME=TLOG<br />
&nbsp;TLOGSIZE = 100<br />
&nbsp;<br />
*GROUPS</p>
<p>APPGRP&nbsp;LMID=lw GRPNO = 1 </p>
<p>#OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=." <br />
#TMSNAME="TMS_ORA9i" TMSCOUNT=2</p>
<p>JSLGRP&nbsp; LMID=lw GRPNO = 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
JREPGRP LMID=lw GRPNO = 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>*SERVERS<br />
server SRVGRP=APPGRP SRVID=1</p>
<p>#WSL&nbsp;SRVGRP=APPGRP SRVID =300 <br />
#CLOPT="-A -- -n //192.168.0.166:8888 -d/dev/tcp -m1 -M5 -x 10"</p>
<p>JSL SRVGRP=JSLGRP SRVID=301<br />
CLOPT="-A -- -n //192.168.0.166:9878 -M 10 -x 10 -m 2"</p>
<p>JREPSVR SRVGRP=JREPGRP SRVID=302<br />
CLOPT="-A -- -W -P E:\bea\tuxedo9.0\udataobj\jolt\repository\jrepository"</p>
<p>*SERVICES<br />
DBREAD<br />
TOUPPER</p>
<p>细心一看，这个config文件比在*GROUPS和*SERVERS各加了两项对应内容：</p>
<p>JSLGRP&nbsp; LMID=lw GRPNO = 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
JREPGRP LMID=lw GRPNO = 3&nbsp;&nbsp;&nbsp;&nbsp; <br />
和<br />
JSL SRVGRP=JSLGRP SRVID=301<br />
CLOPT="-A -- -n //192.168.0.166:9878 -M 10 -x 10 -m 2"<br />
JREPSVR SRVGRP=JREPGRP SRVID=302<br />
CLOPT="-A -- -W -P E:\bea\tuxedo9.0\udataobj\jolt\repository\jrepository"</p>
<p>这两项是用于jolt的访问接口。JSL和JREPSVR必须是独自的GROUP，由于外部调用通过JSL和JREPSVR直接于<br />
Tuxedo服务通信，WSL就没用了。JSL的主机地址是Tuxedo服务器地址，端口是随意指定的，不要与其他重复<br />
即可，一般设置的大一点。在config里面加入这此内容后，config文件就Ok了。</p>
<p>------------------------<br />
五、配置jrepository文件<br />
------------------------</p>
<p>直接打开E:\bea\tuxedo9.0\udataobj\jolt\repository\jrepository文件添加以下内容：</p>
<p>add SVC/DBREAD:vs=1:ex=1:bt=STRING:\<br />
&nbsp;bp:pn=STRING:pt=string:pf=167772161:pa=rw:ep:<br />
add PKG/SIMPSERV:DBREAD:</p>
<p>这个文件如果没有DBREAD配置，调用会提示DBREAD not avaliable，DBREAD配置错误，会提示DBREAD has<br />
been modifed ...</p>
<p>对这个文件操作还有以下两种方式：</p>
<p>方式一：在IE打开E:\bea\tuxedo9.0\udataobj\jolt\RE.html，是个java applet，里面是图形界面，添加<br />
&nbsp;完服务，设置好参数即可。具体方法可以查阅网上资料，有图文解说的。<br />
方式二：在命令行键入Java bea.jolt.admin.jbld //192.168.0.166:9878 services.rep，其中//192..要与<br />
JSL的设置一致。services.rep是随意的一个文件，不过文件内容绝对不随意，如下：</p>
<p>service=DBREAD<br />
inbuf=STRING<br />
outbuf=STRING<br />
export=true<br />
param=STRING<br />
type=string<br />
access=inout</p>
<p>要执行这个命令设置jdk环境变量是必不可少的，PATH，CLASSPATH。我的CLASSPATH加入了以下内容，<br />
E:\bea\tuxedo9.0\udataobj\jolt\joltwls.jar;<br />
E:\bea\tuxedo9.0\udataobj\jolt\joltjse.jar;<br />
E:\bea\tuxedo9.0\udataobj\jolt\jolt.jar;<br />
E:\bea\tuxedo9.0\udataobj\jolt\joltadmin.jar<br />
个人认为对于这个java命令joltadmin是必须的，其他三个没用，不过没有亲自尝试。</p>
<p>方式一，二修改后，jrepository文件会显得比较乱，所以我不喜欢！最好是自已手工修改。</p>
<p><br />
------------------------<br />
六、编译启动服务<br />
------------------------</p>
<p>当然，数据库必须要有了，编译config后，启动tuxedo服务。<br />
tmloadcf -y config<br />
tmboot -y</p>
<p>提示如下：</p>
<p>exec BBL -A :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process id=3520 ... Started.</p>
<p>Booting server processes ...</p>
<p>exec server -A :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process id=3812 ... Started.<br />
exec JSL -A -- -n //192.168.0.166:9878 -M 10 -x 10 -m 2 :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process id=252 ... Started.<br />
exec JREPSVR -A -- -W -P E:\bea\tuxedo9.0\udataobj\jolt\repository\jrepository :</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process id=2920 ... Started.<br />
4 processes started.</p>
<p><br />
------------------------<br />
七、配置Eclipse3.1<br />
------------------------</p>
<p>我们要在Eclipse里面启动WebLogic服务，《Eclipse3.1 Web开发配置》一文中已经说明了，如何配置<br />
WebLogic8.1的服务器，这里对WebLogic的服务本身也要做此必要的配置。</p>
<p>打开选用的WebLogic8.1服务路径，编辑config.xml文件，本机位置G:\Liwei\WebLogic\WebServer\config.xml。<br />
加入如下内容：</p>
<p>&nbsp;&nbsp;&nbsp; &lt;JoltConnectionPool FailoverAddresses="//192.168.0.166:9878"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaximumPoolSize="2" MinimumPoolSize="1" Name="JoltPool"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrimaryAddresses="//192.168.0.166:9878"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SecurityContextEnabled="false" Targets="webServer"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;StartupClass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassName="bea.jolt.pool.servlet.weblogic.PoolManagerStartUp"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadBeforeAppActivation="true" Name="MyStartup" Targets="webServer"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ShutdownClass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassName="bea.jolt.pool.servlet.weblogic.PoolManagerShutDown"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name="MyShutdown" Targets="webServer"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
这里要说明一下：PrimaryAddresses，FailoverAddresses地址是前面Tuxedo配置文件指定的JSL地址和端口<br />
SecurityContextEnabled一定要是false!所有name是随意的，StartupClass和ShutdownClass的ClassName<br />
绝对不能错！</p>
<p>除此方法，还可以通过Weblogic服务的控制台进行管理。启动服务后，在<a href="http://localhost:7001/console/">http://localhost:7001/console/</a><br />
登陆后的主页面上选择 连接性-&gt;通过 JOLT 的 Tuxedo&nbsp; -&gt;配置新的Jolt 连接缓冲池...输入参数内容就是<br />
上面config.xml的参数。另外首页中 已部署的资源 -&gt;启动和关闭 需要设置两个Class，参数也同上。</p>
<p><br />
连接性-&gt;通过 JOLT 的 Tuxedo&nbsp; -&gt;配置新的Jolt 连接缓冲池...</p>
<p>①进入选项卡的General(常规),输入参数:<br />
Name:&nbsp;&nbsp; JoltPool<br />
Minimum Pool Size:&nbsp; 1 <br />
Maximum Pool Size:&nbsp;&nbsp; 2<br />
Recv Timeout:&nbsp; 0<br />
点击Apply应用按纽<br />
②进入选项卡的Addresses(地址),输入参数:<br />
Primary Addresses: //192.168.0.166:9878<br />
Failover Addresses: //192.168.0.166:9878<br />
点击Apply应用按纽<br />
③进入Targets栏：<br />
选中myserver<br />
点击Apply应用按纽.</p>
<p>已部署的资源 -&gt;启动和关闭 分别配置StartUp,ShutDown的Class</p>
<p>①进入Configuration(设置)<br />
在ClassName:中输入: bea.jolt.pool.servlet.weblogic.PoolManagerStartUp,<br />
其它采用默认值。<br />
②进入Targets(目标)栏：<br />
选中myserver,点击Apply应用按纽.</p>
<p>①进入Configuration(设置)<br />
在ClassName:中输入: bea.jolt.pool.servlet.weblogic.PoolManagerShutDown,<br />
其它采用默认值。<br />
②进入Targets(目标)：<br />
选中myserver,点击Apply应用按纽.</p>
<p>到这里config.xml文件就设置完了，下面需要编辑startWebLogic.cmd，加入对jolt jar的引用，否则jolt<br />
是启动失败的。在echo CLASSPATH=%CLASSPATH%前加入以下代码，设置CLASSPATH，这里classpath跟外部环境<br />
变量是两码事。</p>
<p>set CLASSPATH=%CLASSPATH%;E:\bea\tuxedo9.0\udataobj\jolt\jolt.jar;E:\bea\tuxedo9.0\udataobj\jolt\joltwls.jar;E:\bea\tuxedo9.0\udataobj\jolt\joltjse.jar</p>
<p>设置完后，重启服务，在Eclipse管理WebLogic服务时如果出现启动关闭不成功，多试几次就可以了。<br />
在启动的console界面里如果出现以下内容，就说明jolt pool启动成功！</p>
<p>&lt;2006-6-1 下午09时12分55秒 CST&gt; &lt;Notice&gt; &lt;WebLogicServer&gt; &lt;BEA-000327&gt; &lt;Starting WebLogic Admin Server "webServer" for domain "WebServer"&gt; <br />
Jolt pool deployed for webServer<br />
&lt;2006-6-1 下午09时13分13秒 CST&gt; &lt;Notice&gt; &lt;Security&gt;...</p>
<p><br />
------------------------<br />
八、Eclipse3.1编写Servlet代码<br />
------------------------</p>
<p>首先需要在所建工程-&gt;右键-&gt;Properties-&gt;Java BuildPath -&gt;Library-&gt;Add External jars ..添加jolt的jar包<br />
这里需要三个jar包，如下：<br />
E:\bea\tuxedo9.0\udataobj\jolt\jolt.jar<br />
E:\bea\tuxedo9.0\udataobj\jolt\joltjse.jar<br />
E:\bea\tuxedo9.0\udataobj\jolt\joltwls.jar<br />
&nbsp;<br />
添加jar完后，建立一个主页面index.jsp和一个Servlet。关于Eclipse3.1配置Servlet在《Eclipse3.1 Web开发配置》<br />
一文也有说明。这里Servlet名为liwei.java,具体内容如下：</p>
<p>index.jsp</p>
<p>&lt;body&gt;<br />
&lt;form id=form1 name="form1" action=liwei method=post&gt;<br />
&lt;input type="text" name="STRING" value="1"&gt;<br />
&lt;input type=submit value=submit&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;</p>
<p>说明：name要是STRING,用来传递参数，action是liwei.java即Servlet。</p>
<p>liwei.java</p>
<p><br />
&nbsp;public class liwei extends javax.servlet.http.HttpServlet&nbsp; <br />
&nbsp;{<br />
&nbsp; <br />
&nbsp;//声明管理连接池的变量<br />
&nbsp;private bea.jolt.pool.servlet.ServletSessionPoolManager bool_mgr = (bea.jolt.pool.servlet.ServletSessionPoolManager) bea.jolt.pool.SessionPoolManager.poolmgr;</p>
<p>&nbsp;public void init(javax.servlet.ServletConfig config) throws javax.servlet.ServletException <br />
&nbsp;{<br />
&nbsp;&nbsp;//初始化servlet<br />
&nbsp;&nbsp;super.init(config);<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;public void destroy() {<br />
&nbsp;&nbsp;//关闭servlet<br />
&nbsp;&nbsp;bool_mgr = null;<br />
&nbsp;}&nbsp;<br />
&nbsp;<br />
&nbsp;protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) <br />
&nbsp;throws javax.servlet.ServletException, java.io.IOException <br />
&nbsp;{<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;bea.jolt.pool.servlet.ServletResult result;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//设置页面类型，如果没有charset，显示汉字会乱码<br />
&nbsp;&nbsp;response.setContentType("text/html;charset=UTF-8");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;java.io.PrintWriter out =response.getWriter();<br />
&nbsp;&nbsp;out.println("&lt;html&gt;");<br />
&nbsp;&nbsp;out.println("&lt;body&gt;");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//System.out.println("TEST________________________1");</p>
<p>&nbsp;&nbsp; //获取在WebLogic服务定义好的连接池,JoltPool<br />
&nbsp;&nbsp; bea.jolt.pool.servlet.ServletSessionPool pool_session = (bea.jolt.pool.servlet.ServletSessionPool)<br />
&nbsp;&nbsp; bool_mgr.getSessionPool("JoltPool");</p>
<p>&nbsp;&nbsp;&nbsp; if (pool_session == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("获取Tuxedo服务失败。"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;br&gt;"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "确认Tuxedo服务已启动且配置正确。"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;/font&gt;&lt;/body&gt;&lt;/html&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; System.out.println(pool_session);<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; String sendvalue;<br />
&nbsp;&nbsp;&nbsp; sendvalue=request.getParameter("STRING");<br />
&nbsp;&nbsp;&nbsp; System.out.println(sendvalue);<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 调用服务<br />
&nbsp;&nbsp;&nbsp; try <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("OK!");<br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;//调用服务DBREAD<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = pool_session.call("DBREAD", request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("传递的参数 = " + sendvalue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("Tuxedo服务成功调用。 ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //跟据传递的变量STRING值，获取返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("返回值："+result.getValue("STRING", ""));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (bea.jolt.pool.SessionPoolException e) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 连接池繁忙<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("此时请求不能被处理。\n"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "错误信息: "+e.getMessage()+"\n"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "可能的原因：1.无效的连接池 2.连接池已关闭");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (bea.jolt.pool.ServiceException e) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; // 服务出错，这里主要是Tuxedo的服务配置，jrepository文件出错<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("错误信息："+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Error message:"+e.getMessage()+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Error number:"+e.getErrno());<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (bea.jolt.pool.ApplicationException e) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 应用程序出错<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = (bea.jolt.pool.servlet.ServletResult) e.getResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("错误代码："+result.getApplicationCode());<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (Exception e) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("意外错误："+e);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; out.println("&lt;/body&gt;&lt;/html&gt;\n");<br />
&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;}&nbsp;<br />
&nbsp;<br />
&nbsp;protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) <br />
&nbsp;throws javax.servlet.ServletException, java.io.IOException <br />
&nbsp;{<br />
&nbsp;&nbsp;this.doGet(request,response);<br />
&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <br />
}</p>
<p><br />
------------------------<br />
九、RUN<br />
------------------------</p>
<p>Run on server ，点击Submit，显示 传递的参数 = 1 Tuxedo服务成功调用。 返回值：aaaaaaa !<br />
<br />
<br />
=======================<br />
<br />
</p>
<p>Java通过Jolt访问Tuxedo服务-补充说明</p>
<p>草木瓜</p>
<p>2006-6-2</p>
<p>一、页面参数文件说明以及通过WebLogic调用Tuxedo服务</p>
<p>《Java通过Jolt访问Tuxedo服务》一文是在Eclipse环境下开发调用Tuxedo服务。</p>
<p>其中在index.asp和liwei.java中有这么几句语句：</p>
<p>index.asp</p>
<p>&lt;form id=form1 name="form1" action=liwei method=post&gt;<br />
&lt;input type="text" name="STRING" value="1"&gt;<br />
&lt;input type=submit value=submit&gt;</p>
<p>liwei.java</p>
<p>//跟据传递的变量STRING值，获取返回值<br />
out.println("返回值："+result.getValue("STRING", ""));</p>
<p>这两段的STRING是不可以随便替换的，这必须与E:\bea\tuxedo9.0\udataobj\jolt\repository<br />
下jrepository文件描述的服务参数相一致！且必须为大写！即：</p>
<p>add SVC/DBREAD:vs=1:ex=1:bt=STRING:\<br />
&nbsp;bp:pn=STRING:pt=string:pf=167772161:pa=rw:ep:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这里面定义的参数就是STRING<br />
add PKG/SIMPSERV:DBREAD:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
下面用WebLogic对Tuxedo服务调用再详细的举例说明。</p>
<p>WebLogic通过jolt调用Tuxedo服务，有了上文的前提就显得很容易，说白了只是Servlet与Jsp的一点<br />
小转换。除了最后一步在Eclipse3.1编写Servlet代码，其他的前提步骤是必须的。WebLogic要使用<br />
Jolt接口，同样需要jolt,joltjse,joltwls三个jar包，将它们Copy到WEB-INF下的lib文件夹即可。</p>
<p>以下是完整的示例，参数名用大写的TEST。</p>
<p>index.jsp<br />
---------------------------------</p>
<p>&lt;form action="_test/testTuxedo.jsp" method="post"&gt;<br />
&lt;p&gt;<br />
&lt;input type="text" value="1" name="TEST" id="text1"&gt;&lt;input type="submit" value="tuxedo"&gt; <br />
&lt;/p&gt;<br />
&lt;/form&gt;</p>
<p>testTuxedo.jsp<br />
---------------------------------</p>
<p>&lt;body&gt;<br />
&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bea.jolt.pool.servlet.ServletSessionPoolManager bool_mgr = (bea.jolt.pool.servlet.ServletSessionPoolManager) bea.jolt.pool.SessionPoolManager.poolmgr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bea.jolt.pool.servlet.ServletResult result;<br />
&nbsp;&nbsp;&nbsp;&nbsp; //获取在WebLogic服务定义好的连接池<br />
&nbsp;&nbsp;&nbsp;&nbsp; bea.jolt.pool.servlet.ServletSessionPool pool_session = (bea.jolt.pool.servlet.ServletSessionPool)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool_mgr.getSessionPool("JoltPool");<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (pool_session == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("获取Tuxedo服务失败。"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;br&gt;"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "确认Tuxedo服务已启动且配置正确。");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 调用服务<br />
&nbsp;&nbsp;&nbsp;&nbsp; try <br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = pool_session.call("DBREAD", request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("OK!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("传递的参数 = " + sendvalue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("Tuxedo服务成功调用。 ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("返回值："+result.getValue("TEST", ""));<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; catch (bea.jolt.pool.SessionPoolException e) <br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 连接池繁忙<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("此时请求不能被处理。\n"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "错误信息: "+e.getMessage()+"\n"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "可能的原因：1.无效的连接池 2.连接池已关闭");<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; catch (bea.jolt.pool.ServiceException e) <br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 服务出错<br />
&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("Error："+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Error message:"+e.getMessage()+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Error number:"+e.getErrno());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; catch (bea.jolt.pool.ApplicationException e) <br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 应用程序出错<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = (bea.jolt.pool.servlet.ServletResult) e.getResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("错误代码："+result.getApplicationCode());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e) <br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("意外错误："+e);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; %&gt;<br />
&lt;/p&gt;<br />
&lt;/body&gt;</p>
<p><br />
二、典型的服务应用</p>
<p>Oracle服务器&nbsp;&nbsp; 192.168.0.111<br />
Tuxedo服务器&nbsp;&nbsp; 192.168.0.66<br />
Web服务器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>通过Web客户端访问Web服务器，调用Tuxedo服务访问数据库</p>
<p>1.配置Tuxedo服务器的Oracle连接字符串(TNSNAME)。注意Oracle服务器的防火墙</p>
<p>WINDB =<br />
&nbsp; (DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1521))<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = wincn)<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp; )<br />
&nbsp; <br />
2.配置Tuxedo的jrepository文件<br />
3.配置Tuxedo的Config文件,JSR服务的IP与端口要与本地IP一致。</p>
<p>JSL SRVGRP=JSLGRP SRVID=301<br />
CLOPT="-A -- -n //192.168.0.66:9988 -M 10 -x 10 -m 2"</p>
<p>4.配置Web服务器的WebServer，config.xml中ip与端口即为Tuxedo服务器的JSR服务IP与端口<br />
注意Tuxedo服务器的防火墙。</p>
<p>&lt;JoltConnectionPool FailoverAddresses="//192.168.0.66:9988"<br />
&nbsp;&nbsp;&nbsp; MaximumPoolSize="2" MinimumPoolSize="1" Name="JoltPool"<br />
&nbsp;&nbsp;&nbsp; PrimaryAddresses="//192.168.0.66:9988"<br />
&nbsp;&nbsp;&nbsp; SecurityContextEnabled="false" Targets="webServer"/&gt;</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 14:01 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下Tuxedo的安装与配置 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277992.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277992.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277992.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277992.html</trackback:ping><description><![CDATA[http://blog.csdn.net/liwei_cmg/archive/2006/05/28/759301.aspx<br />
<br />
<a href="http://blog.csdn.net/liwei_cmg/archive/2006/05/29/759803.aspx">http://blog.csdn.net/liwei_cmg/archive/2006/05/29/759803.aspx</a><br />
<br />
<br />
<p>Windows下Tuxedo的安装与配置-数据库</p>
<p>草木瓜 2005-5-18</p>
<p>一、准备数据库环境</p>
<p>&nbsp; 这里使用的是Linux+Oracle9的虚拟机数据库环境。本机配置Tuxedo服务器。在上篇无数据库配置<br />
&nbsp; 基础上，配置Tuxedo服务器连接Oracle理解起来就相对简单了。这里采用XA方式连接数据库。</p>
<p>二、准备客户端，服务端的应用程序 <br />
&nbsp; <br />
&nbsp; 这里是自已写的代码。<br />
&nbsp; <br />
&nbsp; client.c<br />
&nbsp; <br />
#include &lt;stdio.h&gt;<br />
#include &lt;atmi.h&gt;&nbsp;&nbsp;/* TUXEDO&nbsp; Header File */</p>
<p>main(int argc, char *argv[])<br />
{<br />
&nbsp;char *sendbuf;<br />
&nbsp;long sendlen=1024;<br />
&nbsp;int ret;</p>
<p>&nbsp;<br />
&nbsp;if(argc != 2) {<br />
&nbsp;&nbsp;(void) fprintf(stderr, "args not exist\n");<br />
&nbsp;&nbsp;exit(1);<br />
&nbsp;}</p>
<p>&nbsp;/* 与服务器建立连接 */<br />
&nbsp;if (tpinit((TPINIT *) NULL) == -1) <br />
&nbsp;{<br />
&nbsp;&nbsp;(void) fprintf(stderr, "Tpinit failed\n");<br />
&nbsp;&nbsp;exit(1);<br />
&nbsp;}</p>
<p>&nbsp;/* 分配发送缓冲 */<br />
&nbsp;sendbuf = (char *) tpalloc("STRING", NULL, sendlen);<br />
&nbsp;if (sendbuf== (char *)NULL) <br />
&nbsp;{<br />
&nbsp;&nbsp;(void) fprintf(stderr,"Error allocating send buffer\n");<br />
&nbsp;&nbsp;tpterm();<br />
&nbsp;&nbsp;exit(1);<br />
&nbsp;}</p>
<p>&nbsp;(void) strcpy(sendbuf, argv[1]);<br />
&nbsp;(void) fprintf(stdout, "InputValue: %s\n", argv[1]);</p>
<p>&nbsp;/* 向服务发送请求 */<br />
&nbsp;ret = tpcall("DBSERV", (char *)sendbuf, 0L, (char **)&amp;sendbuf, &amp;sendlen, 0L);<br />
&nbsp;if(ret == -1) {<br />
&nbsp;&nbsp;(void) fprintf(stderr, "Can't send request to service DBREAD\n");<br />
&nbsp;&nbsp;(void) fprintf(stderr, "Tperrno = %d\n", tperrno);<br />
&nbsp;&nbsp;tpfree(sendbuf);<br />
&nbsp;&nbsp;tpterm();<br />
&nbsp;&nbsp;exit(1);<br />
&nbsp;}</p>
<p>&nbsp;(void) fprintf(stdout, "Returned string is: %s\n", sendbuf);<br />
&nbsp;<br />
&nbsp;/* Free Buffers &amp; Detach from System/T */<br />
&nbsp;tpfree(sendbuf);<br />
&nbsp;tpterm();<br />
&nbsp;return(0);<br />
}</p>
<p>&nbsp; server.pc 这里用到了ProC的一些方法<br />
&nbsp;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;ctype.h&gt;<br />
#include &lt;atmi.h&gt;&nbsp;/* TUXEDO Header File */<br />
#include &lt;userlog.h&gt;&nbsp;/* TUXEDO Header File */</p>
<p>EXEC SQL INCLUDE sqlca;</p>
<p>EXEC SQL BEGIN DECLARE SECTION;</p>
<p>VARCHAR ora_no[2];<br />
VARCHAR ora_value[10];<br />
EXEC SQL END DECLARE SECTION;</p>
<p>DBREAD(TPSVCINFO *rqst)<br />
{</p>
<p>&nbsp;strcpy(ora_no.arr,(char *)rqst-&gt;data);<br />
&nbsp;ora_no.len=strlen(ora_no.arr);<br />
&nbsp;ora_no.arr[ora_no.len]='\0';<br />
&nbsp;<br />
&nbsp;userlog("ERRSRV: %s",ora_no.arr);<br />
&nbsp;EXEC SQL select name into :ora_value from tuxedo_test where id=:ora_no;<br />
&nbsp;if(sqlca.sqlcode!=0)<br />
&nbsp;{<br />
&nbsp;&nbsp;userlog("ERRSRV: select name from tuxedo_test where id=, sqlcode=%ld \n",sqlca.sqlcode);<br />
&nbsp;&nbsp;tpreturn(TPFAIL, 0, rqst-&gt;data, 0L, 0);<br />
&nbsp;}</p>
<p>&nbsp;strcpy(rqst-&gt;data,ora_value.arr);<br />
&nbsp;tpreturn(TPSUCCESS, 0, rqst-&gt;data, 0L, 0);<br />
}</p>
<p>三、编译客户端，服务端代码</p>
<p>&nbsp; buildclient -o client -f client.c -v<br />
&nbsp; <br />
&nbsp; 对pc文件，须首先编译为c，然后再编译为服务。在proc编译的过程，会出现link错误，这是因为tuxedo本身<br />
&nbsp; 带的sqlca.h与oracle proc冲突，将C:\bea\tuxedo9.0\include\sqlca.h改名即可。<br />
&nbsp; proc server.pc include=%TUXDIR%/include<br />
&nbsp; buildserver -o server -f server.c -r Oracle_XA -s DBREAD -v</p>
<p>&nbsp;<br />
四、配置Tuxedo的RM文件</p>
<p>&nbsp; 本地Tuxedo9.0安装路径为C:\bea\tuxedo9.0。<br />
&nbsp; 打开C:\bea\tuxedo9.0\udataobj路径下的rm文件。找到Oracle_XA:这句，可以注释掉，然后增加下面内容。<br />
&nbsp; Oracle_XA;xaosw;E:\oracle\ora92\rdbms\XA\ORAXA9.LIB E:\oracle\ora92\precomp\lib\orasql9.lib<br />
&nbsp; 注：本机如果没有装服务版的Oracle,可能找不到对应库文件，可从服务器端复制过来即可。<br />
&nbsp; <br />
&nbsp; 这两个lib是用于编译tms文件的，tuxedo通过TMS_ORA9i与Oracle数据库进行XA通讯。<br />
&nbsp; 修改完rm文件，运行命令buildtms -o C:\bea\tuxedo9.0\bin\TMS_ORA9i -r Oracle_XA编译生成TMS_ORA9i。<br />
&nbsp; <br />
&nbsp; <br />
五、修改ubbconfig文件</p>
<p>&nbsp; 在*GROUP下添加下面语句。<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#105;&#119;&#101;&#105;&#47;&#108;&#105;&#119;&#101;&#105;&#64;&#108;&#105;&#110;&#117;&#120;">liwei/liwei@linux</a>是连接数据库的tns配置。TMSCOUNT=2表示启动两个TMS服务。<br />
&nbsp; <br />
&nbsp; OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=." <br />
&nbsp; TMSNAME="TMS_ORA9i" TMSCOUNT=2<br />
&nbsp; <br />
&nbsp; 另外在*MACHINES添加日志的处理，语句如下。<br />
&nbsp; TLOGDEVICE = "F:\Liwei\Tuxedo\dbread\TLOG"<br />
&nbsp;TLOGNAME = TLOG<br />
&nbsp;TLOGSIZE = 100<br />
&nbsp;<br />
&nbsp;因为编译的服务文件名是server,*SERVERS下改为server<br />
&nbsp;因为生成的服务是DBREAD，所以*SERVICES下也要改成DBREAD。<br />
&nbsp;<br />
&nbsp;修改后文件如下：<br />
&nbsp;&nbsp;<br />
#Liwei</p>
<p>*RESOURCES<br />
IPCKEY&nbsp;&nbsp;123456<br />
DOMAINID&nbsp;liweiapp<br />
MASTER&nbsp;&nbsp;lw<br />
MAXACCESSERS&nbsp;5<br />
MAXSERVERS&nbsp;5<br />
MAXSERVICES&nbsp;5<br />
MODEL&nbsp;&nbsp;SHM<br />
LDBAL&nbsp;&nbsp;N</p>
<p>*MACHINES<br />
LWYM<br />
&nbsp;LMID = lw <br />
&nbsp;TUXDIR = "C:\bea\tuxedo9.0"<br />
&nbsp;TUXCONFIG = "F:\Liwei\Tuxedo\dbread\tuxconfig"<br />
&nbsp;APPDIR = "F:\Liwei\Tuxedo\dbread"<br />
&nbsp;<br />
&nbsp;TLOGDEVICE = "F:\Liwei\Tuxedo\dbread\TLOG"<br />
&nbsp;TLOGNAME=TLOG<br />
&nbsp;TLOGSIZE = 100<br />
&nbsp;#ULOGPFX = "F:\Liwei\Tuxedo\dbread\ULOG"<br />
&nbsp;<br />
*GROUPS<br />
GROUP1&nbsp;LMID=lw GRPNO = 1 <br />
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=." <br />
TMSNAME="TMS_ORA9i" TMSCOUNT=2</p>
<p>*SERVERS<br />
DEFAULT:<br />
&nbsp;&nbsp;CLOPT="-A"<br />
server SRVGRP=GROUP1 SRVID=1<br />
*SERVICES<br />
DBREAD</p>
<p>&nbsp; 编译日志后不能立刻tmboot运行，需要先用tmadmin创建TLOG。方法如下：<br />
&nbsp; <br />
&nbsp; C:\&gt;tmadmin<br />
&nbsp; &gt;crdl -b 500 -z F:\Liwei\Tuxedo\dbread\TLOG<br />
&nbsp; &gt;crlog -m lw</p>
<p>&nbsp; 注：lw是ubbconfig里面的LMID。<br />
&nbsp; <br />
六、Oracle的设置<br />
&nbsp; <br />
&nbsp; Linux：<br />
&nbsp; <br />
&nbsp; sqlplus /nolog <br />
&nbsp; conn sys/*** as sysdba<br />
&nbsp; <br />
&nbsp; 执行xaview.sql 创建v$xatrans$和 v$pending_xatrans$两个视图<br />
&nbsp; @...../rdbms/admin/xaview.sql<br />
&nbsp; <br />
&nbsp; 并把两个视图的select权限授给连接用户如liwei。<br />
&nbsp; <br />
&nbsp; grant select on v$xatrans$ to liwei with grant option;<br />
&nbsp; grant select on v$pending_xatrans$ to liwei with grant option;<br />
&nbsp; <br />
&nbsp; 最后<br />
&nbsp; <br />
&nbsp; grant select any table to liwei;<br />
&nbsp; <br />
&nbsp; <br />
七、运行tmboot</p>
<p>&nbsp; 你会发现有个TMS_ORA9i启动不起来，没关系，将*RESOURCES max系列的设大点，tmshutdown,并且<br />
&nbsp; 结束掉tuxipc，重新编译config然后tmboot就ok了。<br />
&nbsp; <br />
&nbsp; client 1<br />
&nbsp; 执行就会返回数据库结果了。</p>
=========================<br />
<br />
<p>Windows下Tuxedo的安装配置-数据库补充</p>
<p>草木瓜 2006-5-28</p>
<p>一、序</p>
<p>《Windows下Tuxedo的安装配置-数据库》一文中介绍了通过XA方法连接数据库，步骤比较多，当然也可以采<br />
用另一种方法，在服务程序里面直接写入连接数据库的命令。</p>
<p>二、服务端程序</p>
<p>小作修改</p>
<p>EXEC SQL BEGIN DECLARE SECTION;<br />
VARCHAR ora_no[2];<br />
VARCHAR ora_value[10];<br />
VARCHAR ora_cn[30];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //新增<br />
EXEC SQL END DECLARE SECTION;</p>
<p>EXEC SQL INCLUDE sqlca;</p>
<p><br />
//新增以下内容，tpsvinit,tpsrdone是tuxedo默认构造和析构函数。<br />
tpsvrinit()<br />
{<br />
&nbsp;&nbsp;strcpy(ora_cn.arr,"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#105;&#119;&#101;&#105;&#47;&#108;&#105;&#119;&#101;&#105;&#64;&#119;&#105;&#110;&#100;&#98;">liwei/liwei@windb</a>");<br />
&nbsp;&nbsp;ora_cn.len = strlen(ora_cn.arr);<br />
&nbsp;&nbsp;ora_cn.arr[ora_cn.len]='\0';<br />
&nbsp;&nbsp;EXEC SQL CONNECT :ora_cn;<br />
&nbsp;&nbsp;return(0);<br />
}<br />
tpsrvdone()<br />
{<br />
&nbsp;&nbsp;EXEC SQL COMMIT WORK RELEASE;<br />
}</p>
<p>三、配置文件</p>
<p>注释掉与XA相关项，由于客户端与服务器是同一台机器，WSL要不要无所谓。这里也注释掉。</p>
<p>*GROUPS</p>
<p>GROUP1&nbsp;LMID=lw GRPNO = 1 </p>
<p>#OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=." <br />
#TMSNAME="TMS_ORA9i" TMSCOUNT=2</p>
<p><br />
*SERVERS<br />
server SRVGRP=GROUP1 SRVID=1</p>
<p>#WSL&nbsp;SRVGRP=GROUP1 &nbsp;SRVID =300 <br />
#CLOPT="-A -- -n //192.168.98.166:5898 -d/dev/tcp -m1 -M5 -x 10"</p>
<p>*SERVICES<br />
DBREAD</p>
<p>四、编译服务端的命令</p>
<p>修改如下：</p>
<p>proc server.pc include=%TUXDIR%\include<br />
buildserver -o server -f server.c -s DBREAD -v </p>
<p>如果在编译过程中出现error LNK2001: unresolved external symbol _sqlcxt类似的错误，那是因为<br />
找不到orasql9.lib文件。设置环境变量lib,加上e:\oracle\ora92\precomp\lib，修改命令：</p>
<p>buildserver -o server -f server.c -s DBREAD -v -l orasql9.lib</p>
<p>五、编译config文件，运行tmboot</p>
<p>六、补充说明</p>
<p>Tuxedo配置一般如下步骤：</p>
<p>1 设置环境变量。<br />
2 准备服务端客户端程序。<br />
3 服务端客户端编译（buildclient buildserver）。<br />
4 准备tuxedo的config文件。<br />
5 编译config文件（tmload）。<br />
6 如果config文件包含日志，必须通过tmadmin生成日志文件(crdl,crlog)，如出错须将原日志文件删除。<br />
7 启动tuxedo服务（tmboot）。</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 14:00 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel: how to run simpapp?</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277988.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 26 May 2009 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277988.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277988.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277988.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277988.html</trackback:ping><description><![CDATA[<strong><span style="color: red"><strong></strong></span>I. Native Client MODE</strong><br />
1)edit env var file, and load env:<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">/home/oracle/tuxedo10gR3<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">/home/test/atmi<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">$APPDIR/tuxconfig<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PATH</span><span style="color: #000000">=</span><span style="color: #000000">$PATH:$TUXDIR/bin<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LD_LIBRARY_PATH</span><span style="color: #000000">=</span><span style="color: #000000">$LD_LIBRARY_PATH:$TUXDIR/lib<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />export&nbsp;TUXDIR&nbsp;TUXCONFIG&nbsp;PATH&nbsp;LD_LIBRARY_PATH</span></div>
<br />
&nbsp;&nbsp; $source var<br />
<br />
2)build server:<br />
&nbsp;&nbsp;&nbsp;$buildserver -o simpserv -f simpserv.c -s TOUPPER<br />
<br />
3 build client:<br />
&nbsp; $buildclient -o simpcl -f simpcl.c<br />
<br />
4)edit ubbconfig file:<br />
&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">*RESOURCES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IPCKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">69345</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Example:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#IPCKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">123456</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DOMAINID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simpapp<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MASTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXACCESSERS&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXSERVERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXSERVICES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MODEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SHM<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LDBAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*MACHINES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEFAULT:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/test/atmi</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/test/atmi/tuxconfig</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/oracle/tuxedo10gR3</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Example:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/me/simpapp</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/me/simpapp/tuxconfig</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/usr/tuxedo</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rhelserver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Example:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#beatux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*GROUPS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />GROUP1<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GRPNO</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;OPENINFO</span><span style="color: #000000">=</span><span style="color: #000000">NONE<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*SERVERS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEFAULT:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOPT</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-A</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />simpserv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRVGRP</span><span style="color: #000000">=</span><span style="color: #000000">GROUP1&nbsp;SRVID</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*SERVICES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TOUPPER</span></div>
<br />
5) start tuxedo server:<br />
&nbsp; $tmboot<br />
<br />
6) execute the client:<br />
&nbsp; $simpcl "hello, world"<br />
<br />
<br />
<br />
<strong>II) TUXEDO/WS&nbsp; MODE<br />
</strong>A)&nbsp; SERVER<br />
1) env var (as the upper)<br />
2) build server(as the upper)<br />
3) edit ubbconfig file:<br />
&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">*RESOURCES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IPCKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">69345</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Example:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#IPCKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">123456</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DOMAINID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simpapp<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MASTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXACCESSERS&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXSERVERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXSERVICES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MODEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SHM<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LDBAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*MACHINES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEFAULT:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/test/atmi</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/test/atmi/tuxconfig</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/oracle/tuxedo10gR3</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Example:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/me/simpapp</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/home/me/simpapp/tuxconfig</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/usr/tuxedo</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rhelserver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MAXWSCLIENTS</span><span style="color: #000000">=</span><span style="color: #000000">50</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*GROUPS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />GROUP1&nbsp;&nbsp;LMID</span><span style="color: #000000">=</span><span style="color: #000000">simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GRPNO</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;OPENINFO</span><span style="color: #000000">=</span><span style="color: #000000">NONE<br />
<span style="color: red"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />WSGRP&nbsp;&nbsp;&nbsp;LMID=simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GRPNO=2</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*SERVERS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEFAULT:<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOPT</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-A</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />simpserv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRVGRP</span><span style="color: #000000">=</span><span style="color: #000000">GROUP1&nbsp;SRVID</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<span style="color: red"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />WSL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRVGRP=WSGRP&nbsp;SRVID=10&nbsp;RESTART=Y&nbsp;MAXGEN=10&nbsp;GRACE=3600&nbsp;CLOPT="-A&nbsp;--&nbsp;-n//192.168.247.12<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />9:7110&nbsp;&nbsp;&nbsp;-m&nbsp;5&nbsp;-M&nbsp;10&nbsp;-x&nbsp;5"</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*SERVICES<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TOUPPER</span></div>
<br />
4) start server :<br />
&nbsp;&nbsp;&nbsp; $tmboot<br />
<br />
B) CLIENT<br />
1)editenv var file, and load env file:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">TUXDIR</span><span style="color: #000000">=</span><span style="color: #000000">/home/oracle/tuxedo10gR3<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />APPDIR</span><span style="color: #000000">=</span><span style="color: #000000">/home/test/simpapp<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TUXCONFIG</span><span style="color: #000000">=</span><span style="color: #000000">$APPDIR/tuxconfig<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PATH</span><span style="color: #000000">=</span><span style="color: #000000">$PATH:$TUXDIR/bin<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LD_LIBRARY_PATH</span><span style="color: #000000">=</span><span style="color: #000000">$LD_LIBRARY_PATH:$TUXDIR/lib<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<span style="color: red"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />WSNADDR=//192.168.247.129:7110<br />
</span></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />export&nbsp;TUXDIR&nbsp;APPDIR&nbsp;TUXCONFIG&nbsp;PATH&nbsp;LD_LIBRARY_PATH&nbsp;WSNADDR</span></div>
<br />
&nbsp;&nbsp; $source var<br />
<br />
2)build client:<br />
&nbsp;&nbsp; $buildclient -o wsimpcl -f simpcl.c -w<br />
<br />
3)run client<br />
&nbsp;&nbsp;&nbsp;&nbsp; $./wsimpcl<br />
&nbsp; 
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-26 13:44 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/26/277988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TUXEDO应用系统的配置 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277918.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Mon, 25 May 2009 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277918.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277918.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277918.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="message18926"><a onclick="javascript:tagshow(event, 'TUXEDO');" href="javascript:;" target="_self"><u><strong>TUXEDO</strong></u></a>应用系统的配置<br />
<br />
3.1 TUXEDO应用系统的常见配置<br />
<br />
配置文件UBBCONFIG介绍<br />
一个TUXEDO应用系统的所有资源都在一个文本文件中进行定义，该文件称为UBBCONFIG，在配置完成后，UBBCONFIG被编译成一个二进制的文件TUXCONFIG.在TUXEDO系统启动时,从该文件中读取系统的配置信息。 UBBCONFIG文件类似WINDOWS下的*.INI文件。它包括以下9大部分, 我们称之为节,RESOURCES，MACHIENS，GROUPS<br />
这三个节必须的，<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target="_self"><u><strong>其他</strong></u></a>的节是可选的。<br />
<br />
RESOURCES(必需): 与整个系统有关的配置信息<br />
MACHINES(必需): 一个TUXEDO应用系统可以跨越多台服务器,在该节中配置与每台服务<br />
器有关的信息<br />
GROUPS(必需): TUXEDO中的服务可被分为多个组,在该节中配置与组有关的信息<br />
SERVERS(可选): 与SERVER有关的信息在该节配置<br />
SERVICES(可选): 与SERVICES有关的信息在该节配置<br />
NETWORK(可选):与网络有关的信息在该节配置<br />
ROUTING(可选) :路由规则在该节配置<br />
NETGROUPS(可选):与网络分组有关的信息在该节配置<br />
<br />
名称解释：<br />
TUXEDO应用系统<br />
一个TUXEDO应用系统包括服务端，客户端，服务端安装在服务器上，客户端一般安装在PC机上，从开发角度看，一个TUXEDO应用系统包括服务端程序，客户端程序，一个配置文件。此外，一个TUXEDO应用系统可以部署在一台服务器上，也可以部署在多台服务器上。<br />
SERVER：<br />
服务端程序用C或COBAL编写，每一个程序文件编译成一个相应可执行文件，该可执行文件在运行时称为SERVER，它实际上就是一个进程。每个 SERVER都有一个名字，也就是该进程的名字。为与TUXEDO应用系统的服务端区分，我们在本书中，我们用SERVER表示该进程，用服务端表示 TUXEDO应用系统的服务端。<br />
SERVICE：<br />
在每个服务端程序中，主要是一个个的函数，在TUXEDO中称这些函数为SERVICE，一般<br />
也称之为服务。在该SERVICE中实现业务逻辑，在客户端中调用这些SERVICE来实现各<br />
种操作，如在前面的例子simpapp中， 服务端程序为simpserv.c，它编译成可执行文件<br />
simperv, simpserv就是一个SERVER，该SERVER包括SERVICE：TOUPPER。<br />
<br />
<br />
下面我们给出一个配置文件的例子：<br />
*RESOURCES<br />
IPCKEY 123456<br />
MASTER simple<br />
UID 0<br />
GID 0<br />
PERM 0666<br />
MAXACCESSERS 100<br />
DOMAINID simpapp<br />
MODEL SHM<br />
LDBAL Y<br />
SCANUNIT 10<br />
SANITYSCAN 12<br />
BLOCKTIME 6<br />
NOTIFY DIPIN<br />
MAXCONV 10<br />
<br />
*MACHINES<br />
"MYSYS" LMID="simple"<br />
TUXCONFIG="d:\tuxdemo\pbdemo\tuxconfig"<br />
TUXDIR="d:\tuxedo65"<br />
APPDIR="d:\tuxdemo\pbdemo"<br />
TLOGDEVICE="d:\tuxdemo\pbdemo\TLOG"<br />
TLOGNAME="TLOG"<br />
TLOGSIZE=100<br />
MAXWSCLIENTS=5<br />
CMPLIMIT="MAXLONG,MAXLONG"<br />
NETLOAD=0<br />
SPINCOUNT=0<br />
MAXACLCACHE=100<br />
<br />
*GROUPS<br />
"GROUP1" LMID="simple" GRPNO=1<br />
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=600+MaxCur=5+LogDir=."<br />
TMSNAME="TMS_ORA8i"<br />
TMSCOUNT=2<br />
<br />
*SERVERS<br />
DEFAULT:<br />
CLOPT="-A"<br />
"simpserv" SRVGRP="GROUP1" SRVID=1<br />
CLOPT="-A"<br />
RQADDR="simpserv"<br />
RQPERM=0660 REPLYQ=Y RPPERM=0660 MIN=5 MAX=5 CONV=N<br />
MAXGEN=1 GRACE=86400 RESTART=N<br />
"WSL" SRVGRP="GROUP1" SRVID=1116<br />
CLOPT="-A -- -n //MYSERVER:8888 -m 2 -M 5 -x 6"<br />
*SERVICES<br />
"TOUPPER"<br />
LOAD=50 PRIO=50<br />
BUFTYPE="ALL"<br />
TRANTIME=30<br />
AUTOTRAN=N<br />
<br />
*ROUTING<br />
<br />
各节之间的包含关系：<br />
从上到下，是一对多的关系，即：一个TUXEDO系统可以跨越多台服务器，一台服务器上可以有多个GROUP，但一个GROUP只能在一台服务器上，一个GROUP中可以有多个SERVER，一个SERVER中可以有多个SERVICE。<br />
<br />
<br />
下面我们分别对每个节种具体的常见配置进行说明，NETWORK,NETGROUP,ROUTING三节及其他比较高级的配置我们在后面的内容中说明<br />
<br />
RESOURCES(必需):<br />
该节是必须的，在这里配置与整个TUXEDO应用系统有关的信息，主要包括：<br />
IPCKEY: TUXEDO使用它标识公告板及其他的IPC资源。它不能与该服务器上其他的IPC资源的ID号冲突范围：32,769-262,142<br />
MASTER: 指定该TUXEDO应用系统的MASTER服务器,在该服务器上对整个TUXEDO系<br />
统进行管理配置,可以为该MASTER服务器指定一台备份服务器,当该MASTER<br />
服务器当机时,可从BACKUP服务器上进行管理。在进行系统迁移时,也要指定<br />
BACKUP服务器。<br />
DOMAINID：该TUXEDO应用系统的唯一标识<br />
<br />
UID, GID, PERM:这三个参数控制对系统IPC资源的存取权限<br />
UID: 可对该TUXEDO应用系统进行管理的TUXEDO系统管理员的用户ID,在UNIX下<br />
就是UNIX系统的用户ID,默认为执行TMLOADCF的用户的ID。在NT下该设置<br />
没有用,要设为0。<br />
GID: 在UNIX下为UID中所指定的用户所在的组ID,在NT下该设置没有用,要设为0<br />
PERM: 指定对TUXEDO系统IPC资源的存取权限。默认值为0666,即任何人都可以对该IPC资源进行存取。<br />
<br />
MAXACCESSERS,MAXSERVERS,MAXSERVICES:这三个参数控制该TUXEDO应用系统对IPC资源的使用情况。<br />
<br />
MAXACCESSERS: 在本系统的一个节点(一台服务器)上,同时可以有多少个进程可以访问<br />
该TUXEDO系统的公告板,默认值为50,它包括本地客户端进<br />
程,SERVER进程,但不包括管理进程如:BBL,DBBL等<br />
MAXSERVERS: 在本系统中,总共可以有多少个SERVER存在,包括进行管理的SERVER,<br />
如:BBL,TMS等。默认值为50。<br />
MAXSERVICES: 在本系统中,总共可以有多少个SEVICE存在, 默认值为100。<br />
<br />
<br />
<br />
TUXEDO应用系统的部署方式：<br />
一个TUXEDO应用系统可能部署在一台服务器上或多台服务器上,也可能是部署在共用一块全局共享内存的几台服务器上,可在MODEL,OPTIONAS中配置该TUXEDO应用系统的部署模式。<br />
MODLE:<br />
SHM: 单机或多台服务器但共用一个全局共享内存<br />
MP: 多台服务器但没有共用一个全局共享内存<br />
<br />
OPTION: LAN: 是多机（MP）部署模式<br />
MIGRATE: 可对该系统进行迁移<br />
<br />
<br />
TUXEDO的管理进程BBL定时对它所在的服务器上的TUXEDO系统进行检查,检查超时的事务,超时的客户端连接等。<br />
SCANUNIT: 指定检查的最小时间单位,它单位为秒,必须是5的倍数。 默认值为10,即10<br />
秒。<br />
SANTIYSCAN: 每隔多少个SCANUNIT检查一次, SANITYSCAN*SCANUNIT不能大于<br />
300秒。默认值为12,即120秒<br />
BLOCKTIME: 指定一个消息可以阻塞多长时间,如果过了SANITYSCAN*SCANUNIT秒该<br />
消息还没有发送出去,将超时出错。 SANITYSCAN*SCANUNIT不能大于<br />
32767秒。默认值为6,即60秒。<br />
<br />
同步调用的超时说明<br />
对同步调用TPCALL,指从TPCALL()开始调用,到SERVER端的返回结果到到该客户端并写到输入缓冲区这一段时间。包括:<br />
客户端开始调用TPCALL()<br />
把数据通过网络发送到SERVER端<br />
SERVER端的处理时间<br />
SERVER端把处理结果通过网络返回给客户端<br />
客户端TPCALL()调用返回<br />
<br />
异步调用和会话方式的超时说明<br />
对异步调用和会话方式,当一个进程调用TPACALL(),TPCONNECT(),TPSEND()时,超时时间只包括如果接收队列满时,这些调用的等待时间,如在TPACALL()中,所调用的SERVICE的接收队列如果满了,那么TPACALL()可阻塞在那里,直到该队列不满,可以接收该 TPACALL()发送的请求。从TPACALL()开始阻塞到TPACALL()返回这段时间为它的超时时间。<br />
对TPGETRPLY(),TPRECV()的超时时间是指如果要接收的队列为空时,它们应该阻塞在那里等待有消息到来的时间。<br />
如:超时时间为60秒, 一点整调用TPGETRPLY()从接收的队列取消息,这时接收队列为空,如果到了一点零一分该接受队列还为空,那么TPGETRPLY()将超时出错。<br />
<br />
LDBAL： 要不要进行负载均衡,Y:要,N:不要,默认值为不要<br />
<br />
MAXCONV: 在一台服务器上最多可以有多少个会话同时存在。范围:0-32768,默认值为10<br />
<br />
NOTIFY : 设置消息的通知方式,有以下3种:默认为DIPIN<br />
IGNORE: 该TUXEDO系统中的CLIENT不接收任何消息<br />
SIGNAL: 用SIGUSR1,SIGUSR2信号通知CLIENT有消息到来，如果在非UNIX平台上设<br />
置采用该方式，那么会被自动转化为DIPIN方式。<br />
DIPIN: 当CLIENT调用ATMI函数时,顺便检查看是否有消息,如果有就发送给该<br />
CLIENT默认值为DIPIN<br />
<br />
<br />
*MACHINES(必需):<br />
该TUXEDO应用系统所包含的每台服务器都要在该节中进行配置<br />
LMID:　在TUXEDO，要为该应用系统中的每台服务器指定一个逻辑服务器名。如在上面的例子中，TUXEDO应用服务器MYSYS对应的逻辑服务器名为：simple，<br />
TUXEDO应用服务器名的查看方法：<br />
1. 在UNIX下用uname -n 查看SERVER的名字,<br />
2. 在NT,WIN2000下用ECHO %COMPUTERNAME$查看SERVER的名字<br />
注意：如果SERVER的名字太长(&gt;8)或含有&#8220;.&#8221;等可以" "引起来,如: "DEMOSERVER.COM"<br />
<br />
TUXCONFIG: 配置文件TUXCONFIG所在的路径<br />
TUXDIR: TUXEDO的安装目录<br />
APPDIR: TUXEDO应用系统所在的目录<br />
注意：TUXCONFIG，TUXDIR，APPDIR的值要与它们在环境变量中的设置的值一样<br />
ENVFILE: 该服务器上与TUXEDO有关的环境变量(如FIELDTBLS等)可以放到一个文件中,在ENVFILE中指定该文件名。<br />
TYPE: 指定该服务器的类型,当两台服务器的TYPE不一样时,在它们之间传送数据时要进行<br />
编码/解码<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target="_self"><u><strong>工作</strong></u></a><br />
ULOGPFX: 指定ULOG文件所在的目录及前缀。默认目录为$APPDIR,前缀为ULOG。<br />
<br />
UID,GID,PERM,MAXACCESSERS,MAXCONV这些在RESOURCES中的配置,在MACHINES中可以被重新配置,并且这些新的配置值会覆盖在RESOURCES中的配置值。<br />
<br />
<br />
*GROUPS(必需):<br />
在TUXEDO中,要对SERVER进行分组,配置GROUP主要有三个目的,<br />
1． 因为GROUP与<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target="_self"><u><strong>数据库</strong></u></a>之间是一对一的关系,在一TUXEDO应用系统中,如果有多个数据库,就要配置多个GROUP,在该GROUP中配置TUXEDO与数据库的连接参数等。<br />
2． 数据依赖路由是以GROUP为单位的。<br />
3． 进行系统迁移时也时以GROUP为单位的一个GROUP有一个名字,还有一个GROUP<br />
ID,GROUP的名字和GROUP ID在一个TUXEDO系统中必须唯一。<br />
每个GROUP要指定该GROUP所在的服务器，及它的ID号，如果该GROUP中的SERVER<br />
要与数据库或其他的资源管理器相连，那么要在OPENINFO中设置连接的参数。具体的配置我们在讲数据库编程时再说明。<br />
*SERVERS:<br />
该系统所包含的所有的SERVER都在该节进行配置。<br />
在DEFAULT中的设置对所有的SERVER起作用。<br />
SRVGRP: 该SERVER所在的GROUP<br />
SRVID: 该SERVER所对应的ID,在一个GROUP中必须唯一<br />
MIN: 该SERVER最少启动的进程数<br />
MAX: 该SERVER最多可启动的进程数<br />
<br />
RESTART,RCMD,MAXGEN,GRACE: 在TUXEDO系统了,当一个SERVER进程因某中原因死掉时,可设置它可以自动重起,这4个参数指定TUXEDO的重起信息。<br />
RESTART 该进程死掉时是否可以自动重起,默认为N(不可以)<br />
GRACE，MAXGEN：在GRACE秒内，该进程最多可以重启MAXGEN次。<br />
RCMD： 指定该SERVER重启时,要执行的一个可执行文件名<br />
注意：<br />
1． 为了使一个SERVER可以自动重起,光设置了RESTART=Y还不够,还要设置<br />
GRACE,MAXGEN才能在该SERVER死掉时,自动重起,<br />
2． 该SERVER能够被自动重起的一个前提条件时它还没有被从BULLITION BOARD中清<br />
除。<br />
例子:<br />
<a onclick="javascript:tagshow(event, 'test');" href="javascript:;" target="_self"><u><strong>test</strong></u></a> SRVGRP=GROUP1 SRVID=1 RESTART=Y GRACE=100000 MAXGEN=255<br />
该设置指定在100000秒的时间内,SERVER进程:test可以启动255次。<br />
在缺省情况下，TUXEDEO的每一个SERVER对应一个请求队列，该SERVER从该请求队列中取客户端发来的请求，并把处理的结果通过该请求队列返回给客户端，TUXEDO的SERVER可以配置成多个SERVER对应一个请求队列，即MSSQ方式，以提高响应的速度。<br />
与MSSQ有关的参数是：<br />
RQADDR：该请求队列的名字，一般设成与该SERVER的名字一样<br />
RAPERM：该请求队列的存取权限，默认为0666<br />
REPLYQ：该SERVER中的某个SERVICE调用其他的SERVICE，并有返回结果，则应设置<br />
REPLYQ=Y，即把其他SERVICE的应答放到该队列中<br />
<br />
CONV: 该SERVER是否采用会话(CONVERSATION)通讯方式,注意采用会话通讯方式的SERVICE要单独在一个SERVER中,不能与采用其他通讯方式的SERVICE在同一个SERVER中,并且该SERVER要设置CONV=Y<br />
CLOPT: 指定该SERVER的启动参数。默认为-A,即再该SERVER启动时，发布该SERVER<br />
包含的所有的SERVICE。通用的有:<br />
-e: 指定错误输出文件,默认为$APPDIR下的stderr<br />
-o: 指定标准输出文件,默认为$APPDIR下的stdout<br />
-r: 记录该SERVER中SERVICE每次调用的处理时间,并记录在错误输出文件中,然后可采用<br />
TUXEDO的性能分析工具txrpt对该SERVER进行性能分析。<br />
-A: 发布该SERVER包含的所有的SERVICE<br />
<br />
<br />
<br />
*SERVICES:<br />
在SERVICES中可针对每个SERVICE进行配置，主要有：<br />
AUTOTRAN: 调用该SERVICE时是否自动启一个全局事务。默认为N<br />
LOAD:如果采用负载均衡,指定该SERVICE的负载因子，默认为50<br />
PRIO: 指定该SERVICE的优先级，默认为50<br />
DDR: 指定数据依赖路由规则<br />
<br />
与远程客户端有关的配置：<br />
1． 在MACHINES中要配置MAXWSCLIENTS，即最多可以有多少个远程客户端同时连接<br />
到该服务器上，在上面的例子中为5个<br />
2． 在SERVERS中要配置SERVER：WSL<br />
WSL SRVGRP="GROUP1" SRVID=1116 CLOPT="-A -- -n //192.168.120.113:8888 -m 2 -M 5 -x 6"<br />
说明：<br />
-n //192.168.120.113:8888: 远程客户端通过该端口与服务器建立连接<br />
-m 2 :最少启动多少个WSH进程<br />
-M 5：:最多启动多少个WSH进程，默认值为MAXWSCLIENTS/m<br />
-x 6：每个WSH进程可同时处理多少个远程客户端<br />
3． 程客户端所在的服务器上要配置WSNADDR环境变量，它的值为-n参数的值，如在上面的配置中为：<br />
SET WSNADDR= //192.168.120.113:8888<br />
<br />
配置文件UBBCONFIG的编译:<br />
用下面的命令进行编译:<br />
tmloadcf &#8211;y UBBCONFIG文件名<br />
如:下面的命令编译名为ubbsimple的TUXEDO配置文件,生成二进制的配置文件<br />
TUXCONFIG<br />
tmloadcf &#8211;y ubbsimple<br />
<br />
有时候在改变了TUXCONFIG的目录后，执行tmloadcf，会出现类似下面的错误，可把原来的TUXCONFIG文件删除，然后再编译。<br />
D:\simpdb&gt;tmloadcf -y ubb<br />
CMDTUX_CAT:1601: ERROR: TUXCONFIG,TUXOFFSET d:\simpdb\tuxconfig 0 doesn't match first device entry on configuration d:\tuxdemo\simpdb\tuxconfig 0<br />
D:\simpdb&gt;del tuxconfig<br />
D:\simpdb&gt;tmloadcf -y ubb<br />
D:\simpdb&gt;<br />
用tmunloadcf命令可对二进制的配置文件TUXCONFIG的进行反编译<br />
如下面的命令反编译TUXCONFIG,并把结果输出到文件myubb中。通过反编译TUXCONFIG可查看该TUXEDO应用系统的一些属性默认值。<br />
Tmunloadcf &gt;myubb<br />
<br />
<br />
<br />
<br />
3.2 多机（MP）模式的配置<br />
<br />
一个TUXEDO应用系统可以部署在多台服务器上，这些服务器通过网络连接，这种部署方式称为MP方式，在这些服务器中要选择一台服务器做MASTER服务器,在该服务器上有一个DBBL进程,负责整个TUXEDO应用系统的管理工作。在每台服务器上都有一个BBL进程，它与DBBL进程进行通信，管理各自服务器上的配置。每台服务器上还有一个名为BRIDGE的进程和一个名为TLISTEN的进程，他们负责服务器之间的通讯。MP模式的结构如图：<br />
<br />
<br />
<br />
<br />
如果配置了MP方式，那么在这些服务器之间可以做负载均衡和容错，客户端可以和其中的任何一台服务器建立连接，如果该服务器上没有该客户端所要调用的服务（SERVICE），TUXEDO可以自动把请求发送到别的有该服务的机器取处理，并把结果返回个客户端，如图，SITE1上的客户端调用了 TRANSFER，当在SITE1上没有该SERVICE，在SITE3上有，<br />
那么SITE1通过BRIDGE把请求发送到SITE3上，SITE3把处理结果也通过BRIDGE发送到SITE1上，通过SITE1把结果返回给该客户端。这些对客户端时透明的。<br />
如果SITE1，STIE2，SITE3上都有TRANSFER，并且设置了负载均衡（LDBAL =Y），那么TUXEDO将根据他们的负载情况把请求发送到负载较小的服务器上。<br />
如果SITE1，SITE2，SITE3中的某一台或两台服务器出故障了，那么正常的机器仍然能够继续运行，如果时他们之间的网络连接断了，BRIDGE进程会自动进行重试，并且在这些服务器之间可以配置多个网络连接通路，当其中的一个出现故障时，会自动采用别的连接通路。<br />
所以MP方式提供了一个高可靠性的分布式应用系统。<br />
<br />
配置成MP方式的步骤：<br />
1. 这些服务器之间可以通过网络互相访问<br />
2. 在每台服务器上都正确安装了TUXEDO SERVER<br />
3. 应用已发布到这些服务器上<br />
4. 选择一台服务器做MASTER机,<br />
6. 在RESOURCES,MACHINES,NETWORK,NETGROUPS中做相应的配置<br />
<br />
RESOURCE:<br />
MODEL要设为MP<br />
OPTIONS中要有LAN<br />
<br />
MASTER服务器上的DBBL负责与其他服务器上的服务器BBL进行通讯,<br />
BBLQUERY: 每台服务器上的BBL每隔SCANUNIT*BBLQUERY秒,向MASTER机上的<br />
DBBL发送一次状态信息。默认为300秒<br />
DBBLWAIT: 如果MASTER机没有收到某台服务器发送的状态信息,它将等待<br />
SCANUNIT*DBBLWAIT秒,如果还没有收到该服务器发送的状态信息,这台服务<br />
器将被分离出去(PARTITIONED)，默认为20秒<br />
<br />
MACHIENS：<br />
在MACHINES中要配置该TUXEDO应用系统包括的每台服务器，如果该服务器时UNIX服务器，那么要配置UID，GID，UID，GID为TUXEDO用户所对应的UID，GID，在UNIX下可以用ID命令查看。<br />
<br />
<br />
NETWORK:<br />
在该节中配置服务器之间通讯的IP地址及BRIDGE进程,<br />
在一个MP方式的TUXEDO应用系统中，不同的服务器之间通过BRIDGE进程进行通讯，该BRIDGE的侦听IP地址及端口<br />
在NADDR中指定。如果是在UNIX下要指定该BRIDGE所用的网络设备，如果是在NT下则不要。<br />
<br />
在TUXEDO系统启动前，不同服务器之间的通讯是通过tlisten进程来进行的，因为这时还没有BRIDGE进程。<br />
NLSADDR为tlisten进程侦听的IP地址及端口。<br />
<br />
一个MP方式的配置例子。<br />
<br />
环境：WIN2000服务器一台，安装TUXEDO6.5, 服务器名WIN,IP地址:10.13.1.124<br />
SUN5.8服务器一台，安装TUXEDO6.5, 服务器名SUN,IP地址:12.22.32.35<br />
MASTER机为WIN2000服务器,BACKUP机为SUN。<br />
<br />
在WIN2000服务器上的UBBCONFIG的内容如下,在SUN服务器上不用编写UBBCONFIG文件。当启动时DBBL会自动<br />
把WIN2000服务器上的TUXCONFIG文件发送到SUN服务器上。<br />
<br />
*RESOURCES<br />
IPCKEY 87656<br />
MASTER site1,site2<br />
MAXACCESSERS 40<br />
MAXSERVERS 40<br />
MAXSERVICES 40<br />
MODEL MP<br />
OPTIONS LAN<br />
<br />
*MACHINES<br />
WIN LMID=site1<br />
APPDIR="d:\tuxdemo\mp"<br />
TUXCONFIG="d:\tuxdemo\mp\tuxconfig"<br />
TYPE="win2000"<br />
TUXDIR="d:\tuxedo65"<br />
<br />
SUN LMID=site2<br />
UID=1006<br />
GID=30<br />
APPDIR="/export/home/simpapp"<br />
TUXCONFIG="/export/home/simpapp/tuxconfig"<br />
TYPE="sun"<br />
TUXDIR="/export/home/tuxedo"<br />
<br />
*GROUPS<br />
GROUP1<br />
LMID=site1 GRPNO=1 ōPENINFO=NONE<br />
GROUP2<br />
LMID=site2 GRPNO=2 ōPENINFO=NONE<br />
<br />
<br />
*NETWORK<br />
site1 NADDR="//10.13.1.124:6000"<br />
NLSADDR="//10.13.1.124:6001"<br />
<br />
<br />
site2 NADDR="//12.22.32.35:6000"<br />
NLSADDR="//12.22.32.35:6001"<br />
BRIDGE="/dev/tcp"<br />
<br />
<br />
<br />
*SERVERS<br />
DEFAULT:<br />
CLOPT="-A"<br />
<br />
simpserv SRVGRP=GROUP2 SRVID=3<br />
<br />
*SERVICES<br />
TOUPPER<br />
<br />
<br />
1. 在WIN2000服务器上把该UBBCONFIG编译成TUXCONFIG<br />
tmloadcf -y ubbmp<br />
2. 在WIN2000服务器上启动tlisten进程<br />
tlisten -l //10.13.1.124:6001<br />
3. 在SUN服务器上启动tlisten进程<br />
tlisten -d /dev/tcp -l /12.22.32.35:6001<br />
4. 在WIN2000服务器上启动该TUXEDO应用系统<br />
tmboot -y<br />
TUXEDO会先启动WIN2000服务器上的进程,然后再启动SUN服务器上的进程。<br />
5. 在WIN2000服务器上执行<br />
simpcl mp test<br />
因为WIN2000服务器上没有TOUPPER服务,TUXEDO会自动调用SUN服务器上的TOUPPER服务,并把结果返回给客户端,这一切对客户端来说是透明的。</div>
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-25 23:19 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TUXEDO监视系统运行tmadmin命令</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277916.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Mon, 25 May 2009 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277916.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277916.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277916.html</trackback:ping><description><![CDATA[<p>TUXEDO监视系统运行</p>
<p>进入linux系统，在linux系统dos输入页面中输入tmadmin</p>
<p>进入tmadmin的监管环境，输入下面的命令即可</p>
<p>启动tmadmin<br />
tmboot&nbsp; -y</p>
<p>1查看服务信息psr<br />
(1) 命令: printserver 简写 psr<br />
(2)&nbsp; psr [-m machine] [-g groupname] [-i srvid] [-q qaddress]<br />
-m machine LMID为 machine的所有服务进程<br />
-g groupname 组名为groupname的所有服务进程<br />
-I srvid SRVID为srvid的服务进程<br />
-q qaddress 消息队列为qaddress的所有SERVERS查看<a onclick="javascript:tagshow(event, 'server');" href="javascript:;" target="_self"><u><strong>server</strong></u></a>的信息<br />
(3) 结果示例:<br />
Prog Name&nbsp;&nbsp;&nbsp;&nbsp; Queue Name&nbsp;&nbsp; Grp Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID&nbsp;&nbsp; RqDone&nbsp; Load Done&nbsp; Current Service<br />
---------&nbsp;&nbsp;&nbsp; ----------&nbsp;&nbsp;&nbsp; --------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; ------&nbsp; ---------&nbsp; ---------------<br />
rz_Ecsb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00004.04000&nbsp;&nbsp; APGP2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp; IDLE )<br />
BBL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 70020&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp; IDLE )<br />
IFMTMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; APGP2_TMS&nbsp;&nbsp;&nbsp; APGP2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30001&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp; IDLE )<br />
ftpserv32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002.00001&nbsp; FTPGP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp; IDLE )<br />
结果说明:<br />
列号&nbsp; 描述<br />
1. 服务的可执行文件名<br />
2. 服务连接的队列名<br />
3. 组名<br />
4. 服务的数字id<br />
5. 服务已经处理的请求数(该SERVER的所有service的负载因子总和)<br />
6. 服务处理的全部请求的参数和，如果当前没有service被调用，则为IDLE<br />
2查看交易信息psc<br />
(1)&nbsp; 命令: printservice&nbsp; 简写: psc<br />
psc [-m machine] [-g groupname] [-I srvid] [-q qaddress]<br />
[-s service] [-a {0|1|2}]<br />
-s service 显示名为sevice的service信息<br />
-a {0|1|2} 显示系统的隐含的service<br />
<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target="_self"><u><strong>其他</strong></u></a>参数与psr命令相同<br />
(2)&nbsp; 结果示例:<br />
Service Name&nbsp;&nbsp; Routine Name&nbsp;&nbsp; Prog Name&nbsp; Grp Name&nbsp;&nbsp; ID&nbsp;&nbsp; Machine&nbsp;&nbsp; # Done&nbsp;&nbsp; Status<br />
------------&nbsp;&nbsp; ------------&nbsp;&nbsp;&nbsp;&nbsp; -------&nbsp;&nbsp;&nbsp; --------&nbsp;&nbsp; --&nbsp;&nbsp; -------&nbsp;&nbsp; ------&nbsp;&nbsp; ------<br />
416701&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rz_Ecsb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rz_Ecsb&nbsp;&nbsp;&nbsp;&nbsp; APGP2&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp; simple&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AVAIL<br />
416601&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rz_Ecsb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rz_Ecsb&nbsp;&nbsp;&nbsp;&nbsp; APGP2&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp; simple&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AVAIL<br />
416501&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rz_Ecsb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rz_Ecsb&nbsp;&nbsp;&nbsp;&nbsp; APGP2&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp; simple&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AVAIL<br />
(3)&nbsp; 结果说明:<br />
列号&nbsp;&nbsp;&nbsp; 描述<br />
1. Service Name :服务名<br />
2. Routine Name :函数名(采用TUXEDO服务的别名机制,一个函数可以对应多个服务名)<br />
3. Prog Name :service 所在的SERVER名<br />
4. Grp Name :组名<br />
5. ID ：server的ID号<br />
6. Machine :server所在的LMID<br />
7. # Done ：service被调用的次数<br />
8. Status :service的状态。AVAIL表示可用<br />
3查看队列信息pq<br />
(1) 命令: printqueue 简写:pq [PADRESS]<br />
(2) 结果示例:<br />
pq 00004.05062<br />
Prog Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Queue Name&nbsp; # Serve&nbsp; Wk Queued&nbsp; # Queued&nbsp; Ave. Len&nbsp;&nbsp;&nbsp; Machine<br />
---------&nbsp;&nbsp;&nbsp; ------------&nbsp; ------&nbsp;&nbsp; ---------&nbsp; --------&nbsp; --------&nbsp;&nbsp;&nbsp; -------<br />
CCS_GEDAIPC_50 00004.05062&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simple<br />
(3) 结果说明:<br />
列号&nbsp;&nbsp;&nbsp; 描述<br />
1. Prog Name :队列连接的服务的可执行文件名<br />
2. Queue Name :字符队列名，是RQADDR参数或一个随机值<br />
3. #Serve :连接的服务数<br />
4. Wk Queued :当前队列的所有请求的参数和<br />
5. #Queued :实际请求数<br />
6. Ave.Len :平均队列长度<br />
7. Machine :队列所在机器的LMID<br />
4查看客户端信息pclt<br />
(1) 命令: printclient 简写:pclt<br />
-m machine 显示LMID号为machine上的客户端连接<br />
-u username 显示用户名为username 的客户端连接<br />
-c ctlname 显示用户进程为ctlname的客户端连接<br />
(2) 结果示例:<br />
&nbsp; LMID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Client Name&nbsp;&nbsp;&nbsp; Time&nbsp;&nbsp;&nbsp; Status&nbsp; Bgn/Cmmt/Abrt<br />
---------- --------------- --------------- -------- ------- -------------<br />
simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ccsmis&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17:42:47&nbsp;&nbsp; IDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/0/0<br />
simple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ccsmis&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmadmin&nbsp;&nbsp;&nbsp; 0:44:28&nbsp;&nbsp;&nbsp; IDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/0/0<br />
(3) 结果说明:<br />
列号&nbsp; 描述<br />
1. 已经登录的客户端机器的LMID<br />
2. 用户名，由tpinit()提供的<br />
3. 客户端名，由tpinit()提供的<br />
4. 客户端连接后经过的时间<br />
5. 客户端状态<br />
6. IDLE——表示客户端目前没有任何交易在<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target="_self"><u><strong>工作</strong></u></a><br />
7. IDLET——表示客户端启动了一个交易<br />
8. BUSY——表示客户端在工作中<br />
9. BUSYT——表示客户端正在交易控制下工作<br />
10. 启动/提交/中断的交易数</p>
<p>5查看部分统计信息bbs<br />
(4) 命令: bbstats&nbsp; 简写：bbs<br />
&gt; bbs<br />
Current Bulletin Board Status:<br />
Current number of servers: 335<br />
Current number of services: 2324<br />
Current number of request queues: 27<br />
Current number of server groups: 11<br />
Current number of interfaces: 0</p>
<p>6观察某个节点的进程信息default<br />
(5) 命令：default &#8211;m<br />
&gt; default -m SITE13</p>
<p>SITE13&gt; psr<br />
Prog Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Queue Name&nbsp; Grp Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID RqDone Load Done Current Service<br />
---------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------&nbsp; --------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- ------ --------- ---------------<br />
BBL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30004.00000 SITE13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; 22827&nbsp;&nbsp; 1141350 ..ADJUNCTBB<br />
BRIDGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 836437&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SITE13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 (&nbsp; IDLE )<br />
GWADM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00021.00019 BGWGRP1+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 (&nbsp; IDLE )<br />
GWTDOMAIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00021.00020 BGWGRP1+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 123826&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
GWADM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00022.00021 BGWGRP2+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 (&nbsp; IDLE )<br />
GWTDOMAIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00022.00022 BGWGRP2+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 (&nbsp; IDLE )<br />
GWADM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00025.00027 GWGRP1_+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200 (&nbsp; IDLE )</p>
<p>7查看消息发送状态pnw<br />
(6) 命令：printnetwork 简写 pnw<br />
&gt; pnw SITE12</p>
<p>SITE12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connected To:&nbsp; msgs sent&nbsp;&nbsp;&nbsp; msgs received<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SITE14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 61904&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62319<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SITE13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 61890&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62288<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SITE11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15972&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13564<br />
8退出管理模式q<br />
(7) 命令: quit&nbsp; 简写：q<br />
</p>
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-25 23:17 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/25/277916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tuxedo bankapp</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277621.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 23 May 2009 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277621.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277621.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277621.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal0falsefalsefalseMicrosoftInternetExplorer4st1\:*{behavior:url(#ieooui) }/* Style Definitions */table.MsoNormalTable{mso-style-name:標準の...&nbsp;&nbsp;<a href='http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277621.html'>阅读全文</a><img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-23 23:33 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel :how to run bankapp?</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277620.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 23 May 2009 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277620.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277620.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277620.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1)edit the bankvar file:&nbsp;&nbsp; Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#&nbsp;&nbsp;&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;20...&nbsp;&nbsp;<a href='http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277620.html'>阅读全文</a><img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-23 23:28 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel and ubuntu 三网卡设置</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277458.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 23 May 2009 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277458.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277458.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277458.html</trackback:ping><description><![CDATA[<h1 class="title">如何在 Windows XP 中配置 Internet 连接共享</h1>
<h1 class="title"><a href="http://support.microsoft.com/kb/306126/zh-cn">http://support.microsoft.com/kb/306126/zh-cn</a> </h1>
<p>通过上面的方法， 在家里就可以让自己的虚拟机使用DHCP的方式上网。<br />
当然，这是针对VMWARE里面使用Bridge的网卡，分配IP。<br />
<br />
为了让自己的机器到任何地方，1）虚拟机都可以使用网络，2）主机和虚拟机可以互相访问，<br />
就给各个虚拟机配置了三个网卡，分别是Bridge，NAT，HostOnly的方式。<br />
<br />
配置完之后，RHEL重启， 就可以立即找到新的网卡，并且DHCP配置完成，主机可以通过NAT<br />
网卡Telnet虚拟机。<br />
<br />
可Ubuntu就没这么幸运了。<br />
ifconfig命令，只看到eth0可以用。<br />
ifconfig -a命令，可以看到三块网卡都在。<br />
看来得手工在/etc/network/interface中，手工添加DHCP的相关配置。参考如下：<br />
auto eth0<br />
iface eth0 inet dhcp</p>
<p>iface eth1 inet dhcp<br />
auto eth1<br />
iface eth2 inet dhcp<br />
auto eth2<br />
<br />
重启网络，好不容易三块网卡都爬上来了。</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-23 10:48 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/23/277458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tuxedo : Using C++'s  Constructors and Destructors</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277360.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 22 May 2009 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277360.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277360.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277360.html</trackback:ping><description><![CDATA[<a name="1390181">&nbsp;
<p>C++ constructors are called to initialize class objects when those objects are created, and destructors are invoked when class objects are destroyed. For automatic (that is, local, non-static) variables that contain constructors and destructors, the constructor is called when the variable comes into scope and the destructor is called when the variable goes out of scope. However,<span style="color: red">&nbsp;when you call the <a href="file:///C:/beadocs/beatux81doc/pgc/pgserv.htm#1167965">tpreturn()</a><a name="1390181"> or <a href="file:///C:/beadocs/beatux81doc/pgc/pgserv.htm#1168061">tpforward()</a><a name="1390181"> function, the compiler performs a non-local goto (using <font class="code">longjmp</font>(3)) such that destructors for automatic variables are not called. </span></a>To avoid this problem, write the application so that you call <font class="code">tpreturn()</font> or <font class="code">tpforward()</font> from the service routine directly (instead of from any functions that are called from the service routine). In addition, one of the following should be true:</p>
</a>
<ul type="square"><a name="1390184">
    <p>
    <li type="square">The <span style="color: red">service routine should not have any automatic variables with destructors </span>(they should be declared and used in a function called by the service routine).</a> <a name="1390185">
    <p>&nbsp;</p>
    <li type="square"><span style="color: red">Automatic variables should be declared and used in a nested scope (contained within curly brackets {}) </span>in such a way that the scope ends before calling the <a href="file:///C:/beadocs/beatux81doc/pgc/pgserv.htm#1167965">tpreturn()</a> or <a href="file:///C:/beadocs/beatux81doc/pgc/pgserv.htm#1168061">tpforward()</a> function. </a></li>
</ul>
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-22 16:20 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tuxedo  config the Tuxedo Administration Console</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277251.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 22 May 2009 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277251.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277251.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277251.html</trackback:ping><description><![CDATA[1) start&nbsp; tuxwsvr
<p class="table"><font class="code">tuxwsvr -l //</font><em><font class="code">machine</font></em><font class="code">:</font><em><font class="code"><span style="color: red"><em><font class="code">port1</font></em><font class="code"> </font></span></font></em><font class="code">-i $TUXDIR/udataobj/tuxwsvr.ini<br />
Example : tuxwsvr -l //192.168.122.128:4003 -i $TUXDIR/udataobj/tuxwsvr.ini<br />
<br />
2)Starting wlisten<br />
&nbsp;&nbsp;&nbsp; a) edit the file &nbsp;<font class="code">$TUXDIR/udataobj/webgui/webgui.ini</font> , and config the <font class="code">NADDR</font> parameter as follows:<br />
&nbsp;&nbsp;&nbsp;&nbsp;Example&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="code">NADDR=//192.168.122.128:<span style="color: red">6060</span></font><br />
&nbsp;&nbsp;&nbsp; b) run cmd : <font class="code">wlisten</font></font></p>
<br />
<br />
3) open your client browser and enter into the administrator console page:<br />
&nbsp;&nbsp; Example: http://192.168.122.128:4003/webguitop.html <br />
<br />
<br />
Reference :&nbsp; http://forums.oracle.com/forums/thread.jspa?threadID=883934&amp;tstart=30<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://peoplesofttipster.com/2007/04/02/get-up-and-running-with-the-tuxedo-administration-console/
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-22 11:02 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu: network can not work</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277236.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 22 May 2009 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277236.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277236.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277236.html</trackback:ping><description><![CDATA[<p>虚拟机拷贝移动之后，&nbsp;ifup <span class="hilite1">eth0</span>出现如下错误：<br />
<span class="hilite1">eth0</span>: <span class="hilite2">ERROR</span> while getting interface flags: <span class="hilite3">No</span> <span class="hilite4">such</span> <span class="hilite5">device</span> <br />
SIOCSIFADDR: <span class="hilite3">No</span> <span class="hilite4">such</span> <span class="hilite5">device</span> <br />
<span class="hilite1">eth0</span>: <span class="hilite2">ERROR</span> while getting interface flags: <span class="hilite3">No</span> <span class="hilite4">such</span> <span class="hilite5">device</span> <br />
SIOCSIFNETMASK: <span class="hilite3">No</span> <span class="hilite4">such</span> <span class="hilite5">device</span> <br />
SIOCSIFBRDADDR: <span class="hilite3">No</span> <span class="hilite4">such</span> <span class="hilite5">device</span> <br />
<span class="hilite1">eth0</span>: <span class="hilite2">ERROR</span> while getting interface flags: <span class="hilite3">No</span> <span class="hilite4">such</span> <span class="hilite5">device</span> <br />
<span class="hilite1">eth0</span>: <span class="hilite2">ERROR</span> while getting interface flags: <span class="hilite3">No</span> <span class="hilite4">such</span> <span class="hilite5">device</span> <br />
Failed to bring up <span class="hilite1">eth0</span>.<br />
</p>
<strong>原因</strong><br />
&nbsp;&nbsp;新克隆的虚拟机镜像的网卡mac地址已经变更。打开虚拟机的.vmx文件，ethernet0.generatedAddress项记录了该虚拟机的mac地址。 <br />
<br />
<br />
<p>解决办法：</p>
<p>rm /etc/udev/rules.d/70-persistent-net.rules</p>
<p>通过 vi <span>/etc/network/interfaces 修改ip地址</span><br />
然后 /etc/init.d/networking restart</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-22 09:50 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel proxy setting</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277226.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 22 May 2009 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277226.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/277226.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/277226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/277226.html</trackback:ping><description><![CDATA[export http_proxy=http://proxy:portnum/<br />
export ftp_proxy=http://proxy:portnum/<br />
<br />
Put this in your .bashrc, /etc/profile, or the like.&nbsp;&nbsp;I recommend<br />
setting https_proxy and ftp_proxy to the same value.<br />
<br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/277226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-22 09:07 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/22/277226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel install svn server</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271622.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 19 May 2009 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271622.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271622.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271622.html</trackback:ping><description><![CDATA[1) install svn server:&nbsp; yum install subversion<br />
<br />
2) install&nbsp; dav mod :&nbsp; <code>yum install mod_dav_svn</code><br />
<br />
3) create the svn dir<br />
$ mkdir /home/svn<br />
$ cd /home/svn<br />
$ mkdir myproject<br />
$ chown -R root:subversion myproject<br />
$ chmod -R g+rws myproject<br />
<br />
4) create the respository<br />
<span class="mw-headline">$ <span style="color: red">svnadmin create /home/svn/myproject</span><br />
</span><br />
5) config the WebDAV protocals for web access the svn server:<br />
&nbsp;&nbsp;&nbsp; a)edit the&nbsp;file of /etc/httpd/conf.d/subversion.conf", and add the following code:
<pre>&lt;Location <span style="color: red">/svn</span>&gt;DAV svn
SVNPath <span style="color: red">/home/svn <br />
</span>AuthType Basic
AuthName "myproject subversion repository"
AuthUserFile /etc/subversion/passwd
&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
Require valid-user
&lt;/LimitExcept&gt;
&lt;/Location&gt;
</pre>
<pre>   b)restart apache :   <span class="mw-headline">/etc/init.d/apache2 restart</span></pre>
<pre>   c)create the pass file, and add the user:</pre>
<pre>      touch  /etc/subversion/passwd <br />
htpasswd -c /etc/subversion/passwd user_name</pre>
<pre>6) now you can use your client browser/tool to access your svn server ： <span style="color: red">http://localhost/svn/myproject<br />
</span>
</pre>
<pre>&nbsp;</pre>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-19 23:49 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel install webmin</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271613.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 19 May 2009 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271613.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271613.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271613.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271613.html</trackback:ping><description><![CDATA[1) download the webmin:&nbsp; wget http://prdownloads.sourceforge.net/webadmin/webmin-1.410-1.noarch.rpm<br />
<br />
2) install the webmin:&nbsp;&nbsp;&nbsp;&nbsp; rpm -ivh webmin-1.410-1.noarch.rpm<br />
<br />
3) check it, open your client browser, and login to http://localhost.localdomain:10000.
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-19 23:00 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/19/271613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别   zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/18/271410.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Mon, 18 May 2009 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/18/271410.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271410.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/18/271410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271410.html</trackback:ping><description><![CDATA[<a href="http://www.baidu.com/s?wd=etc+sysconfig+i18n&amp;lm=0&amp;si=&amp;rn=10&amp;ie=gb2312&amp;ct=0&amp;cl=3&amp;f=1&amp;rsp=1">/etc/sysconfig/i18n</a> <br />
<font face="宋体"><br />
locale 是国际化与本土化过程中的一个非常重要的概念，个人认为，对于中文用户来说，通常会涉及到的国际化或者本土化，大致包含三个方面：看中文，写中文，与 window中文系统的兼容和通信。从实际经验上看来，locale的设定与看中文关系不大，但是与写中文，及window分区的挂载方式有很密切的关系。本人认为就像一个纯英文的Windows能够浏览中文，日文或者意大利文网页一样，你不需要设定locale就可以看中文。那么，为什么要设定 locale呢？什么时候会用到locale呢？ <br />
<br />
Tags: locale 设定 原因 解释 <br />
<br />
一、为什么要设定locale 正如前面我所讲的，设定locale与你能否浏览中文的网页没有直接的关系，即便你把locale设置成 en_US.ISO-8859-1这样一个标准的英文locale你照样可以浏览中文的网页，只要你的系统里面有相应的字符集（这个都不一定需要）和合适的字体（如simsun），浏览器就可以把网页翻译成中文给你看。具体的过程是网络把网页传送到你的机器上之后，浏览器会判断相应的编码的字符集，根据网页采用的字符集，去字体库里面找合适的字体，然后由文字渲染工具把相应的文字在屏幕上显示出来。 <br />
<br />
在下文本人会偶尔把字符集比喻成密码本，个人觉得对于一些东西比较容易理解，假如你不习惯的话，把全文copy到任何文本编辑器，用字符集替换密码本即可。 <br />
<br />
那有时候网页显示乱码或者都是方框是怎么回事呢？个人认为，显示乱码是因为设定的字符集不对(或者没有相应的字符集)，例如网页是用UTF-8编码的，你非要用GB2312去看，而系统根据GB2312去找字体，然后在屏幕上显示，当然是一堆的乱码，也就是说你用一个错误的密码本去翻译发给你的电报，当然内容那叫一个乱；至于有些时候浏览的网页能显示一部分汉字，但有很多的地方是方框，能够显示汉字说明浏览器已经正确的判断出了网页的编码，并在字体库里面找到了相应的文字，但是并不是每个字体库都包含某个字符集全部的字体的缘故，有些时候会显示不完全，找一个比较全的支持较多字符集的字体就可以了。 <br />
<br />
既然我能够浏览中文网页，那为什么我还要设定locale呢？ <br />
<br />
其实你有没有想过这么一个问题，为什么gentoo官方论坛上中文论坛的网页是用UTF-8编码的（虽然大家一直强烈建议用GB2312编码），但是新浪网就是用GB2312编码的呢？而Xorg的官方网页竟然是ISO-8859-15编码的，我没有设定这个locale怎么一样的能浏览呢？这个问题就像是你有所有的密码本，不论某个网站是用什么字符集编码的，你都可以用你手里的密码本把他们翻译过来，但问题是虽然你能浏览中文网页，但是在整个操作系统里面流动的还是英文字符。所以，就像你能听懂英语，也能听懂中文。 最根本的问题是：你不可以写中文。 <br />
<br />
当你决定要写什么东西的时候，首先要决定的一件事情是用那种语言，对于计算机来说就是你要是用哪一种字符集，你就必须告诉你的linux系统，你想用那一本密码本去写你想要写的东西。知道为什么需要用GB2312字符集去浏览新浪了吧，因为新浪的网页是用GB2312写的。 <br />
<br />
为了让你的Linux能够输入中文，就需要把系统的locale设定成中文的(严格说来是locale中的语言类别LC_CTYPE )，例如 zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东西呢？这个问题稍后详述，现在只需要知道，这是locale的表达方式就可以了。 <br />
<br />
<font face="宋体">locale这个单词中文翻译成地区或者地域，其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言，所在国家或者地区，以及当地的文化传统所定义的一个软件运行时的语言环境。<br />
<br />
[oracle@game ~]$ <font color="#0000ff">locale</font><br />
<font color="#ff0000">LANG=en_US.UTF-8</font><br />
<font color="#ff0000">LC_CTYPE="en_US.UTF-8"</font><br />
LC_NUMERIC="en_US.UTF-8"<br />
LC_TIME="en_US.UTF-8"<br />
LC_COLLATE="en_US.UTF-8"<br />
LC_MONETARY="en_US.UTF-8"<br />
LC_MESSAGES="en_US.UTF-8"<br />
LC_PAPER="en_US.UTF-8"<br />
LC_NAME="en_US.UTF-8"<br />
LC_ADDRESS="en_US.UTF-8"<br />
LC_TELEPHONE="en_US.UTF-8"<br />
LC_MEASUREMENT="en_US.UTF-8"<br />
LC_IDENTIFICATION="en_US.UTF-8"<br />
<font color="#ff0000">LC_ALL=en_US.UTF-8</font><br />
[oracle@game ~]$ <br />
<br />
</font><font face="宋体">locale把按照所涉及到的文化传统的各个方面分成12个大类，这12个大类分别是： <br />
<br />
<font color="#ff0000">1、语言符号及其分类(LC_CTYPE) </font><br />
2、数字(LC_NUMERIC) <br />
3、比较和排序习惯(LC_COLLATE) <br />
4、时间显示格式(LC_TIME) <br />
5、货币单位(LC_MONETARY) <br />
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES) <br />
7、姓名书写方式(LC_NAME) <br />
8、地址书写方式(LC_ADDRESS) <br />
9、电话号码书写方式(LC_TELEPHONE) <br />
10、度量衡表达方式 (LC_MEASUREMENT) <br />
11、默认纸张尺寸大小(LC_PAPER) <br />
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。</font><br />
<font face="宋体"><br />
所以说，locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的，这些locale定义文件放在/usr/share/i18n/locales目录下面，例如en_US, zh_CN and de_DE@euro都是locale的定义文件，这些文件都是用文本格式书写的，你可以用写字板打开，看看里边的内容，当然出了有限的注释以外，大部分东西可能你都看不懂，因为是用的Unicode的字符索引方式。<br />
<br />
[oracle@game ~]$ <font color="#0000ff">cd /usr/share/i18n/locales</font><br />
[oracle@game locales]$ <font color="#0000ff">ls</font><br />
aa_DJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ar_YE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el_GR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_ES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr_CH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iso14651_t1 ne_NP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; so_ET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_hangul<br />
aa_ER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; az_AZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el_GR@euro es_ES@euro fr_FR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it_CH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nl_BE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; so_KE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_narrow<br />
aa_ER@saaho be_BY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_AU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_GT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr_FR@euro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it_IT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nl_BE@euro so_SO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_neutral<br />
aa_ET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bg_BG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_BW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_HN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr_LU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it_IT@euro&nbsp;&nbsp; nl_NL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sq_AL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_small<br />
af_ZA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bn_BD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_CA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_MX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr_LU@euro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iw_IL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nl_NL@euro sr_CS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_wide<br />
am_ET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bn_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_DK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_NI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ga_IE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ja_JP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nn_NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st_ZA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tr_TR<br />
an_ES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; br_FR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_GB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_PA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ga_IE@euro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ka_GE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no_NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sv_FI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tt_RU<br />
ar_AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; br_FR@euro en_HK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_PE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gd_GB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kk_KZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oc_FR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sv_FI@euro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uk_UA<br />
ar_BH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bs_BA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_IE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_PR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gez_ER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kl_GL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; om_ET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sv_SE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ur_PK<br />
ar_DZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byn_ER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_IE@euro es_PY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gez_ER@abegede kn_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; om_KE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ta_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uz_UZ<br />
ar_EG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ca_ES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_SV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gez_ET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ko_KR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; te_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uz_UZ@cyrillic<br />
ar_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ca_ES@euro en_NZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gez_ET@abegede kw_GB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pl_PL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tg_TJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vi_VN<br />
ar_IQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs_CZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_PH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_UY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gl_ES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lg_UG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POSIX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; th_TH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wa_BE<br />
ar_JO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cy_GB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_SG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_VE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gl_ES@euro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo_LA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt_BR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ti_ER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wa_BE@euro<br />
ar_KW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; da_DK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; et_EE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gu_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lt_LT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt_PT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ti_ET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wal_ET<br />
ar_LB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_AT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en_ZA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eu_ES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gv_GB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lv_LV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt_PT@euro tig_ER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xh_ZA<br />
ar_LY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_AT@euro en_ZW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eu_ES@euro he_IL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mi_NZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ro_RO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tl_PH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yi_US<br />
ar_MA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_BE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_AR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fa_IR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hi_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mk_MK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ru_RU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_circle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zh_CN<br />
ar_OM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_BE@euro es_BO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi_FI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr_HR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ml_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ru_UA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_cjk_compat&nbsp;&nbsp;&nbsp; zh_HK<br />
ar_QA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_CH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_CL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi_FI@euro hu_HU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mn_MN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se_NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_cjk_variants zh_SG<br />
ar_SA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_DE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_CO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fo_FO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hy_AM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mr_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sid_ET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_combining&nbsp;&nbsp;&nbsp;&nbsp; zh_TW<br />
ar_SD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_DE@euro es_CR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr_BE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i18n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ms_MY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sk_SK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_compat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zu_ZA<br />
ar_SY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_LU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es_DO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr_BE@euro id_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mt_MT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sl_SI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_font<br />
ar_TN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de_LU@euro es_EC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr_CA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is_IS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nb_NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; so_DJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translit_fraction<br />
[oracle@game locales]$ <br />
<br />
对于de_DE@euro的一点说明，@后边是修正项，也就是说你可以看到两个德国的locale：/usr/share/i18n/locales /de_DE@euro和/usr/share/i18n/locales/de_DE。打开这两个locale定义，你就会知道它们的差别在于 de_DE@euro使用的是欧洲的排序、比较和缩进习惯，而de_DE用的是德国的标准习惯。 <br />
<br />
上面我们说到了zh_CN.GB18030的前半部分，后半部分是什么呢？大部分Linux用户都知道是系统采用的字符集。 </font><br />
<br />
<font face="宋体">zh_CN.GB2312到底是在说什么？ <font color="#ff0000">Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]。</font>所以说呢，locale总是和一定的字符集相联系的。下面举几个例子： <br />
<br />
1、我说中文，身处中华人民共和国，使用国标2312字符集来表达字符。zh_CN.GB2312＝中文_中华人民共和国＋国标2312字符集。 <br />
<br />
2、我说中文，身处中华人民共和国，使用国标18030字符集来表达字符。zh_CN.GB18030＝中文_中华人民共和国＋国标18030字符集。 <br />
<br />
3、我说中文，身处中华人民共和国台湾省，使用国标Big5字符集来表达字符。zh_TW.BIG5=中文_台湾.大五码字符集 <br />
<br />
4、我说英文，身处大不列颠，使用ISO-8859-1字符集来表达字符。 en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集 <br />
<br />
5、我说德语，身处德国，使用UTF-8字符集，习惯了欧洲风格。</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#46;&#85;&#84;&#70;&#45;&#56;&#64;&#101;&#117;&#114;&#111;&#61;&#37;&#69;&#53;&#37;&#66;&#69;&#37;&#66;&#55;&#37;&#69;&#56;&#37;&#65;&#70;&#37;&#65;&#68;&#95;&#37;&#69;&#53;&#37;&#66;&#69;&#37;&#66;&#55;&#37;&#69;&#53;&#37;&#57;&#66;&#37;&#66;&#68;&#46;&#85;&#84;&#70;"><font face="宋体" color="#000000">de_DE.UTF-8@euro＝德语_德国.UTF</font></a><font face="宋体">-8字符集@按照欧洲习惯加以修正，注意不是</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#64;&#101;&#117;&#114;&#111;&#46;&#85;&#84;&#70;"><font face="宋体" color="#000000">de_DE@euro.UTF</font></a><font face="宋体">-8，<font color="#ff0000">所以完全的locale表达方式是 [语言[_地域][.字符集] [@修正值]。 </font><br />
<br />
</font><font face="宋体"><font color="#ff0000">其中，与中文输入关系最密切的就是LC_CTYPE，LC_CTYPE规定了系统内有效的字符以及这些字符的分类</font>，诸如什么是大写字母，小写字母，大小写转换，标点符号、可打印字符和其他的字符属性等方面。而locale定义zh_CN中最最重要的一项就是定义了汉字(Class&#8220;hanzi&#8221;)这一个大类，当然也是用Unicode描述的，这就让中文字符在Linux系统中成为合法的有效字符，而且不论它们是用什么字符集编码的。 <br />
<br />
</font><font face="宋体"><strong>怎样设定locale呢？ </strong><br />
<br />
设定locale就是设定12大类的locale分类属性，即12个LC_*。除了这12个变量可以设定以外，<font color="#ff0000">为了简便起见，还有两个变量：LC_ALL和LANG。<strong>它们之间有一个优先级的关系：LC_ALL &gt; LC_* &gt;LANG</strong></font><strong>。</strong>可以这么说，LC_ALL是最上级设定或者强制设定，而LANG是默认设定值。 <br />
<br />
1、如果你设定了LC_ALL＝zh_CN.UTF-8，那么不管LC_*和LANG设定成什么值，它们都会被强制服从LC_ALL的设定，成为 zh_CN.UTF-8。 <br />
<br />
2、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_*=en_US.UTF-8，并且没有设定LC_ALL的话，那么系统的locale设定以LC_*=en_US.UTF-8。 <br />
<br />
3、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_*，和LC_ALL均未设定的话，系统会将LC_*设定成默认值，也就是LANG的值zh_CN.UTF-8。 <br />
<br />
4、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_CTYPE=en_US.UTF-8，其他的LC_*，和LC_ALL均未设定的话，那么系统的locale设定将是：LC_CTYPE=en_US.UTF-8，其余的 LC_COLLATE，LC_MESSAGES等等均会采用默认值，也就是 LANG的值，也就是LC_COLLATE＝LC_MESSAGES＝&#8230;&#8230;＝ LC_PAPER＝LANG＝zh_CN.UTF-8。 <br />
<br />
<strong>所以，locale是这样设定的： </strong><br />
<br />
<font color="#ff0000">1、如果你需要一个纯中文的系统的话，设定LC_ALL= zh_CN.XXXX，或者LANG=zh_CN.XXXX都可以</font>，当然你可以两个都设定，但正如上面所讲，LC_ALL的值将覆盖所有其他的locale设定，不要作无用功。 <br />
<br />
<strong><font color="#ff0000">2、如果你只想要一个可以输入中文的环境，而保持菜单、标题，系统信息等等为英文界面，那么只需要设定 LC_CTYPE＝zh_CN.XXXX，LANG=en_US.XXXX就可以了。</font></strong>这样LC_CTYPE＝zh_CN.XXXX，而LC_COLLATE＝LC_MESSAGES＝&#8230;&#8230;＝ LC_PAPER＝LANG＝en_US.XXXX。 <br />
<br />
3、假如你高兴的话，可以把12个LC_*一一设定成你需要的值，打造一个古灵精怪的系统： LC_CTYPE＝zh_CN.GBK/GBK(使用中文编码内码GBK字符集)； LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使用ISO-8859-15字符集) 罗马的地址书写方式，美国的纸张设定&#8230;&#8230;。估计没人这么干吧。 <br />
<br />
<font color="#ff0000">4、假如你什么也不做的话，也就是LC_ALL，LANG和LC_*均不指定特定值的话，系统将采用POSIX作为lcoale，也就是C locale。</font></font><br />
<br />
<strong>另外LANG和LANGUAGE有什么区别呢？</strong><br />
<br />
LANG - Specifies the default locale for all unset locale variables<br />
LANGUAGE - Most programs use this for the language of its interface<br />
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量，它指定所有与locale有关的变量的默认值，<br />
<br />
</font>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-18 22:48 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/18/271410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 lsof 查找打开的文件</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271159.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 17 May 2009 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271159.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271159.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271159.html</trackback:ping><description><![CDATA[http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html<br />
<br />
<br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr valign="top">
            <td width="100%">
            <h1>使用 lsof 查找打开的文件</h1>
            <img class="display-img" alt="" src="//www.ibm.com/i/c.gif" width="1" height="6" /></td>
            <td class="no-print" width="192"><img alt="developerWorks" src="/developerworks/i/dw.gif" width="192" height="18" /></td>
        </tr>
    </tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr valign="top">
            <td width="10"><img alt="" src="//www.ibm.com/i/c.gif" width="10" height="1" /></td>
            <td width="100%">
            <table class="no-print" border="0" cellspacing="0" cellpadding="0" width="160" align="right">
                <tbody>
                    <tr>
                        <td width="10"><img alt="" src="//www.ibm.com/i/c.gif" width="10" height="1" /></td>
                        <td>
                        <table border="0" cellspacing="0" cellpadding="0" width="150">
                            <tbody>
                                <tr>
                                    <td class="v14-header-1-small">文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class="v14-gray-table-border" border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="no-padding" width="150">
                                    <table border="0" cellspacing="0" cellpadding="0" width="143">
                                        <script language="JavaScript" type="text/javascript">
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img alt="将打印机的版面设置成横向打印模式" height="16" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3"  /></td><td width="122"><p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p></td></tr>');
//-->
</script>
                                        <tbody>
                                            <tr valign="top">
                                                <td width="8"><img alt="" src="//www.ibm.com/i/c.gif" width="8" height="1" /></td>
                                                <td width="16"><img alt="将打印机的版面设置成横向打印模式" vspace="3" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" height="16" /></td>
                                                <td width="122">
                                                <p><strong><a class="smallplainlink" href="javascript:print()" cmimpressionsent="1">打印本页</a></strong></p>
                                                </td>
                                            </tr>
                                            <noscript></noscript>
                                            <form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp" cm1="1">
                                                <input value="通过查看打开的文件，能够了解更多关于系统的信息。了解应用程序打开了哪些文件或者哪个应用程序打开了特定的文件，作为系统管理员，这将使得您能够作出更好的决策。例如，您不应该卸载具有打开文件的文件系统。使用 lsof，您可以检查打开的文件，并根据需要在卸载之前中止相应的进程。同样地，如果您发现了一个未知的文件，那么可以找出到底是哪个应用程序打开了这个文件。" type="hidden" name="body" cM3 cm1="1" cm2="0" /><input value="使用 lsof 查找打开的文件" type="hidden" name="subject" cM3 cm1="1" cm2="1" /><input value="cn" type="hidden" name="lang" cM3 cm1="1" cm2="2" /> <script language="JavaScript" type="text/javascript">
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送"  /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p></td></tr>');
//-->
</script>
                                                <tr valign="top">
                                                    <td width="8"><img alt="" src="//www.ibm.com/i/c.gif" width="8" height="1" /></td>
                                                    <td width="16"><img alt="将此页作为电子邮件发送" vspace="3" src="//www.ibm.com/i/v14/icons/em.gif" width="16" height="16" /></td>
                                                    <td width="122">
                                                    <p><a class="smallplainlink" href="javascript:document.email.submit();" cmimpressionsent="1"><strong>将此页作为电子邮件发送</strong></a></p>
                                                    </td>
                                                </tr>
                                                <noscript></noscript>
                                            </form>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br />
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>级别： 中级</p>
            <p><a href="#author" cmimpressionsent="1">Sean A. Walberg</a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#101;&#97;&#110;&#64;&#101;&#114;&#116;&#119;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#20351;&#29992;&#32;&#108;&#115;&#111;&#102;&#32;&#26597;&#25214;&#25171;&#24320;&#30340;&#25991;&#20214;" cmimpressionsent="1">sean@ertw.com</a>), 高级网络工程师<br />
            </p>
            <p>2006 年 8 月 21 日</p>
            <blockquote>通过查看打开的文件，了解更多关于系统的信息。了解应用程序打开了哪些文件或者哪个应用程序打开了特定的文件，作为系统管理员，这将使得您能够作出更好的决策。例如，您不应该卸载具有打开文件的文件系统。使用 <code>lsof</code>，您可以检查打开的文件，并根据需要在卸载之前中止相应的进程。同样地，如果您发现了一个未知的文件，那么可以找出到底是哪个应用程序打开了这个文件。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p>在 UNIX&#174; 环境中，文件无处不在，这便产生了一句格言：&#8220;任何事物都是文件&#8221;。通过文件不仅仅可以访问常规数据，通常还可以访问网络连接和硬件。在有些情况下，当您使用 <code>ls</code> 请求目录清单时，将出现相应的条目。在其他情况下，如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字，不存在相应的目录清单。但是在后台为该应用程序分配了一个<em>文件描述符</em>，无论这个文件的本质如何，该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。</p>
            <p>因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息，所以能够查看这个列表将是很有帮助的。完成这项任务的实用程序称为 <code>lsof</code>，它对应于&#8220;list open files&#8221;（列出打开的文件）。几乎在每个 UNIX 版本中都有这个实用程序，但奇怪的是，大多数供应商并没有将其包含在操作系统的初始安装中。要获取更多关于 <code>lsof</code> 的信息，请参见<a href="#resources" cmimpressionsent="1">参考资料</a>部分。</p>
            <p><a name="N10065"><span class="atitle">lsof 简介</span></a></p>
            <p>只需输入 <code>lsof</code> 就可以生成大量的信息，如<a href="#listing1" cmimpressionsent="1">清单 1</a> 所示。因为 <code>lsof</code> 需要访问核心内存和各种文件，所以必须以 root 用户的身份运行它才能够充分地发挥其功能。</p>
            <br />
            <a name="listing1"><strong>清单 1. lsof 的示例输出</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">bash-3.00# lsof
                        COMMAND    PID   USER   FD   TYPE        DEVICE SIZE/OFF      NODE NAME
                        sched        0   root  cwd   VDIR         136,8     1024         2 /
                        init         1   root  cwd   VDIR         136,8     1024         2 /
                        init         1   root  txt   VREG         136,8    49016      1655 /sbin/init
                        init         1   root  txt   VREG         136,8    51084      3185 /lib/libuutil.so.1
                        vi        2013   root    3u  VREG         136,8        0      8501 /var/tmp/ExXDaO7d
                        ...
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>每行显示一个打开的文件，除非另外指定，否则将显示所有进程打开的所有文件。<code>Command</code>、<code>PID</code> 和 <code>User</code> 列分别表示进程的名称、进程标识符 (PID) 和所有者名称。<code>Device</code>、<code>SIZE/OFF</code>、<code>Node</code> 和 <code>Name</code> 列涉及到文件本身的信息，分别表示指定磁盘的名称、文件的大小、索引节点（文件在磁盘上的标识）和该文件的确切名称。根据 UNIX 版本的不同，可能将文件的大小报告为应用程序在文件中进行读取的当前位置（偏移量）。<a href="#listing1" cmimpressionsent="1">清单 1</a> 来自一台可以报告该信息的 Sun Solaris 10 计算机，而 Linux&#174; 没有这个功能。</p>
            <p><code>FD</code> 和 <code>Type</code> 列的含义最为模糊，它们提供了关于文件如何使用的更多信息。<code>FD</code> 列表示文件描述符，应用程序通过文件描述符识别该文件。<code>Type</code> 列提供了关于文件格式的更多描述。我们来具体研究一下文件描述符列，<a href="#listing1" cmimpressionsent="1">清单 1</a> 中出现了三种不同的值。<code>cwd</code> 值表示应用程序的当前工作目录，这是该应用程序启动的目录，除非它本身对这个目录进行更改。<code>txt</code> 类型的文件是程序代码，如应用程序二进制文件本身或共享库，再比如本示例的列表中显示的 <code>init</code> 程序。最后，数值表示应用程序的文件描述符，这是打开该文件时返回的一个整数。在<a href="#listing1" cmimpressionsent="1">清单 1</a> 输出的最后一行中，您可以看到用户正在使用 <code>vi</code> 编辑 /var/tmp/ExXDaO7d，其文件描述符为 3。<code>u</code> 表示该文件被打开并处于读取/写入模式，而不是只读 (<code>r</code>) 或只写 (<code>w</code>) 模式。有一点不是很重要但却很有帮助，初始打开每个应用程序时，都具有三个文件描述符，从 0 到 2，分别表示标准输入、输出和错误流。正因为如此，大多数应用程序所打开的文件的 FD 都是从 3 开始。 </p>
            <p>与 <code>FD</code> 列相比，<code>Type</code> 列则比较直观。根据具体操作系统的不同，您会发现将文件和目录称为 <code>REG</code> 和 <code>DIR</code>（在 Solaris 中，称为 <code>VREG</code> 和 <code>VDIR</code>）。其他可能的取值为 <code>CHR</code> 和 <code>BLK</code>，分别表示字符和块设备；或者 <code>UNIX</code>、<code>FIFO</code> 和 <code>IPv4</code>，分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。</p>
            <p><a name="diversion"><span class="atitle">转到 /proc 目录</span></a></p>
            <p>尽管与使用 <code>lsof</code> 没有什么直接的关系，但对 /proc 目录进行简要的介绍是有必要的。/proc 是一个目录，其中包含了反映内核和进程树的各种文件。这些文件和目录并不存在于磁盘中，因此当您对这些文件进行读取和写入时，实际上是在从操作系统本身获取相关信息。大多数与 <code>lsof</code> 相关的信息都存储于以进程的 PID 命名的目录中，所以 /proc/1234 中包含的是 PID 为 1234 的进程的信息。</p>
            <p>在 /proc 目录的每个进程目录中存在着各种文件，它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。<code>lsof</code> 实用程序使用该信息和其他关于内核内部状态的信息来产生其输出。稍后我将把 <code>lsof</code> 的输出与 /proc 目录中的信息联系起来。</p>
            <p><a name="N1012C"><span class="atitle">常见用法</span></a></p>
            <p>前面，我向您介绍了如何简单地运行不带任何参数的 <code>lsof</code>，以便显示关于每个进程所打开的文件的信息。本文余下的部分将重点关注如何使用 <code>lsof</code> 来显示所需的信息以及如何正确地对其进行解释。</p>
            <p><a name="N1013E"><span class="smalltitle">查找应用程序打开的文件</span></a></p>
            <p><code>lsof</code> 常见的用法是查找应用程序打开的文件的名称和数目。您可能想尝试找出某个特定应用程序将日志数据记录到何处，或者正在跟踪某个问题。例如，UNIX 限制了进程能够打开文件的数目。通常这个数值很大，所以不会产生问题，并且在需要时，应用程序可以请求更大的值（直到某个上限）。如果您怀疑应用程序耗尽了文件描述符，那么可以使用 <code>lsof</code> 统计打开的文件数目，以进行验证。</p>
            <p>要指定单个进程，可以使用 <code>-p</code> 参数，后面加上该进程的 PID。因为这样做不仅会返回该应用程序所打开的文件，还会返回共享库和代码，所以通常需要对输出进行筛选。要完成此任务，可以使用 <code>-d</code> 标志根据 <code>FD</code> 列进行筛选，使用 <code>-a</code> 标志表示两个参数都必须满足 (AND)。如果没有 <code>-a</code> 标志，缺省的情况是显示匹配任何一个参数 (OR) 的文件。<a href="#listing2" cmimpressionsent="1">清单 2</a> 显示了 <code>sendmail</code> 进程打开的文件，并使用 txt 对这些文件进行筛选。</p>
            <br />
            <a name="listing2"><strong>清单 2. 带有 PID 筛选器并进行 txt 文件描述符筛选的 lsof 输出</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">sh-3.00# lsof -a -p 605 -d ^txt
                        COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF     NODE NAME
                        sendmail 605 root  cwd   VDIR  136,8     1024    23554 /var/spool/mqueue
                        sendmail 605 root    0r  VCHR  13,2            6815752 /devices/pseudo/mm@0:null
                        sendmail 605 root    1w  VCHR  13,2            6815752 /devices/pseudo/mm@0:null
                        sendmail 605 root    2w  VCHR  13,2            6815752 /devices/pseudo/mm@0:null
                        sendmail 605 root    3r  DOOR             0t0       58
                        /var/run/name_service_door(door to nscd[81]) (FA:-&gt;0x30002b156c0)
                        sendmail 605 root    4w  VCHR  21,0           11010052
                        /devices/pseudo/log@0:conslog-&gt;LOG
                        sendmail 605 root    5u  IPv4 0x300010ea640      0t0      TCP *:smtp (LISTEN)
                        sendmail 605 root    6u  IPv6 0x3000431c180      0t0      TCP *:smtp (LISTEN)
                        sendmail 605 root    7u  IPv4 0x300046d39c0      0t0      TCP *:submission (LISTEN)
                        sendmail 605 root    8wW VREG         281,3       32  8778600 /var/run/sendmail.pid
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p><a href="#listing2" cmimpressionsent="1">清单 2</a> 为 <code>lsof</code> 指定了三个参数。第一个是 <code>-a</code>，它表示当所有的参数都为真时，才显示这个文件。第二个参数是 <code>-p 605</code>，它限制仅输出 PID 为 605 的进程，可以通过 <code>ps</code> 命令获取这个信息。最后一个参数 <code>-d ^txt</code>，它表示筛选出其中 txt 类型的记录（脱字符号 [^] 表示排除）。</p>
            <p><a href="#listing2" cmimpressionsent="1">清单 2</a> 的输出提供了关于进程行为的信息。如 <code>cwd</code> 行所示，该应用程序的工作目录为 /var/spool/mqueue。文件描述符 0、1 和 2 分配给了 /dev/null（Solaris 大量使用符号链接，所以这里显示了相应的伪设备）。FD 3 是一个 Solaris 门（高速远程过程调用 (RPC) 接口），以只读模式打开。FD 4 中的内容比较有趣，因为它是一个字符设备的只读句柄，实质上是 /dev/log。从这个文件中，您可以收集该应用程序向 UNIX syslog 守护进程进行的记录，所以 /etc/syslog.conf 规定了日志文件的位置。</p>
            <p>作为一个网络应用程序，<code>sendmail</code> 对网络端口进行监听。文件描述符 5、6 和 7 可以告诉您，该应用程序正以 IPv4 和 IPv6 模式监听简单邮件传输协议 (SMTP) 端口，并以 IPv4 模式监听提交端口。最后一个文件描述符是只写的，并且指向 /var/run/sendmail.pid。<code>FD</code> 列中的大写 <code>W</code> 表示该应用程序具有对整个文件的写锁。该文件用于确保每次只能打开一个应用程序实例。</p>
            <p><a name="N101AA"><span class="smalltitle">查找打开某个文件的应用程序</span></a></p>
            <p>在其他情况下，您有一个文件或目录，并且需要知道哪个应用程序控制了该文件（打开了该文件）。<a href="#listing2" cmimpressionsent="1">清单 2</a> 显示了由 <code>sendmail</code> 进程打开了 /var/run/sendmail.pid。如果您不知道这个信息，那么在给定文件名的情况下，<code>lsof</code> 可以提供该信息。<a href="#listing3" cmimpressionsent="1">清单 3</a> 显示了相应的输出。</p>
            <br />
            <a name="listing3"><strong>清单 3. 要求 lsof 显示关于某个文件的信息</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">bash-3.00# lsof /var/run/sendmail.pid
                        COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
                        sendmail 605 root    8wW VREG  281,3       32 8778600 /var/run/sendmail.pid
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>正如输出所示，进程 <code>sendmail</code>（PID 为 605）控制了文件 /var/run/sendmail.pid，并且通过排它锁打开该文件以便进行写入。如果出于某种原因，您需要删除这个文件，那么正确的做法是中止该进程，而不是直接删除这个文件。否则，这个守护进程下次可能无法正常启动，或者可能稍后会启动另一个实例，从而导致争用。</p>
            <p>有时您只知道在文件系统的某处打开了文件。在卸载文件系统时，如果该文件系统中有任何打开的文件，那么操作将会失败。通过指定装入点的名称，您可以使用 <code>lsof</code> 显示一个文件系统中所有打开的文件。<a href="#listing4" cmimpressionsent="1">清单 4</a> 显示了如何尝试卸载 /export/home，然后使用 <code>lsof</code> 找出谁在使用该文件系统。</p>
            <br />
            <a name="listing4"><strong>清单 4. 使用 lsof 找出谁在使用文件系统</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">bash-3.00# umount /export/home
                        umount: /export/home busy
                        bash-3.00# lsof /export/home
                        COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
                        bash    1943 root  cwd   VDIR  136,7     1024    4 /export/home/sean
                        bash    2970 sean  cwd   VDIR  136,7     1024    4 /export/home/sean
                        ct      3030 sean  cwd   VDIR  136,7     1024    4 /export/home/sean
                        ct      3030 sean    1w  VREG  136,7        0   25 /export/home/sean/output
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>在这个示例中，用户 sean 正在其 home 目录中进行一些操作。有两个 <code>bash</code>（一种 Shell）实例正在运行，并且当前目录设置为 sean 的 home 目录。还有一个名为 <code>ct</code> 的应用程序正运行于相同的目录，并且其标准输出（文件描述符 1）重定向到一个名为 output 的文件。要成功地卸载 /export/home，应该在通知用户以确保情况正常之后，中止这些进程。</p>
            <p>这个示例说明了应用程序的当前工作目录非常重要，因为它仍保持着文件资源，并且可以防止文件系统被卸载。这就是为什么大部分守护进程（后台进程）将它们的目录更改为根目录、或服务特定的目录（如 <code>sendmail</code> 示例中的 /var/spool/mqueue）的原因，以避免该守护进程阻止卸载不相关的文件系统。如果 <code>sendmail</code> 从 /export/home/sean 目录启动，并且没有将其目录更改为 /var/spool/mqueue，那么在卸载 /export/home 前必须中止它。</p>
            <p>如果您对非装入点目录中打开的文件感兴趣，那么必须通过 <code>+d</code> 或 <code>+D</code> 指定该目录的名称，具体使用其中的哪一个标志取决于您需要递归到子目录（<code>+D</code>）或者不需要递归到子目录（<code>+d</code>）。例如，要查看 /export/home/sean 中所有打开的文件，可以使用 <code>lsof +D /export/home/sean</code>。在前面的示例中，相关的目录是一个装入点，而这里与前面的示例存在细微的差别，并且限制了 <code>lsof</code> 和内核之间的交互。这还会引起潜在的问题，即 <code>lsof /export/home</code> 与 <code>lsof /export/home/</code>（请注意尾部的斜杠）有所区别。第一种方式可以正常工作，因为它指向了装入点。第二种方式不会生成任何输出，因为它指向了目录。如果您在 Shell 中使用 Tab 键自动完成命令，那么可能碰到这个问题，其中会帮助您添加结尾的斜杠。在这种情况下，您可以删除这个斜杠或者使用 <code>+D</code> 指定目录。前者是首选的方法，因为与指定任意的目录相比，其执行速度更快。</p>
            <p><a name="N10229"><span class="atitle">不常见的用法</span></a></p>
            <p>在前面的部分中，我们研究了 <code>lsof</code> 的基本用法，即显示打开的文件和控制它们的进程之间的关系。当您想对系统进行一些烦琐的操作，而又不希望破坏别人重要的文档时，这种方法很有帮助。您还可以使用相同的方法执行一些高难度的 UNIX 操作。</p>
            <p><a name="N10237"><span class="smalltitle">恢复删除的文件</span></a></p>
            <p>当 UNIX 计算机受到入侵时，常见的情况是日志文件被删除，以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件，比如在清理旧日志时，意外地删除了数据库的活动事务日志。有时可以恢复这些文件，并且 <code>lsof</code> 可以为您提供帮助。</p>
            <p>当进程打开了某个文件时，只要该进程保持打开该文件，即使将其删除，它依然存在于磁盘中。这意味着，进程并不知道文件已经被删除，它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外，这个文件是不可见的，因为已经删除了其相应的目录条目。</p>
            <p>前面曾在<a href="#diversion" cmimpressionsent="1">转到 /proc 目录</a>部分中说过，通过在适当的目录中进行查找，您可以访问进程的文件描述符。在随后的内容中，您看到了 <code>lsof</code> 可以显示进程的文件描述符和相关的文件名。您能明白我的意思吗？</p>
            <p>但愿它真的这么简单！当您向 <code>lsof</code> 传递文件名时，比如在 <code>lsof /file/I/deleted</code> 中，它首先使用 <code>stat()</code> 系统调用获得有关该文件的信息，不幸的是，这个文件已经被删除。在不同的操作系统中，<code>lsof</code> 可能可以从核心内存中捕获该文件的名称。<a href="#listing5" cmimpressionsent="1">清单 5</a> 显示了一个 Linux 系统，其中意外地删除了 Apache 日志，我正使用 <code>grep</code> 工具查找是否有人打开了该文件。</p>
            <br />
            <a name="listing5"><strong>清单 5. 在 Linux 中使用 lsof 查找删除的文件</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode"># lsof | grep error_log
                        httpd      2452     root    2w      REG       33,2      499    3090660
                        /var/log/httpd/error_log (deleted)
                        httpd      2452     root    7w      REG       33,2      499    3090660
                        /var/log/httpd/error_log (deleted)
                        ... more httpd processes ...
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>在这个示例中，您可以看到 PID 2452 打开文件的文件描述符为 2（标准错误）和 7。因此，可以在 /proc/2452/fd/7 中查看相应的信息，如<a href="#listing6" cmimpressionsent="1">清单 6</a> 所示。</p>
            <br />
            <a name="listing6"><strong>清单 6. 通过 /proc 查找删除的文件</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode"># cat /proc/2452/fd/7
                        [Sun Apr 30 04:02:48 2006] [notice] Digest: generating secret for digest authentication
                        [Sun Apr 30 04:02:48 2006] [notice] Digest: done
                        [Sun Apr 30 04:02:48 2006] [notice] LDAP: Built with OpenLDAP LDAP SDK
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>Linux 的优点在于，它保存了文件的名称，甚至可以告诉我们它已经被删除。在遭到破坏的系统中查找相关内容时，这是非常有用的内容，因为攻击者通常会删除日志以隐藏他们的踪迹。Solaris 并不提供这些信息。然而，我们知道 <code>httpd</code> 守护进程使用了 error_log 文件，所以可以使用 <code>ps</code> 命令找到这个 PID，然后可以查看这个守护进程打开的所有文件。</p>
            <br />
            <a name="listing7"><strong>清单 7. 在 Solaris 中查找删除的文件</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode"># lsof -a -p 8663 -d ^txt
                        COMMAND  PID   USER   FD   TYPE        DEVICE SIZE/OFF    NODE NAME
                        httpd   8663 nobody  cwd   VDIR         136,8     1024       2 /
                        httpd   8663 nobody    0r  VCHR          13,2          6815752 /devices/pseudo/mm@0:null
                        httpd   8663 nobody    1w  VCHR          13,2          6815752 /devices/pseudo/mm@0:null
                        httpd   8663 nobody    2w  VREG         136,8      185  145465 / (/dev/dsk/c0t0d0s0)
                        httpd   8663 nobody    4r  DOOR                    0t0      58 /var/run/name_service_door
                        (door to nscd[81]) (FA:-&gt;0x30002b156c0)
                        httpd   8663 nobody   15w  VREG         136,8      185  145465 / (/dev/dsk/c0t0d0s0)
                        httpd   8663 nobody   16u  IPv4 0x300046d27c0      0t0     TCP *:80 (LISTEN)
                        httpd   8663 nobody   17w  VREG         136,8        0  145466
                        /var/apache/logs/access_log
                        httpd   8663 nobody   18w  VREG         281,3        0 9518013 /var/run (swap)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>我使用 <code>-a</code> 和 <code>-d</code> 参数对输出进行筛选，以排除代码程序段，因为我知道需要查找的是哪些文件。<code>Name</code> 列显示出，其中的两个文件（FD 2 和 15）使用磁盘名代替了文件名，并且它们的类型为 <code>VREG</code>（常规文件）。在 Solaris 中，删除的文件将显示文件所在的磁盘的名称。通过这个线索，就可以知道该 FD 指向一个删除的文件。实际上，查看 <code>/proc/8663/fd/15</code> 就可以得到所要查找的数据。</p>
            <p>如果可以通过文件描述符查看相应的数据，那么您就可以使用 I/O 重定向将其复制到文件中，如 <code>cat /proc/8663/fd/15 &gt; /tmp/error_log</code> 。此时，您可以中止该守护进程（这将删除 FD，从而删除相应的文件），将这个临时文件复制到所需的位置，然后重新启动该守护进程。</p>
            <p>对于许多应用程序，尤其是日志文件和数据库，这种恢复删除文件的方法非常有用。正如您所看到的，有些操作系统（以及不同版本的 <code>lsof</code>）比其他的系统更容易查找相应的数据。</p>
            <p><a name="N102C0"><span class="smalltitle">查找网络连接</span></a></p>
            <p>网络连接也是文件，这意味着可以使用 <code>lsof</code> 获得关于它们的信息。您曾在<a href="#listing2" cmimpressionsent="1">清单 2</a> 中看到过这样的示例。该示例假设您已经知道 PID，但是有时候并非如此。如果您只知道相应的端口，那么可以使用 <code>-i</code> 参数利用套接字信息进行搜索。<a href="#listing8" cmimpressionsent="1">清单 8</a> 显示了对 TCP 端口 25 的搜索。</p>
            <br />
            <a name="listing8"><strong>清单 8. 查找监听端口 25 的进程</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode"># lsof -i :25
                        COMMAND  PID USER   FD   TYPE        DEVICE SIZE/OFF NODE NAME
                        sendmail 605 root    5u  IPv4 0x300010ea640      0t0  TCP *:smtp (LISTEN)
                        sendmail 605 root    6u  IPv6 0x3000431c180      0t0  TCP *:smtp (LISTEN)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>需要以 <code>protocol:@ip:port</code> 的形式向 <code>lsof</code> 实用程序传递相关信息，其中的 protocol 为 TCP 或 UDP（可以使用 4 或 6 作为前缀，表示 IP 的版本），IP 为可解析的名称或 IP 地址，而 port 为数字或表示该服务的名称（来自 /etc/services）。需要一个或多个元素（端口、IP、协议）。在<a href="#listing8" cmimpressionsent="1">清单 8</a> 中，<code>:25</code> 表示端口 25。输出显示，进程 605 正在使用 IPv6 和 IPv4 监听端口 25。如果您对 IPv4 不感兴趣，那么可以将筛选器改为 <code>6:25</code>，以表示监听端口 25 的 IPv6 套接字，或者直接使用 <code>6</code> 表示所有的 IPv6 连接。</p>
            <p>除了显示出这些守护进程正在监听的对象，<code>lsof</code> 还可以发现发生的连接，同样是使用 <code>-i</code> 参数。<a href="#listing9" cmimpressionsent="1">清单 9</a> 显示了搜索与 192.168.1.10 之间的所有连接。</p>
            <br />
            <a name="listing9"><strong>清单 9. 搜索活动的连接</strong></a><br />
            <table border="0" cellspacing="0" cellpadding="0" width="572">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode"># lsof -i @192.168.1.10
                        COMMAND  PID USER   FD   TYPE        DEVICE  SIZE/OFF NODE NAME
                        sshd    1934 root    6u  IPv6 0x300046d21c0 0t1303608  TCP sun:ssh-&gt;linux:40379
                        (ESTABLISHED)
                        sshd    1937 root    4u  IPv6 0x300046d21c0 0t1303608  TCP sun:ssh-&gt;linux:40379
                        (ESTABLISHED)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>在这个示例中，<code>sun</code> 和 <code>linux</code> 之间有两个 IPv6 连接。对其进行更仔细的研究可以看出，这些连接来自于两个不同的进程，但它们却是相同的，这是因为两台主机是相同的，并且端口也是相同的（ssh 和 40379）。这是由于进入主进程的连接分叉出一个处理程序，并将该套接字传递给它。您还可以看到，名为 <code>sun</code> 的计算机正在使用端口 22 (ssh)，而 <code>linux</code> 具有端口 40379。这表示，<code>sun</code> 是该连接的接收者，因为它关联于该服务的已知端口。40379 是源或临时端口，并且仅对这个连接有意义。</p>
            <p>因为，至少在 UNIX 中，套接字是另一类文件，所以 <code>lsof</code> 可以获得关于这些连接的详细信息，并找出谁对它们负责。</p>
            <p><a name="N10334"><span class="atitle">结束语</span></a></p>
            <p>UNIX 大量使用了文件。作为系统管理员，<code>lsof</code> 允许您对核心内存进行查看，以找出系统当前如何使用这些文件。<code>lsof</code> 最简单的用法可以告诉您哪些进程打开了哪些文件，以及哪些文件由哪些进程打开。在收集关于应用程序工作情况的信息时，或在进行某些可能损坏数据的操作前确保文件未被使用时，这一点特别重要<code>lsof</code> 更高级的用法可以帮助您查找删除的文件，并获得关于网络连接的信息。这是一个功能强大的工具，它几乎可以用于任何地方。</p>
            <br />
            <br />
            <p><a name="resources"><span class="atitle">参考资料 </span></a></p>
            <strong>学习</strong><br />
            <ul>
                <li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/aix/library/au-lsof.html?S_TACT=105AGX52&amp;S_CMP=cn-a-aix" target="_blank" cmimpressionsent="1">英文原文</a> 。<br />
                <br />
                <li><a href="http://www.ouah.org/RevEng/x47.htm#AEN70" cmimpressionsent="1">Introduction to reverse engineering software</a>：这个站点使用 lsof 和其他的 UNIX 工具，以找出关于给定二进制文件的所有信息。<br />
                <br />
                <li><a href="http://www.netadmintools.com/html/lsof.man.html" cmimpressionsent="1">lsof 的 man 页面</a>：如果您发现控制台版本的内容不大容易读懂，那么这个页面将提供非常有用的内容。<br />
                <br />
                <li><a href="http://www.ibm.com/developerworks/cn/aix/" cmimpressionsent="1">AIX and UNIX</a>：想了解更多内容吗？developerWorks 的 AIX and UNIX 专区提供数百篇关于 AIX 和 UNIX 的文章以及入门级、中级和高级教程，将让您打开眼界。<br />
                <br />
                <li><a href="http://www.ibm.com/developerworks/cn/offers/techbriefings/" cmimpressionsent="1">developerWorks 技术事件与网络广播</a>：跟踪最新的 developerWorks 技术事件与网络广播。<br />
                <br />
                <li><a href="http://www.ibm.com/developerworks/podcast/?S_TACT=105AGX52&amp;S_CMP=cn-a-aix" cmimpressionsent="1">技术讲座</a>：收听技术讲座并保持与 IBM 技术专家同步。</li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 22:01 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解软件包的配置、编译与安装</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271157.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 17 May 2009 13:59:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271157.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271157.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271157.html</trackback:ping><description><![CDATA[http://lamp.linux.gov.cn/Linux/inside_config_compile_install.html<br />
<br />
<br />
<h1>深入理解软件包的配置、编译与安装</h1>
<h2 id="auth_name">作者：<strong><a href="http://lamp.linux.gov.cn/jinbuguo_florilegium.html">金步国</a></strong></h2>
<hr />
<h3>版权声明</h3>
<p>本文作者是一位自由软件爱好者，所以本文虽然不是软件，但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发，但必须保留作者署名，亦不得对声明中的任何条款作任何形式的修改，也不得附加任何其它条件。您可以自由链接、下载、传播此文档，但前提是必须保证全文完整转载，包括完整的版权信息和作译者声明。</p>
<h3>其他作品</h3>
<p>本文作者十分愿意与他人共享劳动成果，如果你对我的其他翻译作品或者技术文章有兴趣，可以在如下位置查看现有作品的列表：</p>
<ul>
    <li><a href="http://lamp.linux.gov.cn/jinbuguo_florilegium.html">金步国作品列表</a></li>
</ul>
<h3>BUG报告，切磋与探讨</h3>
<p>由于作者水平有限，因此不能保证作品内容准确无误，请在阅读中自行鉴别。如果你发现了作品中的错误，请您来信指出，哪怕是错别字也好，任何提高作品质量的建议我都将虚心接纳。如果你愿意就作品中的相关内容与我进行进一步切磋与探讨，也欢迎你与我联系。联系方式：MSN: csfrank122@hotmail.com</p>
<hr />
<h2>前言</h2>
<p>从源代码安装过软件的朋友一定对 ./configure &amp;&amp; make &amp;&amp; make install 安装三步曲非常熟悉了。然而究竟这个过程中的每一步幕后都发生了些什么呢？本文将带领你一探究竟。深入理解这个过程将有助于你在LFS的基础上玩出自己的花样来。不过需要说明的是本文对 Makefile 和 make 的讲解是相当近视和粗浅的，但是对于理解安装过程来说足够了。</p>
<h2>概述</h2>
<p>用一句话来解释这个过程就是：</p>
<p>根据源码包中 Makefile.in 文件的指示，configure 脚本检查当前的系统环境和配置选项，在当前目录中生成 Makefile 文件(还有其它本文无需关心的文件)，然后 make 程序就按照当前目录中的 Makefile 文件的指示将源代码编译为二进制文件，最后将这些二进制文件移动(即安装)到指定的地方(仍然按照 Makefile 文件的指示)。</p>
<p>由此可见 Makefile 文件是幕后的核心。要深入理解安装过程，必须首先对 Makefile 文件有充分的了解。本文将首先讲述 Makefile 与 make ，然后再讲述 configure 脚本。并且在讲述这两部分内容时，提供了尽可能详细的、可以运用于实践的参考资料。</p>
<h2>Makefile 与 make</h2>
<p>用一句话来概括Makefile 与 make 的关系就是：<br />
Makefile 包含了所有的规则和目标，而 make 则是为了完成目标而去解释 Makefile 规则的工具。</p>
<h3>make 语法</h3>
<p>首先看看 make 的命令行语法：</p>
<p><code>make [options] [targets] [VAR=VALUE]...</code></p>
<p>[options]是命令行选项，可以用 make --help 命令查看全部，[VAR=VALUE]是在命令行上指定环境变量，这两个大家都很熟悉，将在稍后详细讲解。而[targets]是什么呢？字面的意思是"目标"，也就是希望本次 make 命令所完成的任务。凭经验猜测，这个[targets]大概可以用"ckeck","install"之类(也就是常见的测试和安装命令)。但是它到底是个啥玩意儿？不带任何"目标"的 make 命令是什么意思？为什么在安装 LFS 工具链中的 Perl-5.8.8 软件包时会出现"make perl utilities"这样怪异的命令？要回答这些问题必须首先理解 Makefile 文件中的"规则"。 </p>
<h3>Makefile 规则</h3>
<p>Makefile 规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。</p>
<p>一个简单的 Makefile 规则是这样写的：</p>
<pre>TARGET : PREREQUISITES
COMMAND
</pre>
<dl>
<dt>TARGET</dt>
<dd>规则的目标。也就是可以被 make 使用的"目标"。有些目标可以没有依赖而只有动作(命令行)，比如"clean"，通常仅仅定义一系列删除中间文件的命令。同样，有些目标可以没有动作而只有依赖，比如"all"，通常仅仅用作"终极目标"。</dd>
<dt>PREREQUISITES</dt>
<dd>规则的依赖。通常一个目标依赖于一个或者多个文件。</dd>
<dt>COMMAND</dt>
<dd>规则的命令行。一个规则可以有零个或多个命令行。</dd></dl>
<p>OK! 现在你明白[targets]是什么了，原来它们来自于 Makefile 文件中一条条规则的目标(TARGET)。另外，Makefile文件中第一条规则的目标被称为"终极目标"，也就是你省略[targets]参数时的目标(通常为"all")。</p>
<p>当你查看一个实际的 Makefile 文件时，你会发现有些规则非常复杂，但是它都符合规则的基本格式。此外，Makefile 文件中通常还包含了除规则以外的其它很多东西，不过本文只关心其中的变量。</p>
<h3>Makefile 变量</h3>
<p>Makefile 中的"变量"更像是 C 语言中的宏，代表一个文本字符串(变量的值)，可以用于规则的任何部分。变量的定义很简单：VAR=VALUE；变量的引用也很简单：$(VAR) 或者 ${VAR}。变量引用的展开过程是严格的文本替换过程，就是说变量值的字符串被精确的展开在变量被引用的地方。比如，若定义：VAR=c，那么，"$(VAR) $(VAR)-$(VAR) VAR.$(VAR)"将被展开为"c c-c VAR.c"。</p>
<p>虽然在 Makefile 中可以直接使用系统的环境变量，但是也可以通过在 Makefile 中定义同名变量来"遮盖"系统的环境变量。另一方面，我们可以在调用 make 时使用 -e 参数强制使系统中的环境变量覆盖 Makefile 中的同名变量，除此之外，在调用 make 的命令行上使用 VAR=VALUE 格式指定的环境变量也可以覆盖 Makefile 中的同名变量。</p>
<h3>Makefile 实例</h3>
<p>下面看一个简单的、实际的Makefile文件：</p>
<code>
<pre>CC=gcc
CPPFLAGS=
CFLAGS=-O2 -pipe
LDFLAGS=-s
PREFIX=/usr
all : prog1 prog2
prog1 : prog1.o
$(CC) $(LDFLAGS) -o prog1 prog1.o
prog1.o : prog1.c
$(CC) -c $(CFLAGS) prog1.c
prog2 : prog2.o
$(CC) $(CFLAGS) $(LDFLAGS) -o prog2 prog2.o
prog2.o : prog2.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) prog2.c
clean :
rm -f *.{o,a} prog{1,2}
install : prog1 prog2
if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
cp -f prog1 $(PREFIX)/bin/prog1
cp -f prog2 $(PREFIX)/bin/prog2
check test : prog1 prog2
prog1 &lt; sample1.ref &gt; sample1.rz
prog1 &lt; sample2.ref &gt; sample3.rz
cmp sample1.ok sample1.rz
cmp sample2.ok sample2.rz
</pre>
</code>
<p>从中可以看出，make 与 make all 以及 make prog1 prog2 三条命令其实是等价的。而常用的 make check 和 make install 也找到了归属。同时我们也看到了 Makefile 中的各种变量是如何影响编译的。针对这个特定的 Makefile ，你甚至可以省略安装三步曲中的 make 命令而直接使用 make install 进行安装。</p>
<p>同样，为了使用自定义的编译参数编译 prog2 ，我们可以使用 make prog2 CFLAGS="-O3 -march=athlon64" 或 CFLAGS="-O3 -march=athlon64" &amp;&amp; make -e prog2 命令达到此目的。</p>
<h3>Makefile 惯例</h3>
<p>下面是Makefile中一些约定俗成的目标名称及其含义：</p>
<dl>
<dt>all</dt>
<dd>编译整个软件包，但不重建任何文档。一般此目标作为默认的终极目标。此目标一般对所有源程序的编译和连接使用"-g"选项，以使最终的可执行程序中包含调试信息。可使用 strip 程序去掉这些调试符号。</dd>
<dt>clean</dt>
<dd>清除当前目录下在 make 过程中产生的文件。它不能删除软件包的配置文件，也不能删除 build 时创建的那些文件。</dd>
<dt>distclean</dt>
<dd>类似于"clean"，但增加删除当前目录下的的配置文件、build 过程产生的文件。</dd>
<dt>info</dt>
<dd>产生必要的 Info 文档。</dd>
<dt>check 或 test</dt>
<dd>完成所有的自检功能。在执行检查之前，应确保所有程序已经被创建(但可以尚未安装)。为了进行测试，需要实现在程序没有安装的情况下被执行的测试命令。</dd>
<dt>install</dt>
<dd>完成程序的编译并将最终的可执行程序、库文件等拷贝到指定的目录。此种安装一般不对可执行程序进行 strip 操作。</dd>
<dt>install-strip</dt>
<dd>和"install"类似，但是会对复制到安装目录下的可执行文件进行 strip 操作。</dd>
<dt>uninstall</dt>
<dd>删除所有由"install"安装的文件。</dd>
<dt>installcheck</dt>
<dd>执行安装检查。在执行安装检查之前，需要确保所有程序已经被创建并且被安装。</dd>
<dt>installdirs</dt>
<dd>创建安装目录及其子目录。它不能更改软件的编译目录，而仅仅是创建程序的安装目录。</dd></dl>
<p>下面是 Makefile 中一些约定俗成的变量名称及其含义：</p>
<p>这些约定俗成的变量分为三类。第一类代表可执行程序的名字，例如 CC 代表编译器这个可执行程序；第二类代表程序使用的参数(多个参数使用空格分开)，例如 CFLAGS 代表编译器执行时使用的参数(一种怪异的做法是直接在 CC 中包含参数)；第三类代表安装目录，例如 prefix 等等，含义简单，下面只列出它们的默认值。</p>
<pre>AR   函数库打包程序，可创建静态库.a文档。默认是"ar"。
AS   汇编程序。默认是"as"。
CC   C编译程序。默认是"cc"。
CXX  C++编译程序。默认是"g++"。
CPP  C/C++预处理器。默认是"$(CC) -E"。
FC   Fortran编译器。默认是"f77"。
PC   Pascal语言编译器。默认是"pc"。
YACC Yacc文法分析器。默认是"yacc"。
ARFLAGS     函数库打包程序的命令行参数。默认值是"rv"。
ASFLAGS     汇编程序的命令行参数。
CFLAGS      C编译程序的命令行参数。
CXXFLAGS    C++编译程序的命令行参数。
CPPFLAGS    C/C++预处理器的命令行参数。
FFLAGS      Fortran编译器的命令行参数。
PFLAGS      Pascal编译器的命令行参数。
YFLAGS      Yacc文法分析器的命令行参数。
LDFLAGS     链接器的命令行参数。
prefix      /usr/local
exec_prefix $(prefix)
bindir      $(exec_prefix)/bin
sbindir     $(exec_prefix)/sbin
libexecdir  $(exec_prefix)/libexec
datadir     $(prefix)/share
sysconfdir  $(prefix)/etc
sharedstatedir $(prefix)/com
localstatedir  $(prefix)/var
libdir      $(exec_prefix)/lib
infodir     $(prefix)/info
includedir  $(prefix)/include
oldincludedir  $(prefix)/include
mandir      $(prefix)/man
srcdir      需要编译的源文件所在的目录，无默认值
</pre>
<h3>make 选项</h3>
<p>最后说说 make 的命令行选项(以Make-3.81版本为准)：</p>
<dl>
<dt>-B, --always-make</dt>
<dd>无条件的重建所有规则的目标，而不是根据规则的依赖关系决定是否重建某些目标文件。</dd>
<dt>-C DIR, --directory=DIR</dt>
<dd>在做任何动作之前先切换工作目录到 DIR ，然后再执行 make 程序。</dd>
<dt>-d</dt>
<dd>在 make 执行过程中打印出所有的调试信息。包括：make 认为那些文件需要重建；那些文件需要比较它们的最后修改时间、比较的结果；重建目标所要执行的命令；使用的隐含规则等。使用该选项我们可以看到 make 构造依赖关系链、重建目标过程的所有信息，它等效于"-debug=a"。</dd>
<dt>--debug=FLAGS</dt>
<dd>在 make 执行过程中打印出调试信息。FLAGS 用于控制调试信息级别：
<dl>
<dt>a</dt>
<dd>输出所有类型的调试信息</dd>
<dt>b</dt>
<dd>输出基本调试信息。包括：那些目标过期、是否重建成功过期目标文件。</dd>
<dt>v</dt>
<dd>除 b 级别以外还包括：解析的 makefile 文件名，不需要重建文件等。</dd>
<dt>i</dt>
<dd>除 b 级别以外还包括：所有使用到的隐含规则描述。</dd>
<dt>j</dt>
<dd>输出所有执行命令的子进程，包括命令执行的 PID 等。</dd>
<dt>m</dt>
<dd>输出 make 读取、更新、执行 makefile 的信息。</dd></dl></dd>
<dt>-e, --environment-overrides</dt>
<dd>使用系统环境变量的定义覆盖 Makefile 中的同名变量定义。</dd>
<dt>-f FILE, --file=FILE, --makefile=FILE</dt>
<dd>将 FILE 指定为 Makefile 文件。</dd>
<dt>-h, --help</dt>
<dd>打印帮助信息。</dd>
<dt>-i, --ignore-errors</dt>
<dd>忽略规则命令执行过程中的错误。</dd>
<dt>-I DIR, --include-dir=DIR</dt>
<dd>指定包含 Makefile 文件的搜索目录。使用多个"-I"指定目录时，搜索目录按照指定顺序进行。</dd>
<dt>-j [N], --jobs[=N]</dt>
<dd>指定并行执行的命令数目。在没有指定"-j"参数的情况下，执行的命令数目将是系统允许的最大可能数目。</dd>
<dt>-k, --keep-going</dt>
<dd>遇见命令执行错误时不终止 make 的执行，也就是尽可能执行所有的命令，直到出现致命错误才终止。</dd>
<dt>-l [N], --load-average[=N], --max-load[=N]</dt>
<dd>如果系统负荷超过 LOAD(浮点数)，不再启动新任务。</dd>
<dt>-L, --check-symlink-times</dt>
<dd>同时考察符号连接的时间戳和它所指向的目标文件的时间戳，以两者中较晚的时间戳为准。</dd>
<dt>-n, --just-print, --dry-run, --recon</dt>
<dd>只打印出所要执行的命令，但并不实际执行命令。</dd>
<dt>-o FILE, --old-file=FILE, --assume-old=FILE</dt>
<dd>即使相对于它的依赖已经过期也不重建 FILE 文件；同时也不重建依赖于此文件任何文件。</dd>
<dt>-p, --print-data-base</dt>
<dd>命令执行之前，打印出 make 读取的 Makefile 的所有数据（包括规则和变量的值），同时打印出 make 的版本信息。如果只需要打印这些数据信息，可以使用 make -qp 命令。查看 make 执行前的预设规则和变量，可使用命令 make -p -f /dev/null 。</dd>
<dt>-q, --question</dt>
<dd>"询问模式"。不运行任何命令，并且无输出，只是返回一个查询状态。返回状态为 0 表示没有目标需要重建，1 表示存在需要重建的目标，2 表示有错误发生。</dd>
<dt>-r, --no-builtin-rules</dt>
<dd>取消所有内嵌的隐含规则，不过你可以在 Makefile 中使用模式规则来定义规则。同时还会取消所有支持后追规则的隐含后缀列表，同样我们也可以在 Makefile 中使用".SUFFIXES"定义我们自己的后缀规则。此选项不会取消 make 内嵌的隐含变量。</dd>
<dt>-R, --no-builtin-variables</dt>
<dd>取消 make 内嵌的隐含变量，不过我们可以在 Makefile 中明确定义某些变量。注意，此选项同时打开了"-r"选项。因为隐含规则是以内嵌的隐含变量为基础的。</dd>
<dt>-s, --silent, --quiet</dt>
<dd>不显示所执行的命令。</dd>
<dt>-S, --no-keep-going, --stop</dt>
<dd>取消"-k"选项。在递归的 make 过程中子 make 通过 MAKEFLAGS 变量继承了上层的命令行选项。我们可以在子 make 中使用"-S"选项取消上层传递的"-k"选项，或者取消系统环境变量 MAKEFLAGS 中的"-k"选项。</dd>
<dt>-t, --touch</dt>
<dd>更新所有目标文件的时间戳到当前系统时间。防止 make 对所有过时目标文件的重建。</dd>
<dt>-v, --version</dt>
<dd>打印版本信息。</dd>
<dt>-w, --print-directory</dt>
<dd>在 make 进入一个目录之前打印工作目录。使用"-C"选项时默认打开这个选项。</dd>
<dt>--no-print-directory</dt>
<dd>取消"-w"选项。可以是用在递归的 make 调用过程中，取消"-C"参数将默认打开"-w"。</dd>
<dt>-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE</dt>
<dd>设定 FILE 文件的时间戳为当前时间，但不改变文件实际的最后修改时间。此选项主要是为实现了对所有依赖于 FILE 文件的目标的强制重建。</dd>
<dt>--warn-undefined-variables</dt>
<dd>在发现 Makefile 中存在对未定义的变量进行引用时给出告警信息。此功能可以帮助我们调试一个存在多级套嵌变量引用的复杂 Makefile 。但是：我们建议在书写 Makefile 时尽量避免超过三级以上的变量套嵌引用。</dd></dl>
<h2>configure</h2>
<p>此阶段的主要目的是生成 Makefile 文件，是最关键的运筹帷幄阶段，基本上所有可以对安装过程进行的个性化调整都集中在这一步。</p>
<p>configure 脚本能够对 Makefile 中的哪些内容产生影响呢？基本上可以这么说：所有内容，包括本文最关心的 Makefile 规则与 Makefile 变量。那么又是哪些因素影响着最终生成的 Makefile 文件呢？答曰：系统环境和配置选项。</p>
<p>配置选项的影响是显而易见的。但是"系统环境"的概念却很宽泛，包含很多方面内容，不过我们这里只关心环境变量，具体说来就是将来会在 Makefile 中使用到的环境变量以及与 Makefile 中的变量同名的环境变量。</p>
<h3>通用 configure 语法</h3>
<p>在进一步讲述之前，先看看 configure 脚本的语法，一般有两种：</p>
<p>configure [OPTIONS] [VAR=VALUE]...</p>
<p>configure [OPTIONS] [HOST]</p>
<p>不管是哪种语法，我们都可以用 configure --help 查看所有可用的[OPTIONS]，并且通常在结尾部分还能看到这个脚本所关心的环境变量有哪些。在本文中将对这两种语法进行合并，使用下面这种简化的语法：</p>
<p>configure [OPTIONS]</p>
<p>这种语法能够被所有的 configure 脚本所识别，同时也能通过设置环境变量和使用特定的[OPTIONS]完成上述两种语法的一切功能。</p>
<h3>通用 configure 选项</h3>
<p>虽然每个软件包的 configure 脚本千差万别，但是它们却都有一些共同的选项，也基本上都遵守相同的选项语法。</p>
<h4>脚本自身选项</h4>
<dl>
<dt>--help</dt>
<dd>显示帮助信息。</dd>
<dt>--version</dt>
<dd>显示版本信息。</dd>
<dt>--cache-file=FILE</dt>
<dd>在FILE文件中缓存测试结果(默认禁用)。</dd>
<dt>--no-create</dt>
<dd>configure脚本运行结束后不输出结果文件，常用于正式编译前的测试。</dd>
<dt>--quiet, --silent</dt>
<dd>不显示脚本工作期间输出的"checking ..."消息。</dd></dl>
<h4>目录选项</h4>
<dl>
<dt>--srcdir=DIR</dt>
<dd>源代码文件所在目录，默认为configure脚本所在目录或其父目录。</dd>
<dt>--prefix=PREFIX</dt>
<dd>体系无关文件的顶级安装目录PREFIX ，默认值一般是 /usr/local 或 /usr/local/pkgName</dd>
<dt>--exec-prefix=EPREFIX</dt>
<dd>体系相关文件的顶级安装目录EPREFIX ，默认值一般是 PREFIX</dd>
<dt>--bindir=DIR</dt>
<dd>用户可执行文件的存放目录DIR ，默认值一般是 EPREFIX/bin</dd>
<dt>--sbindir=DIR</dt>
<dd>系统管理员可执行目录DIR ，默认值一般是 EPREFIX/sbin</dd>
<dt>--libexecdir=DIR</dt>
<dd>程序可执行目录DIR ，默认值一般是 EPREFIX/libexec</dd>
<dt>--datadir=DIR</dt>
<dd>通用数据文件的安装目录DIR ，默认值一般是 PREFIX/share</dd>
<dt>--sysconfdir=DIR</dt>
<dd>只读的单一机器数据目录DIR ，默认值一般是 PREFIX/etc</dd>
<dt>--sharedstatedir=DIR</dt>
<dd>可写的体系无关数据目录DIR ，默认值一般是 PREFIX/com</dd>
<dt>--localstatedir=DIR</dt>
<dd>可写的单一机器数据目录DIR ，默认值一般是 PREFIX/var</dd>
<dt>--libdir=DIR</dt>
<dd>库文件的安装目录DIR ，默认值一般是 EPREFIX/lib</dd>
<dt>--includedir=DIR</dt>
<dd>C头文件目录DIR ，默认值一般是 PREFIX/include</dd>
<dt>--oldincludedir=DIR</dt>
<dd>非gcc的C头文件目录DIR ，默认值一般是 /usr/include</dd>
<dt>--infodir=DIR</dt>
<dd>Info文档的安装目录DIR ，默认值一般是 PREFIX/info</dd>
<dt>--mandir=DIR</dt>
<dd>Man文档的安装目录DIR ，默认值一般是 PREFIX/man</dd></dl>
<h4>体系结构选项</h4>
<p>玩交叉编译的朋友对这些选项已经很熟悉了，对于不使用交叉编译的朋友也不必担心，不要理它们就可以了。</p>
<dl>
<dt>--build=BUILD</dt>
<dd>工具链当前的运行环境，默认是 config.guess 脚本的输出结果。</dd>
<dt>--host=HOST</dt>
<dd>编译出的二进制代码将要运行在HOST上，默认值是BUILD。</dd>
<dt>--target=TARGET</dt>
<dd>编译出的工具链所将来生成的二进制代码要在TARGET上运行，这个选项仅对工具链(也就是GCC和Binutils两者)有意义。</dd></dl>
<h4>特性选项</h4>
<dl>
<dt>--enable-FEATURE</dt>
<dd>启用FEATURE特性</dd>
<dt>--disable-FEATURE</dt>
<dd>禁用FEATURE特性</dd>
<dt>--with-PACKAGE[=DIR]</dt>
<dd>启用附加软件包PACKAGE，亦可同时指定PACKAGE所在目录DIR</dd>
<dt>--without-PACKAGE</dt>
<dd>禁用附加软件包PACKAGE</dd></dl>
<h3>通用环境变量</h3>
<p>除了上述通用的选项外，下列环境变量影响着最终生成的 Makefile 文件：</p>
<dl>
<dt>CPP</dt>
<dd>C预处理器命令</dd>
<dt>CXXCPP</dt>
<dd>C++预处理器命令</dd>
<dt>CPPFLAGS</dt>
<dd>C/C++预处理器命令行参数</dd>
<dt>CC</dt>
<dd>C编译器命令</dd>
<dt>CFLAGS</dt>
<dd>C编译器命令行参数</dd>
<dt>CXX</dt>
<dd>C++编译器命令</dd>
<dt>CXXFLAGS</dt>
<dd>C++编译器命令行参数</dd>
<dt>LDFLAGS</dt>
<dd>连接器命令行参数</dd></dl>
<p>至于设置这些环境变量的方法，你可以将它们 export 为全局变量在全局范围内使用，也可以在命令行上使用 [VAR=VALUE]... configure [OPTIONS] 的语法局部使用。此处就不详细描述了。</p>
<hr />
<p>看完上述内容以后，不用多说你应当自然而然的明白该进行如何对自己的软件包进行定制安装了。祝你好运！</p>
<hr />
<h3>补充读物</h3>
<p>根据d00m3d的推荐，LinuxSir.Org上的另外两篇帖子：<a href="http://www.linuxsir.org/bbs/showthread.php?t=184419">《编译的一点体会》</a>和<a href="http://www.linuxsir.org/bbs/showthread.php?t=269631">《关于库的深入思考》</a>，可以作为本文的进一步读物，更加有助于深入理解本文的主题。另外建立在本文基础上的<a href="http://www.linuxsir.org/bbs/thread282237.html">《编译优化指南》</a>专门针对与优化相关的问题进行了探讨。推荐阅读。</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 21:59 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel, using the centos's yum zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271151.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 17 May 2009 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271151.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271151.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271151.html</trackback:ping><description><![CDATA[<p>http://xuev.blogbus.com/logs/37302025.html<br />
<br />
<br />
用RHEL5做虚拟机，好多软件需要装，可是RHEL5的yum一直没搞明白，既然CentOS号称和RH同步更新，那我们就来尝试一下是否可以用CentOS的源来更新RHEL5或者安装软件。&nbsp;</p>
<p>CentOS的源有好多，网上大多数人都推荐中科大的源，经测试在青岛网通连接中科大（<a href="http://centos.ustc.edu.cn/">http://centos.ustc.edu.cn/</a>）的速度也非常好，那就用它吧。</p>
<p>先将RHEL5自带的yum删除，执行
<div style="background-color: #202020" id="codee_html">
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">rpm</span> <span style="color: #d0d0d0">-qa|grep</span> <span style="color: #d0d0d0">yum</span><br />
</div>
</div>
<p>&nbsp;</p>
<p>将所有找到的包都删除（有些需要加上--nodeps），然后到中科大的网站下载如下两个包：&nbsp;
<div style="background-color: #202020" id="codee_html">
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">wget</span> <span style="color: #d0d0d0">http://centos.ustc.edu.cn/centos/5.3/os/i386/CentOS/yum-3.2.19-18.el5.centos.noarch.rpm</span><br />
<span style="color: #d0d0d0">wget</span> <span style="color: #d0d0d0">http://centos.ustc.edu.cn/centos/5.3/os/i386/CentOS/yum-metadata-parser-1.1.2-2.el5.i386.rpm</span><br />
</div>
</div>
<p>&nbsp;</p>
<p>下载后安装：
<div style="background-color: #202020" id="codee_html">
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">rpm</span> <span style="color: #d0d0d0">-ivh</span> <span style="color: #d0d0d0">yum-metadata-parser-1.1.2-2.el5.i386.rpm</span><br />
<span style="color: #d0d0d0">rpm</span> <span style="color: #d0d0d0">-ivh</span> <span style="color: #d0d0d0">yum-3.2.8-9.el5.centos.1.noarch.rpm</span><br />
</div>
</div>
<p>&nbsp;</p>
<p>然后下载中科大专用的配置文件：
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source">
<div style="background-color: #202020" id="codee_html">
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">cd</span> <span style="color: #d0d0d0">/etc/yum.repos.d/</span><br />
<span style="color: #d0d0d0">wget</span> <span style="color: #d0d0d0">http://centos.ustc.edu.cn/CentOS-Base.repo.5</span><br />
<span style="color: #d0d0d0">mv</span> <span style="color: #d0d0d0">CentOS-Base.repo.5</span> <span style="color: #d0d0d0">CentOS-Base.repo</span></div>
</div>
</div>
<p>&nbsp;</p>
<p>因为默认的配置文件中服务器地址用的版本号是变量$releasever，所以需要将其替换为实际的版本号，否则是无法连接到服务器的，当前CentOS最新版是5.3，所以我们修改CentOS-Base.repo
<div style="background-color: #202020" id="codee_html">
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">vi</span> <span style="color: #d0d0d0">CentOS-Base.repo</span><br />
</div>
</div>
<p>&nbsp;</p>
<p>在vi编辑器中进行全文件替换
<div style="background-color: #202020" id="codee_html">
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">:%s/$releasever/5.3/</span><br />
</div>
</div>
<p>&nbsp;</p>
<p>最后保存退出即可。然后执行
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">yum update</span><br />
</div>
<p>&nbsp;</p>
<p>即可进行更新，当然，你也可以选择不更新，只安装你需要的软件，如：
<div style="background-color: #202020; font-family: 'monospace', 'Lucida Console', 'Courier New'" class="source"><span style="color: #d0d0d0">yum install httpd</span></div>
<p>&nbsp;</p>
<p>大功告成！</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 21:18 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel  查看中文乱码，必须要手工安装中文字体。</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271146.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 17 May 2009 12:23:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271146.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271146.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271146.html</trackback:ping><description><![CDATA[字体文件：dic4/serve/fonts-chinese-3.02-12.el5.noarch.rpm<br />
<br />
rpm -ivh fonts-chinese-3.02-12.el5.noarch.rpm<br />
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 20:23 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu svn server</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271129.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 17 May 2009 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271129.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271129.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271129.html</trackback:ping><description><![CDATA[refer http://wiki.ubuntu.org.cn/SubVersion<br />
<br />
<br />
1) install the svn software:<br />
&nbsp;&nbsp;&nbsp;&nbsp; $ sudo apt-get install subversion<br />
&nbsp;&nbsp;&nbsp;&nbsp; $ sudo apt-get install libapache2-svn<br />
<br />
2) add the group and user:<br />
&nbsp;&nbsp;&nbsp; $sudo addgroup subversion<br />
&nbsp;&nbsp;&nbsp; $sudo usermod -G subversion -a www-data<br />
<br />
3) create the svn dir<br />
$ sudo mkdir /home/svn<br />
$ cd /home/svn<br />
$ sudo mkdir myproject<br />
$ sudo chown -R root:subversion myproject<br />
$ sudo chmod -R g+rws myproject<br />
<br />
4) create the respository<br />
<span class="mw-headline">$ sudo svnadmin create /home/svn/myproject<br />
<br />
5) config the WebDAV protocals for web access the svn server:<br />
&nbsp;&nbsp;&nbsp; a)edit the&nbsp;file of "/etc/apache2/mods-available/dav_svn.conf", and add the following code:
<pre>&lt;Location /svn/myproject&gt;DAV svn
SVNPath /home/svn/myproject
AuthType Basic
AuthName "myproject subversion repository"
AuthUserFile /etc/subversion/passwd
&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
Require valid-user
&lt;/LimitExcept&gt;
&lt;/Location&gt;
</pre>
<pre>   b)restart apache :   <span class="mw-headline">sudo /etc/init.d/apache2 restart</span></pre>
<pre>   c)create the pass file, and add the user:</pre>
<pre>      sudo touch  /etc/subversion/passwd <br />
sudo htpasswd -c /etc/subversion/passwd user_name</pre>
<pre>&nbsp;</pre>
<pre>6) now you can use your client browser/tool to access your svn server.<br />
<br />
</pre>
</span>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 17:01 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu lamp installation</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271126.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 17 May 2009 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271126.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271126.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271126.html</trackback:ping><description><![CDATA[1) install apache :&nbsp; sudo apt-get install apache2<br />
2) check the apache is installed : sudo wget http://127.0.0.1<br />
<br />
3) install the php5:&nbsp; sudo apt-get install php5 <br />
4) install the apache php5 module:&nbsp; sudo apt-get install libapache2-mod-php5<br />
5) confirm the php5 module is installed correctly:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; a)go to the directory /var/www/, and create the phpinfo.php file.<span style="font-family: 黑体; color: rgb(255,1,2)"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp; restart the apache, and&nbsp; access the <a href="http://127.0.0.1/phpinfo.php">http://127.0.0.1/phpinfo.php</a>.<br style="font-family: 黑体" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
6) install mysql : <font color="#003300"><strong><em><font face="Arial, sans-serif"><font size="2">sudo apt-get install mysql-server</font></font></em></strong></font>&nbsp; <br />
7) install php's mysql driver: sudo apt-get install php5-mysql<br />
<br />
8) install php admin: <font color="#003300"><strong><font face="Arial, sans-serif"><font size="2">sudo apt-get install phpmyadmin</font></font></strong></font> <br />
9) now restart apache, and access <a href="http://127.0.0.1/phpmyadmin">http://127.0.0.1/phpmyadmin</a>&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 16:19 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu install build env</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271090.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 16 May 2009 18:11:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271090.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271090.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271090.html</trackback:ping><description><![CDATA[1) update apt source: sudo apt-get update<br />
<br />
2) update build essentical:&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo aptitude update<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo aptitude install build-essential<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong _extended="true">sudo apt-get install linux-headers-`uname -r`&nbsp; xinetd</strong><br _extended="true" />
<br _extended="true" />
<br />
3)install gcc:&nbsp; sudo apt-get gcc-4.3
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 02:11 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Install VMware Tools  zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271088.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 16 May 2009 17:32:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271088.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271088.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271088.html</trackback:ping><description><![CDATA[ATTENTION : ubuntu 9.04 needs the vmware 6.0.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If you are using vmware 5.5, then there will be a lot of problems in the installing process.<br />
<br />
1) click the vmware's menu, vm -&gt;&nbsp;install the vmware tools<br />
<br />
2) mount the &nbsp;iso in the ubuntu : mount -t iso9660 /dev/cdrom /mnt <br />
<br />
3) copy the install file to /tmp:&nbsp; cp /mnt/vmware-linux-tools.tar.gz /tmp <br />
<br />
4) unmount the iso file: umount /dev/cdrom <br />
<p><br />
5) install vmware tools : sudo /tmp/vmware-install.pl</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 01:32 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu 9.04 源列表 </title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271087.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 16 May 2009 17:31:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271087.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271087.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271087.html</trackback:ping><description><![CDATA[网易163更新服务器：
<pre>deb http://mirrors.163.com/ubuntu/ jaunty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jaunty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jaunty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jaunty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jaunty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jaunty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jaunty-backports main restricted universe multiverse
</pre>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 01:31 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu ftp server</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271081.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 16 May 2009 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271081.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/271081.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/271081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/271081.html</trackback:ping><description><![CDATA[1) install the vsftpd:&nbsp; sudo apt-get install vsftpd<br />
<br />
2)&nbsp;try to start the ftp server: sudo /etc/init.d/vsftpd start<br />
<br />
3) config the conf file as the following: sudo vi /etc/vsftpd.conf <br />
#anonymous_enable=YES <br />
local_enable=YES <br />
write_enable=YES<br />
<br />
4) restart the server: sudo /etc/init.d/vsftpd restart<br />
<br />
5) use the ftp client and try to login the ftp server withe the Ubuntu Server's account.<br />
<br />
6) specify an explicit list of local users to chroot() to their home&nbsp;directory, please edit the conf file again:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chroot_list_enable=YES<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chroot_list_file=/etc/vsftpd.chroot_list<br />
<br />
7)edit the /etc/vsftpd.chroot_list.<br />
<br />
8) restrat the ftp server.<br />
<br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/271081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-17 00:05 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/17/271081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu和RedHat的命令差别</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270962.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 15 May 2009 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270962.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/270962.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/270962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/270962.html</trackback:ping><description><![CDATA[ubuntu和RedHat的命令差别
<pre>RH中有service命令来控制守护进程的start和stop，而ubuntu中直接用路径</pre>
<pre>加上start和stop</pre>
<pre>RH中有chkconfig命令来配置进程作为守护进程的运行级别，在ubutu中默认有</pre>
<pre><code><span style="color: red; font-size: 12pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">update-rc.d命令，但是并不好用，可以直接用sysv-rc-conf来操作</span></code></pre>
<pre><code><span style="color: red; font-size: 12pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;
<p>apt-get install sysv-rc-conf</p>
<p>sysv-rc-conf --list</p>
<p>sysv-rc-conf --level 35 mysql.server on //让mysql自启动</p>
</span></code></pre>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/270962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-16 01:29 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Command compare of all the unix/linux.</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270961.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 15 May 2009 17:24:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270961.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/270961.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/270961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/270961.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.unixguide.net/unixguide.shtml                                    Directory Mappings&nbsp;                        AIX                        FreeBSD                ...&nbsp;&nbsp;<a href='http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270961.html'>阅读全文</a><img src ="http://www.blogjava.net/jinfeng_wang/aggbug/270961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-16 01:24 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel: config ssh service</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270960.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 15 May 2009 17:06:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270960.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/270960.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/270960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/270960.html</trackback:ping><description><![CDATA[step 1) confirm the&nbsp;ssh package has been installed:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rpm -qa | grep ssh<br />
<br />
step 2)&nbsp;confirm the ssh service has been started:&nbsp;<br vgkbj="0" />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chkconfig --list sshd<br />
<br />
step3) restart the ssh service :&nbsp; service sshd restart<br />
<br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/270960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-16 01:06 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu: remote access the server, using telnet or ssh</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270958.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 15 May 2009 16:50:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270958.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/270958.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/270958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/270958.html</trackback:ping><description><![CDATA[<p itxtvisited="1"><strong itxtvisited="1">I) Install Telnet Server in Ubuntu </strong></p>
<p itxtvisited="1">1) install the telnet&nbsp;package: sudo apt-get install telnetd</p>
<p itxtvisited="1">2) start the telnet service: sudo /etc/init.d/openbsd-inetd restart<br />
<strong itxtvisited="1"><br />
II) Install SSH Server in Ubuntu </strong></p>
<p itxtvisited="1">1) install the SSH&nbsp;package: sudo apt-get install ssh</p>
2) start the telnet service: sudo /etc/init.d/ssh restart<br />
<br />
<strong itxtvisited="1">III) Download the client software:&nbsp; <strong>http://iij.dl.sourceforge.jp/ttssh2/38350/teraterm-4.62.exe</strong></strong> 
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/270958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-16 00:50 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/16/270958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu apt-get cmd</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270955.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 15 May 2009 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270955.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/270955.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/270955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/270955.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">常用的APT命令参数：
<p style="text-indent: 2em">apt-cache search package 搜索包
<p style="text-indent: 2em">
<p style="text-indent: 2em">apt-cache show package 获取包的相关信息，如说明、大小、版本等
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get install package 安装包
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get install package - - reinstall 重新安装包
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get -f install 修复安装"-f = ——fix-missing"
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get remove package 删除包
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get remove package - - purge 删除包，包括删除配置文件等
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get update 更新源
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get upgrade 更新已安装的包
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get dist-upgrade 升级系统
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get dselect-upgrade 使用 dselect 升级
<p style="text-indent: 2em">
<p style="text-indent: 2em">apt-cache depends package 了解使用依赖
<p style="text-indent: 2em">
<p style="text-indent: 2em">apt-cache rdepends package 是查看该包被哪些包依赖
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get build-dep package 安装相关的编译环境
<p style="text-indent: 2em">
<p style="text-indent: 2em">apt-get source package 下载该包的源代码
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get clean &amp;&amp; sudo apt-get autoclean 清理无用的包
<p style="text-indent: 2em">
<p style="text-indent: 2em">sudo apt-get check 检查是否有损坏的依赖 </p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/270955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-15 23:52 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rhel network setting </title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270953.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 15 May 2009 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270953.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/270953.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/270953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/270953.html</trackback:ping><description><![CDATA[1) dns server<br />
##########################<br />
#<br />
#&nbsp;&nbsp;&nbsp;&nbsp; /etc/resolv.conf<br />
#<br />
##########################
<div>vi /etc/resolv.conf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指定当前主机的DNS服务器，最多可指定三个<br />
search lpwr.net&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置当前主机的默认查找域<br />
nameserver 192.168.0.100&nbsp;&nbsp; //指定首选DNS服务器<br />
nameserver 172.16.254.2<br />
</div>
<br />
<br />
2) dhcp -&gt; static
<div>##########################################<br />
#&nbsp;&nbsp; /etc/sysconfig/network-scripts/eth<br />
##########################################</div>
<div>vi /etc/sysconfig/network-scripts/eth0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //编辑指定网络接口配置文件<br />
DEVICE=eth0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指定接口名称<br />
ONBOOT=yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //系统启动时加载<br />
BOOTPROTO=static&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IP地址静态配置，若该值为&#8220;dhcp&#8221;则为动态获得<br />
IPADDR=192.168.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置IP地址<br />
NETMASK=255.255.255.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置子网掩码<br />
GATEWAY=192.168.0.254&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置默认网关<br />
</div>
<br />
<br />
3)restart<br />
/etc/init.d/network restart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //重启网络服务<br />
/etc/init.d/network stop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //停止网络服务<br />
/etc/init.d/network start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //启动网络服务<br />
<br />
<br />
<br />
4)check the network<br />
run cmd:&nbsp; host www.XXX.com<br />
run cmd:&nbsp;&nbsp;ping www.XXX.com<br />
<br />
<br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/270953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-15 23:49 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu setting network (DHCP -&gt; Static IP)</title><link>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270951.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 15 May 2009 15:23:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270951.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/270951.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/270951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/270951.html</trackback:ping><description><![CDATA[pls refer: <a href="http://www.linuxdiyf.com/viewarticle.php?id=87424">http://www.linuxdiyf.com/viewarticle.php?id=87424</a> <br />
<br />
Step I): change the&nbsp;network&nbsp;config file.<br />
1)run command :$ sudo vi /etc/network/interfaces<br />
2)Find and remove dhcp entry:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iface eth0 inet dhcp<br />
3)Append new network settings:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iface eth0 inet static<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address 192.168.1.100<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netmask 255.255.255.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;network 192.168.1.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;broadcast 192.168.1.255<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway 192.168.1.254<br />
<br />
Step II):Define new DNS servers<br />
Open /etc/resolv.conf file<br />
$ sudo vi /etc/resolv.conf <br />
search myisp.com<br />
nameserver 192.168.1.254<br />
nameserver 202.54.1.20<br />
nameserver 202.54.1.30<br />
<br />
Step III) Restart the network<br />
$ sudo /etc/init.d/networking restart<br />
<br />
Step IV): check the network:<br />
1)ping the gateway : ping 192.168.1.254<br />
2)check dns server:&nbsp; host <a href="http://www.XXX.com">www.XXX.com</a><br />
3)ping the remote machine: ping host www.XXX.com <br />
<br />
Reference:
<h1 class="title"><span style="font-size: 12pt"><span style="font-size: 10pt"><span><span style="font-size: 8pt"><span><span><span>&nbsp;
<h1 class="title">如何在 Windows XP 中配置 Internet 连接共享</h1>
<h1 class="title"><a href="http://support.microsoft.com/kb/306126/zh-cn">http://support.microsoft.com/kb/306126/zh-cn</a> </h1>
</span></span></span></span></span></span></span><br />
</h1>
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/270951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2009-05-15 23:23 <a href="http://www.blogjava.net/jinfeng_wang/archive/2009/05/15/270951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>