﻿<?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-随笔分类-Linux</title><link>http://www.blogjava.net/jinfeng_wang/category/19728.html</link><description>G-G-S,D-D-U!</description><language>zh-cn</language><lastBuildDate>Fri, 16 Apr 2010 12:22:07 GMT</lastBuildDate><pubDate>Fri, 16 Apr 2010 12:22:07 GMT</pubDate><ttl>60</ttl><item><title>网络服务器设计的模型及一些设计方法zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318495.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 16 Apr 2010 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318495.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/318495.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/318495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/318495.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: medium 'MS PGothic'; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; font-family: verdana, sans-serif; text-align: center"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="1" alt="" src="http://cq144.csdn.net/visitlog.php?screen=1280x800&amp;host=blog.csdn.net&amp;browser=Netscape%205%20&amp;os=Windows&amp;url=http://blog.csdn.net/proad/archive/2008/04/16/2296925.aspx&amp;username=J2eeLearner" width="1" border="0" /><iframe id="myframe" border="0" name="myframe" src="http://www.csdn.net/ggmm/dd333.htm" frameborder="no" width="0" scrolling="no" height="0"></iframe></span></span> <a href="http://blog.csdn.net/proad/archive/2008/04/16/2296925.aspx">http://blog.csdn.net/proad/archive/2008/04/16/2296925.aspx</a><br />
<br />
<br />
<span class="Apple-style-span" style="word-spacing: 0px; font: medium 'MS PGothic'; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: verdana, sans-serif; text-align: left">
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>1. 常用服务器模型</strong><br />
a.迭代服务器：只有一个进程/线程处理请求。一般为单进程,加上select多路复用,非阻塞socket。<br />
b.迭代/并发混合型服务器：平时迭代处理，对消耗大的请求并发处理。处理请求时设置一个超时，当请求的处理时间超时时，创建一个进程/线程，把处理转给新的进程/线程处理，主进程/线程继续处理其他请求。<br />
c.并发服务器：多个进程/线程并发处理请求。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>2. 以上三类的服务器比较</strong><br />
迭代服务器：最简单，性能不高。<br />
并发服务器：性能较高，但结构相对比较复杂，开发难度中等。<br />
迭代/并发混合型服务器：性能不错，但结构通常比单纯的并发服务器更复杂。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>3. 多进程的并发服务器</strong><br />
a. 每个连接fork一个进程：主进程accpet连接，有新连接到来时fork一个进程，然后继续accept，等待新的连接。数据传输由子进程处理，处理完后子进程exit。每个子进程只处理一个连接。<br />
b. Prefork进程：主进程预先fork一些进程，各个子进程竞争accept，然后处理数据传输。一个子进程可以处理一个连接，也可以同时处理多个连接（通过select等）。<br />
c. Prefork进程：由父进程accept请求，通过流管道转发fd到子进程，子进程收到fd后，处理数据传输，处理结束后通知父进程。父进程处理的事情比较简单，容易监控子进程。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">以上3种方式性能比较：<br />
a.每个连接fork一个进程：处理smtp等状态较多，数据量比较大时比较简单实用，总体性能不大好。<br />
b.Prefork进程，各个子进程竞争accept：比较简单，性能不错。<br />
c.Prefork进程，由父进程accept请求，通过流管道转发fd到子进程：代码复杂，性能一般不如上一种。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>4. 多线程的并发服务器</strong><br />
a.每个连接一个线程<br />
b.Prethread多个线程，各个线程互斥accept<br />
c.Prethread多个线程，主线程accept并分发连接给子线程</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>5. 多进程与多线程的比较</strong><br />
使用线程的模型：性能比使用进程要高，但代码比较复杂，对代码质量要求更高，线程出错后可能会影响到所有线程，多进程的模式一个进程出错一般不会影响其他进程。<br />
多线程模型共享数据比较简单有效，多进程模型共享数据比较麻烦，效率也不如线程。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>6. 一些流行的网络服务器采用的模型</strong></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>Sendmail:</strong><span class="Apple-converted-space">&nbsp;</span>采用多进程，每个连接fork一个进程.<br />
每个连接fork一个子进程<br />
子进程只处理一个连接<br />
子进程fork一个localmail进程（可以由用户自己编写），通过管道把数据转给localmail处理，把邮件处理业务逻辑独立出来<br />
优点：结构简单，不用维护复杂的状态机</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>Apache1.3:</strong>采用多进程, prefork进程<br />
子进程竞争accept，每次只处理一个连接<br />
主进程不accept，根据负载情况调整子进程数量<br />
子进程运行一段时间后，主进程会让它退出，然后创建一个新的进程，防止内存泄漏等<br />
主进程通过shared memory监控子进程</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><strong>移动QQ:</strong><span class="Apple-converted-space">&nbsp;</span>Prefork多个进程，竞争accept,<br />
典型的一问一答TCP服务器，结构简单<br />
每个进程通过select可以同时处理多个连接<br />
采用这种结构的原因有：<br />
每秒请求&lt;1000，可以满足要求<br />
结构简单，容易开发、维护</p>
</span></span>
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/318495.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> 2010-04-16 11:36 <a href="http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Network Programming Using Libevent zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318479.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 16 Apr 2010 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318479.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/318479.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/318479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/318479.html</trackback:ping><description><![CDATA[http://blog.gslin.org/archives/2005/11/24/220/<br />
<br />
<br />
在課堂上學過 Unix Network Programming 後，我們知道在處理多 User 時會有幾種方法解決：<br />
<ol>
    <li>一個新的 Connection 進來，用 <code>fork()</code> 產生一個 Process 處理。
    <li>一個新的 Connection 進來，用 <code>pthread_create()</code> 產生一個 Thread 處理。
    <li>一個新的 Connection 進來，丟入 Event-based Array，由 Main Process 以 Nonblocking 的方式處理所有的 I/O。<br />
    </li>
</ol>
這三種方法當然也都有各自的缺點：<br />
<ol>
    <li>用 <code>fork()</code> 的問題在於每一個 Connection 進來時的成本太高。
    <li>用 Multi-thread 的問題在於 Thread-safe 與 Deadlock 問題難以解決，另外有 Memory-leak 的問題要處理。
    <li>用 Event-based 的方式在於實做上不好寫，尤其是要注意到事件產生時必須 Nonblocking，於是會需要實做 Buffering 的問題，而 Multi-thread 所會遇到的 Memory-leak 問題在這邊會更嚴重。而在多 CPU 的系統上沒有辦法使用到所有的 CPU resource。<br />
    </li>
</ol>
當然，針對前面兩項有各自的解法：<br />
<ol>
    <li>以 Poll 的方式解決：當一個 Process 處理完一個 Connection 後，不直接死掉，而繼續回到 accept() 的狀態繼續處理，但這樣會遇到 Memory-leak 的問題，於是採用這種方式的人通常會再加上「處理過 N 個 Connection 後死掉，由 Parent Process 再 <code>fork()</code> 一隻新的」。最有名的例子是 <a href="http://httpd.apache.org/">Apache</a> 1.3。
    <li>Thread-safe 的問題可以透過自己撰寫，或是尋找其他 Thread-safe Library 直接使用。Memory-leak 的問題可以試著透過 Garbage Collection Library 分析出來。<a href="http://httpd.apache.org/">Apache</a> 2.0 的 Thread MPM 就是使用這個模式。<br />
    </li>
</ol>
然而，目前高效率的 Server 都偏好採用 Event-based，一方面是沒有 Create Process/Thread 所造成的 Overhead，另外一方面是不需要透過 Shared Memory 或是 Mutex 在不同的 Process/Thread 之間交換資料。<br />
<br />
然而，Event-based 在實做上的幾個複雜的地方在於：<br />
<ol>
    <li><code>select()</code> 與 <code>poll()</code> 的效率過慢，造成每次要判斷「有哪些 Event 發生」這件事情的成本很高，這在 BSD 支援 <code>kqueue()</code>、Linux 支援 <code>epoll()</code>、Solaris 支援 <code>/dev/poll</code> 後就解決了，但這兩組 Function 都不是 Standard，於是在不同的平台上就必須再改一次。<br />
    <li>因為 Nonblocking，所以在 <code>write()</code> 或是 <code>send()</code> 時滿了需要自己 Buffering。
    <li>因為 Nonblocking，所以不能使用 <code>fgets()</code> 或是其他類似的 function，於是需要自己刻一個 Nonblocking 的 <code>fgets()</code>。但是使用者所丟過來的資料又不能保證在一次 <code>read()</code> 或 <code>recv()</code> 就有一行，於是要自己做 Buffering。</li>
</ol>
實際上這三件事情在 <a href="http://www.monkey.org/%7Eprovos/libevent/">libevent</a> 都有 Library 處理掉了。<br />
<br />
另外值得注意的一點在於 <a href="http://www.monkey.org/%7Eprovos/libevent/">libevent</a> 使用的是 3-clause BSD license 而非 GPL，所以在不想公開程式碼 (像是商業用途) 的情況下會比其他的 Library 適合。<br />
<br />
<br />
<br />
<div class="post-body">
<p>
<div style="clear: both"></div>
接下來要談的是 <a href="http://www.monkey.org/%7Eprovos/libevent/">libevent</a> 要如何使用，不過為了方便起見，我們直接寫一個很簡單的 Time Server 來當作例子：當你連上去以後 Server 端直接提供時間，然後結束連線。<br />
<br />
在這些例子裡面我以 <a href="http://www.tw.freebsd.org/">FreeBSD</a> 6.0 當作測試的平台，另外使用 <a href="http://www.monkey.org/%7Eprovos/libevent/">libevent</a> 1.1a 當作 Event-based Library，Compile 時請使用 <code>gcc -I/usr/local/include -o timeserver timeserver.c -L/usr/local/lib -levent</code> (如果 <a href="http://www.monkey.org/%7Eprovos/libevent/">libevent</a> 的 Header 與 Library 放在 <code>/usr/include</code> 與 <code>/usr/lib</code> 下的話可以省略這兩個參數)。<br />
<br />
原始程式碼在文章的最後頭。<br />
<br />
<code>event_init()</code> 表示初始化 <a href="http://www.monkey.org/%7Eprovos/libevent/">libevent</a> 所使用到的變數。<br />
<br />
<code>event_set(&amp;ev, s, EV_READ | EV_PERSIST, connection_accept, &amp;ev)</code> 把 <code>s</code> 這個 File Description 放入 <code>ev</code> (第一個參數與第二個參數)，並且告知當事件 (第三個參數的 <code>EV_READ</code>) 發生時要呼叫 <code>connection_accept()</code> (第四個參數)，呼叫時要把 <code>ev</code> 當作參數丟進去 (第五個參數)。<br />
<br />
其中的 <code>EV_PERSIST</code> 表示當呼叫進去的時候不要把這個 event 拿掉 (繼續保留在 Event Queue 裡面)，這點可以跟 <code>connection_accept()</code> 內在註冊 <code>connection_time()</code> 的程式碼做比較。<br />
<br />
而 <code>event_add(&amp;ev, NULL)</code> 就是把 <code>ev</code> 註冊到 event queue 裡面，第二個參數指定的是 Timeout 時間，設定成 <code>NULL</code> 表示忽略這項設定。<br />
<br />
最後的 <code>event_dispatch()</code> 表示進入 event loop，當 Queue 裡面的任何一個 File Description 發生事件的時候就會進入 callback function 執行。<br />
<br />
這隻程式非常粗糙，有很多地方沒有注意到 Blocking 的問題，這點我們就先不管了。當跑起來以後你就可以連到 port 7000，就會出現類似下面的結果：gslin@netnews [~] [3:14/W5] t 0 7000<br />
<blockquote><code><br />
gslin@netnews [~/work/C] [3:15/W3] t 0 7000<br />
Trying 0.0.0.0...<br />
Connected to 0.<br />
Escape character is '^]'.<br />
Fri Nov 25 03:15:10 2005<br />
Connection closed by foreign host.<br />
</code></blockquote><br />
最基本的使用就是這樣了，你可以 <code>man event</code> 看到完整的說明。<br />
<br />
這是 <code>timeserver.c</code>：<br />
<pre><code><br />
#include &lt;netinet/in.h&gt;<br />
#include &lt;sys/socket.h&gt;<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;event.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;time.h&gt;<br />
<br />
void connection_time(int fd, short event, struct event *arg)<br />
{<br />
char buf[32];<br />
struct tm t;<br />
time_t now;<br />
<br />
time(&amp;now);<br />
localtime_r(&amp;now, &amp;t);<br />
asctime_r(&amp;t, buf);<br />
<br />
write(fd, buf, strlen(buf));<br />
shutdown(fd, SHUT_RDWR);<br />
<br />
free(arg);<br />
}<br />
<br />
void connection_accept(int fd, short event, void *arg)<br />
{<br />
/* for debugging */<br />
fprintf(stderr, "%s(): fd = %d, event = %d.\n", __func__, fd, event);<br />
<br />
/* Accept a new connection. */<br />
struct sockaddr_in s_in;<br />
socklen_t len = sizeof(s_in);<br />
int ns = accept(fd, (struct sockaddr *) &amp;s_in, &amp;len);<br />
if (ns &lt; 0) {<br />
perror("accept");<br />
return;<br />
}<br />
<br />
/* Install time server. */<br />
struct event *ev = malloc(sizeof(struct event));<br />
event_set(ev, ns, EV_WRITE, (void *) connection_time, ev);<br />
event_add(ev, NULL);<br />
}<br />
<br />
int main(void)<br />
{<br />
/* Request socket. */<br />
int s = socket(PF_INET, SOCK_STREAM, 0);<br />
if (s &lt; 0) {<br />
perror("socket");<br />
exit(1);<br />
}<br />
<br />
/* bind() */<br />
struct sockaddr_in s_in;<br />
bzero(&amp;s_in, sizeof(s_in));<br />
s_in.sin_family = AF_INET;<br />
s_in.sin_port = htons(7000);<br />
s_in.sin_addr.s_addr = INADDR_ANY;<br />
if (bind(s, (struct sockaddr *) &amp;s_in, sizeof(s_in)) &lt; 0) {<br />
perror("bind");<br />
exit(1);<br />
}<br />
<br />
/* listen() */<br />
if (listen(s, 5) &lt; 0) {<br />
perror("listen");<br />
exit(1);<br />
}<br />
<br />
/* Initial libevent. */<br />
event_init();<br />
<br />
/* Create event. */<br />
struct event ev;<br />
event_set(&amp;ev, s, EV_READ | EV_PERSIST, connection_accept, &amp;ev);<br />
<br />
/* Add event. */<br />
event_add(&amp;ev, NULL);<br />
<br />
event_dispatch();<br />
<br />
return 0;<br />
}<br />
</code></pre>
<div style="clear: both; padding-bottom: 0.25em"></div>
<p>&nbsp;</p>
</div>
<div class="post-body">
<p>
<div style="clear: both"></div>
這次要談的跟 Network Programming 沒有直接的關係。<br />
<br />
在寫 Nonblocking Network Program 通常要處理 Buffering 的問題，但並不好寫，主要是因為 <code>read()</code> 或 <code>recv()</code> 不保證可以一次讀到一行的份量進來。<br />
<br />
在 <a href="http://www.monkey.org/%7Eprovos/libevent/">libevent</a> 裡面提供相當不錯的 Buffer Library 可以用，完整的說明在 <code>man event</code> 的時候可以看到，最常用的應該就是以 <code>evbuffer_add()</code>、<code>evbuffer_readline()</code> 這兩個 Function，其他的知道存在就可以了，需要的時候再去看詳細的用法。<br />
<br />
下面直接提供 <code>libevent-buff.c</code> 當作範例，編譯後看執行結果，再回頭來看 source code 應該就有感覺了：<br />
<pre><code><br />
#include &lt;sys/time.h&gt;<br />
#include &lt;event.h&gt;<br />
#include &lt;stdio.h&gt;<br />
<br />
void printbuf(struct evbuffer *evbuf)<br />
{<br />
for (;;) {<br />
char *buf = evbuffer_readline(evbuf);<br />
printf("* buf = %p, the string = \"\e[1;33m%s\e[m\"\n", buf, buf);<br />
if (buf == NULL)<br />
break;<br />
free(buf);<br />
}<br />
}<br />
<br />
int main(void)<br />
{<br />
struct evbuffer *evbuf;<br />
<br />
evbuf = evbuffer_new();<br />
if (evbuf == NULL) {<br />
fprintf(stderr, "%s(): evbuffer_new() failed.\n", __func__);<br />
exit(1);<br />
}<br />
<br />
/* Add "gslin" into buffer. */<br />
u_char *buf1 = "gslin";<br />
printf("* Add \"\e[1;33m%s\e[m\".\n", buf1);<br />
evbuffer_add(evbuf, buf1, strlen(buf1));<br />
printbuf(evbuf);<br />
<br />
u_char *buf2 = " is reading.\nAnd he is at home.\nLast.";<br />
printf("* Add \"\e[1;33m%s\e[m\".\n", buf2);<br />
evbuffer_add(evbuf, buf2, strlen(buf2));<br />
printbuf(evbuf);<br />
<br />
evbuffer_free(evbuf);<br />
}<br />
</code></pre>
<div style="clear: both; padding-bottom: 0.25em"></div>
<p>&nbsp;</p>
</div>
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/318479.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> 2010-04-16 10:29 <a href="http://www.blogjava.net/jinfeng_wang/archive/2010/04/16/318479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用rsync实现网站镜像和备份 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2010/04/14/318279.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Wed, 14 Apr 2010 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2010/04/14/318279.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/318279.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2010/04/14/318279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/318279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/318279.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: 12px 'MS PGothic'; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="line-height: 18px; border-collapse: collapse">
<p><br class="Apple-interchange-newline" />
2、rsync的配置</p>
<p>对于rsync服务器来说，最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf，其控制认证、访问、日志记录等等。</p>
<p>该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始，直到下一个模块定义开始或者文件结束，模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树，比方说在我们的实例环境中，有三个目录树需要备份：/www/、/home/web_user1/和/home/web_user2/，那么就需要在配置文件中定义三个模块，分别对应三个目录树。</p>
<p>配置文件是行为单位的，也就是每个新行都表示一个新的注释、模块定义或者参数赋值。以#开始的行表示注释，以""结束的行表示下面一行是该行的继续。参数赋值中等号后可能是一个大小写不敏感的字符串、一个以trure/false表示的布尔值。</p>
<p>全局参数</p>
<p>在文件中[modlue]之前的所有参数都是全局参数，当然也可以在全局参数部分定义模块参数，这时候该参数的值就是所有模块的默认值。</p>
<p>motd file</p>
<p>"motd file"参数用来指定一个消息文件，当客户连接服务器时该文件的内容显示给客户，默认是没有motd文件的。</p>
<p>log file</p>
<p>"log file"指定rsync的日志文件，而不将日志发送给syslog。</p>
<p>pid file</p>
<p>指定rsync的pid文件。</p>
<p>syslog facility</p>
<p>指定rsync发送日志消息给syslog时的消息级别，常见的消息级别是：uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。</p>
<p>模块参数</p>
<p>在全局参数之后就需要定义一个或多个模块了，模块中可以定义以下参数：</p>
<p>comment</p>
<p>给模块指定一个描述，该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。</p>
<p>path</p>
<p>指定该模块的供备份的目录树路径，该参数是必须指定的。</p>
<p>use chroot</p>
<p>如果"use chroot"指定为true，那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护，但是缺点是需要以roots权限，并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。</p>
<p>max connections</p>
<p>指定该模块的最大并发连接数量以保护服务器，超过限制的连接请求将被告知随后再试。默认值是0，也就是没有限制。</p>
<p>lock file</p>
<p>指定支持max connections参数的锁文件，默认值是/var/run/rsyncd.lock。</p>
<p>read only</p>
<p>该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败，如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。</p>
<p>list</p>
<p>该选项设定当客户请求可以使用的模块列表时，该模块是否应该被列出。如果设置该选项为false，可以创建隐藏的模块。默认值是true。</p>
<p>uid</p>
<p>该选项指定当该模块传输文件时守护进程应该具有的uid，配合gid选项使用可以确定哪些可以访问怎么样的文件权限，默认值是"nobody"。</p>
<p>gid</p>
<p>该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。</p>
<p>exlude</p>
<p>用来指定多个由空格隔开的多个模式列表，并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式，不过配置文件中指定的exlude模式不会传递给客户端，而仅仅应用于服务器。一个模块只能指定一个exlude选项，但是可以在模式前面使用"-"和"+"来指定是exclude还是include。</p>
<p>但是需要注意的一点是该选项有一定的安全性问题，客户很有可能绕过exlude列表，如果希望确保特定的文件不能被访问，那就最好结合uid/gid选项一起使用。</p>
<p>exlude from</p>
<p>指定一个包含exclude模式的定义的文件名，服务器从该文件中读取exlude列表定义。</p>
<p>include</p>
<p>用来指定多个由空格隔开的多个rsync并应该exlude的模式列表。这等同于在客户端命令中使用--include来指定模式，结合include和exlude可以定义复杂的exlude/include规则 。一个模块只能指定一个include选项，但是可以在模式前面使用"-"和"+"来指定是exclude还是include。</p>
<p>include from</p>
<p>指定一个包含include模式的定义的文件名，服务器从该文件中读取include列表定义。</p>
<p>auth users</p>
<p>该选项指定由空格或逗号分隔的用户名列表，只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置，那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。</p>
<p>secrets file</p>
<p>该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时，该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名，需要限式指定一个。(例如：/etc/rsyncd.secrets)</p>
<p>strict modes</p>
<p>该选项指定是否监测密码文件的权限，如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问，其他任何用户不可以访问该文件。默认值为true。</p>
<p>hosts allow</p>
<p>该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式：</p>
<p>o xxx.xxx.xxx.xxx，客户主机只有完全匹配该IP才允许访问。例如：192.167.0.1</p>
<p>o a.b.c.d/n，属于该网络的客户都允许连接该模块。例如：192.168.0.0/24</p>
<p>o a.b.c.d/e.f.g.h，属于该网络的客户都允许连接该模块。例如：192.168.0.0/255.255.255.0</p>
<p>o 一个主机名，客户主机只有拥有该主机名才允许访问，例如：backup.linuxaid.com.cn。</p>
<p><br />
o *.linuxaid.com.cn，所有属于该域的主机都允许。</p>
<p>默认是允许所有主机连接。</p>
<p>hosts deny</p>
<p>指定不允许连接rsync服务器的机器，可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。</p>
<p>ignore errors</p>
<p>指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误，一般来说rsync在出现IO错误时将将跳过--delete操作，以防止因为暂时的资源不足或其它IO错误导致的严重问题。</p>
<p>ignore nonreadable</p>
<p>指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。</p>
<p>transfer logging</p>
<p>使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。</p>
<p>log format</p>
<p>通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串，可以使用的格式定义符如下所示：</p>
<p>o %h 远程主机名</p>
<p>o %a 远程IP地址</p>
<p>o %l 文件长度字符数</p>
<p>o %p 该次rsync会话的进程id</p>
<p>o %o 操作类型："send"或"recv"</p>
<p>o %f 文件名</p>
<p>o %P 模块路径</p>
<p>o %m 模块名</p>
<p>o %t 当前时间</p>
<p>o %u 认证的用户名(匿名时是null)</p>
<p>o %b 实际传输的字节数</p>
<p>o %c 当发送文件时，该字段记录该文件的校验码</p>
<p>默认log格式为："%o %h [%a] %m (%u) %f %l"，一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。</p>
<p>timeout</p>
<p>通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户。超时单位为秒钟，0表示没有超时定义，这也是默认值。对于匿名rsync服务器来说，一个理想的数字是600。</p>
<p>refuse options</p>
<p>通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名，而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩，应该是："dont compress = *"。</p>
<p>dont compress</p>
<p>用来指定那些不进行压缩处理再传输的文件，默认值是</p>
<p>*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz</p>
<p>rsync客户命令</p>
<p>在对rsync服务器配置结束以后，下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。rsync是一个功能非常强大的工具，其命令也有很多功能特色选项，我们下面就对它的选项一一进行分析说明。</p>
<p>首先，rsync的命令格式可以为：</p>
<p>rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST</p>
<p>rsync [OPTION]... [USER@]HOST:SRC DEST</p>
<p>rsync [OPTION]... SRC [SRC]... DEST</p>
<p>rsync [OPTION]... [USER@]HOST::SRC [DEST]</p>
<p>rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST</p>
<p>rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]<span class="Apple-converted-space">&nbsp;</span><br />
rsync有六种不同的工作模式：</p>
<p>拷贝本地文件；当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。</p>
<p>使用一个远程shell程序（如rsh、ssh）来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。</p>
<p>使用一个远程shell程序（如rsh、ssh）来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。</p>
<p>从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。</p>
<p>从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。</p>
<p>列远程机的文件列表。这类似于rsync传输，不过只要在命令中省略掉本地机信息即可。</p>
<p>1、用法</p>
<p>在使用rsync传输文件时，需要指定一个源和一个目的，其中一个可能是远程机器的资源信息。例如：</p>
<p>rsync *.c foo:src/</p>
<p>表示将传输当前目录下所有以.c结尾的文件到机器foo的src目录下。如果任何文件已经存在于远程系统，则会调用远程更新协议来实现仅仅传输那些更新过的文件。</p>
<p>rsync -avz foo:src/bar /data/tmp</p>
<p>该命令则递归地传输机器foo上的src/bar目录下的所有内容到本地/data/tmp/bar目录中。文件以归档模式进行传输，以确保符号链结、属性、权限、属主等信息在传输中都被保存。此外，可以使用压缩技术来加快数据传输：</p>
<p>rsync -avz foo:src/bar/ /data/tmp</p>
<p>路径信息以"/"结尾时表示拷贝该目录，而不以"/"结尾表示拷贝该目录。当配合使用--delete选项时这两种情况的区别将会表现出来。</p>
<p>也可以以本地模式来使用rsync，如果SRC和DST路径中都没有任何":"符号则表示该命令运行在本地模式，等同于cp命令。</p>
<p>rsync somehost.mydomain.com::</p>
<p>这种模式则将会列出somehost.mydomain.com.可以访问的所有模块信息。</p>
<p>选项说明</p>
<p>-v, --verbose 详细模式输出<span class="Apple-converted-space">&nbsp;</span><br />
-q, --quiet 精简输出模式<span class="Apple-converted-space">&nbsp;</span><br />
-c, --checksum 打开校验开关，强制对文件传输进行校验<span class="Apple-converted-space">&nbsp;</span><br />
-a, --archive 归档模式，表示以递归方式传输文件，并保持所有文件属性，等于-rlptgoD<span class="Apple-converted-space">&nbsp;</span><br />
-r, --recursive 对子目录以递归模式处理<span class="Apple-converted-space">&nbsp;</span><br />
-R, --relative 使用相对路径信息</p>
<p>rsync foo/bar/foo.c remote:/tmp/</p>
<p>则在/tmp目录下创建foo.c文件，而如果使用-R参数：</p>
<p>rsync -R foo/bar/foo.c remote:/tmp/</p>
<p>则会创建文件/tmp/foo/bar/foo.c，也就是会保持完全路径信息。</p>
<p>-b, --backup 创建备份，也就是对于目的已经存在有同样的文件名时，将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。<span class="Apple-converted-space">&nbsp;</span><br />
--backup-dir 将备份文件(如~filename)存放在在目录下。<span class="Apple-converted-space">&nbsp;</span><br />
-suffix=SUFFIX 定义备份文件前缀<span class="Apple-converted-space">&nbsp;</span><br />
-u, --update 仅仅进行更新，也就是跳过所有已经存在于DST，并且文件时间晚于要备份的文件。(不覆盖更新的文件)<span class="Apple-converted-space">&nbsp;</span><br />
-l, --links 保留软链结<span class="Apple-converted-space">&nbsp;</span><br />
-L, --copy-links 想对待常规文件一样处理软链结<span class="Apple-converted-space">&nbsp;</span><br />
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结<span class="Apple-converted-space">&nbsp;</span><br />
--safe-links 忽略指向SRC路径目录树以外的链结<span class="Apple-converted-space">&nbsp;</span><br />
-H, --hard-links 保留硬链结<span class="Apple-converted-space">&nbsp;</span><br />
-p, --perms 保持文件权限<span class="Apple-converted-space">&nbsp;</span><br />
-o, --owner 保持文件属主信息<span class="Apple-converted-space">&nbsp;</span><br />
-g, --group 保持文件属组信息<span class="Apple-converted-space">&nbsp;</span><br />
-D, --devices 保持设备文件信息<span class="Apple-converted-space">&nbsp;</span><br />
-t, --times 保持文件时间信息<span class="Apple-converted-space">&nbsp;</span><br />
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间<span class="Apple-converted-space">&nbsp;</span><br />
-n, --dry-run现实哪些文件将被传输<span class="Apple-converted-space">&nbsp;</span><br />
-W, --whole-file 拷贝文件，不进行增量检测<span class="Apple-converted-space">&nbsp;</span><br />
-x, --one-file-system 不要跨越文件系统边界<span class="Apple-converted-space">&nbsp;</span><br />
-B, --block-size=SIZE 检验算法使用的块尺寸，默认是700字节<span class="Apple-converted-space">&nbsp;</span><br />
-e, --rsh=COMMAND 指定替代rsh的shell程序<span class="Apple-converted-space">&nbsp;</span><br />
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息<span class="Apple-converted-space">&nbsp;</span><br />
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件，用来排除那些不希望传输的文件<span class="Apple-converted-space">&nbsp;</span><br />
--existing 仅仅更新那些已经存在于DST的文件，而不备份那些新创建的文件<span class="Apple-converted-space">&nbsp;</span><br />
--delete 删除那些DST中SRC没有的文件<span class="Apple-converted-space">&nbsp;</span><br />
--delete-excluded 同样删除接收端那些被该选项指定排除的文件<span class="Apple-converted-space">&nbsp;</span><br />
--delete-after 传输结束以后再删除<span class="Apple-converted-space">&nbsp;</span><br />
--ignore-errors 及时出现IO错误也进行删除<span class="Apple-converted-space">&nbsp;</span><br />
--max-delete=NUM 最多删除NUM个文件<span class="Apple-converted-space">&nbsp;</span><br />
--partial 保留那些因故没有完全传输的文件，以是加快随后的再次传输<span class="Apple-converted-space">&nbsp;</span><br />
--force 强制删除目录，即使不为空<span class="Apple-converted-space">&nbsp;</span><br />
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名<span class="Apple-converted-space">&nbsp;</span><br />
--timeout=TIME IP超时时间，单位为秒<span class="Apple-converted-space">&nbsp;</span><br />
-I, --ignore-times 不跳过那些有同样的时间和长度的文件<span class="Apple-converted-space">&nbsp;</span><br />
--size-only 当决定是否要备份文件时，仅仅察看文件大小而不考虑文件时间<span class="Apple-converted-space">&nbsp;</span><br />
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口，默认为0<span class="Apple-converted-space">&nbsp;</span><br />
-T --temp-dir=DIR 在DIR中创建临时文件<span class="Apple-converted-space">&nbsp;</span><br />
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份<span class="Apple-converted-space">&nbsp;</span><br />
-P 等同于 --partial<span class="Apple-converted-space">&nbsp;</span><br />
--progress 显示备份过程<span class="Apple-converted-space">&nbsp;</span><br />
-z, --compress 对备份的文件在传输时进行压缩处理<span class="Apple-converted-space">&nbsp;</span><br />
--exclude=PATTERN 指定排除不需要传输的文件模式<span class="Apple-converted-space">&nbsp;</span><br />
--include=PATTERN 指定不排除而需要传输的文件模式<span class="Apple-converted-space">&nbsp;</span><br />
--exclude-from=FILE 排除FILE中指定模式的文件<span class="Apple-converted-space">&nbsp;</span><br />
--include-from=FILE 不排除FILE指定模式匹配的文件<span class="Apple-converted-space">&nbsp;</span><br />
--version 打印版本信息<span class="Apple-converted-space">&nbsp;</span><br />
--address 绑定到特定的地址<span class="Apple-converted-space">&nbsp;</span><br />
--config=FILE 指定其他的配置文件，不使用默认的rsyncd.conf文件<span class="Apple-converted-space">&nbsp;</span><br />
--port=PORT 指定其他的rsync服务端口<span class="Apple-converted-space">&nbsp;</span><br />
--blocking-io 对远程shell使用阻塞IO<span class="Apple-converted-space">&nbsp;</span><br />
-stats 给出某些文件的传输状态<span class="Apple-converted-space">&nbsp;</span><br />
--progress 在传输时现实传输过程<span class="Apple-converted-space">&nbsp;</span><br />
--log-format=FORMAT 指定日志文件格式<span class="Apple-converted-space">&nbsp;</span><br />
--password-file=FILE 从FILE中得到密码<span class="Apple-converted-space">&nbsp;</span><br />
--bwlimit=KBPS 限制I/O带宽，KBytes per second<span class="Apple-converted-space">&nbsp;</span><br />
-h, --help 显示帮助信息</p>
<p>实例分析</p>
<p>这里假设有两台服务器：A和B。其中A是主web服务器，具有域名<a style="font-size: 9pt; color: black; text-decoration: none" href="http://www.linuxaid.com.cn(202.99.11.120/">www.linuxaid.com.cn(202.99.11.120</a>)，B服务器是备份机，其域名为backup.linuxaid.com.cn(202.99.11.121)。其中A的web内容存放在以下几个地方：/www/和/home/web_user1/和/home/web_user2/。我们需要在备份机B上建立对这几个目录内容的备份。</p>
<p>服务器配置实例</p>
<p>那么在<a style="font-size: 9pt; color: black; text-decoration: none" href="http://www.linuxaid.com.cn/">www.linuxaid.com.cn</a>上创建rsyncd的配置文件/etc/rsyncd.conf，内容如下：</p>
<p>uid = nobody<span class="Apple-converted-space">&nbsp;</span><br />
gid = nobody<span class="Apple-converted-space">&nbsp;</span><br />
use chroot = no<span class="Apple-converted-space">&nbsp;</span><br />
max connections = 4<span class="Apple-converted-space">&nbsp;</span><br />
pid file = /var/run/rsyncd.pid<span class="Apple-converted-space">&nbsp;</span><br />
lock file = /var/run/rsync.lock<span class="Apple-converted-space">&nbsp;</span><br />
log file = /var/log/rsyncd.log</p>
<p>[www]<span class="Apple-converted-space">&nbsp;</span><br />
path = /www/<span class="Apple-converted-space">&nbsp;</span><br />
ignore errors<span class="Apple-converted-space">&nbsp;</span><br />
read only = true<span class="Apple-converted-space">&nbsp;</span><br />
list = false<span class="Apple-converted-space">&nbsp;</span><br />
hosts allow = 202.99.11.121<span class="Apple-converted-space">&nbsp;</span><br />
hosts deny = 0.0.0.0/32<span class="Apple-converted-space">&nbsp;</span><br />
auth users = backup<span class="Apple-converted-space">&nbsp;</span><br />
secrets file = /etc/backserver.pas</p>
<p>[web_user1]<span class="Apple-converted-space">&nbsp;</span><br />
path = /home/web_user1/<span class="Apple-converted-space">&nbsp;</span><br />
ignore errors<span class="Apple-converted-space">&nbsp;</span><br />
read only = true<span class="Apple-converted-space">&nbsp;</span><br />
list = false<span class="Apple-converted-space">&nbsp;</span><br />
hosts allow = 202.99.11.121<span class="Apple-converted-space">&nbsp;</span><br />
hosts deny = 0.0.0.0/32<span class="Apple-converted-space">&nbsp;</span><br />
uid = web_user1<span class="Apple-converted-space">&nbsp;</span><br />
gid = web_user1<span class="Apple-converted-space">&nbsp;</span><br />
auth users = backup<span class="Apple-converted-space">&nbsp;</span><br />
secrets file = /etc/backserver.pas</p>
<p>[web_user2]<span class="Apple-converted-space">&nbsp;</span><br />
path = /home/web_user2/<span class="Apple-converted-space">&nbsp;</span><br />
ignore errors<span class="Apple-converted-space">&nbsp;</span><br />
read only = true<span class="Apple-converted-space">&nbsp;</span><br />
list = false<span class="Apple-converted-space">&nbsp;</span><br />
hosts allow = 202.99.11.121<span class="Apple-converted-space">&nbsp;</span><br />
hosts deny = 0.0.0.0/32<span class="Apple-converted-space">&nbsp;</span><br />
uid = web_user2<span class="Apple-converted-space">&nbsp;</span><br />
gid = web_user2<span class="Apple-converted-space">&nbsp;</span><br />
auth users = backup<span class="Apple-converted-space">&nbsp;</span><br />
secrets file = /etc/backserver.pas</p>
<p>这里定义有四个三个模块，分别对应于三个需要备份的目录树。这里只允许202.99.11.121备份本机的数据，并且需要认证。三个模块授权的备份用户都为backup，并且用户信息保存在文件/etc/backserver.pas中，其内容如下：</p>
<p>backup:bk_passwd</p>
<p>并且该文件只能是root用户可读写的，否则rsyncd启动时会出错。这些文件配置完毕以后，就需要在A服务器上启动rsyncd服务器：</p>
<p>rsync --daemon</p>
<p>客户命令示例</p>
<p>/usr/local/bin/rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/ssl.*/" --progress<a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#97;&#99;&#107;&#117;&#112;&#64;&#50;&#48;&#50;&#46;&#57;&#57;&#46;&#49;&#49;&#46;&#49;&#50;&#48;&#58;&#58;&#119;&#119;&#119;">backup@202.99.11.120::www</a><span class="Apple-converted-space">&nbsp;</span>/backup/www/ --password-file=/etc/rsync.pass</p>
<p>上面这个命令行中-vzrtopg里的v是verbose，z是压缩，r是recursive，topg都是保持文件原有属性如属主、时间的参数。--progress是指显示出详细的进度情况，--delete是指如果服务器端删除了这一文件，那么客户端也相应把文件删除，保持真正的一致。--exclude "logs/" 表示不对/www/logs目录下的文件进行备份。--exclude "conf/ssl.*/"表示不对/www/conf/ssl.*/目录下的文件进行备份。</p>
<p><a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#97;&#99;&#107;&#117;&#112;&#64;&#50;&#48;&#50;&#46;&#57;&#57;&#46;&#49;&#49;&#46;&#49;&#50;&#48;&#58;&#58;&#119;&#119;&#119;">backup@202.99.11.120::www</a><span class="Apple-converted-space">&nbsp;</span>表示对该命令是对服务器202.99.11.120中的www模块进行备份，backup表示使用backup来对该模块进行备份。</p>
<p>--password-file=/etc/rsync.pass来指定密码文件，这样就可以在脚本中使用而无需交互式地输入验证密码了，这里需要注意的是这份密码文件权限属性要设得只有root可读。</p>
<p>这里将备份的内容存放在备份机的/backup/www/目录下。</p>
<p>[root@linuxaid /]# /usr/local/bin/rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/ssl.*/" --progress<span class="Apple-converted-space">&nbsp;</span><a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#97;&#99;&#107;&#117;&#112;&#64;&#50;&#48;&#50;&#46;&#57;&#57;&#46;&#49;&#49;&#46;&#49;&#50;&#48;&#58;&#58;&#119;&#119;&#119;">backup@202.99.11.120::www</a><span class="Apple-converted-space">&nbsp;</span>/backup/www/ --password-file=/etc/rsync.pass<span class="Apple-converted-space">&nbsp;</span><br />
receiving file list ... done<span class="Apple-converted-space">&nbsp;</span><br />
./<span class="Apple-converted-space">&nbsp;</span><br />
1<span class="Apple-converted-space">&nbsp;</span><br />
785 (100%)<span class="Apple-converted-space">&nbsp;</span><br />
1.py<span class="Apple-converted-space">&nbsp;</span><br />
4086 (100%)<span class="Apple-converted-space">&nbsp;</span><br />
2.py<span class="Apple-converted-space">&nbsp;</span><br />
10680 (100%)<span class="Apple-converted-space">&nbsp;</span><br />
a<span class="Apple-converted-space">&nbsp;</span><br />
0 (100%)<span class="Apple-converted-space">&nbsp;</span><br />
ip<span class="Apple-converted-space">&nbsp;</span><br />
3956 (100%)<span class="Apple-converted-space">&nbsp;</span><br />
./<span class="Apple-converted-space">&nbsp;</span><br />
wrote 2900 bytes read 145499 bytes 576.34 bytes/sec<span class="Apple-converted-space">&nbsp;</span><br />
total size is 2374927 speedup is 45.34</p>
<p>对其它两个模块操作的命令分别为：</p>
<p>/usr/local/bin/rsync -vzrtopg --delete --progress<span class="Apple-converted-space">&nbsp;</span><a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#97;&#99;&#107;&#117;&#112;&#64;&#50;&#48;&#50;&#46;&#57;&#57;&#46;&#49;&#49;&#46;&#49;&#50;&#48;&#58;&#58;&#119;&#101;&#98;&#95;&#117;&#115;&#101;&#114;&#49;">backup@202.99.11.120::web_user1</a><span class="Apple-converted-space">&nbsp;</span>/backup/web_user1/ --password-file=/etc/rsync.pass</p>
<p>/usr/local/bin/rsync -vzrtopg --delete --progress<span class="Apple-converted-space">&nbsp;</span><a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#97;&#99;&#107;&#117;&#112;&#64;&#50;&#48;&#50;&#46;&#57;&#57;&#46;&#49;&#49;&#46;&#49;&#50;&#48;&#58;&#58;&#119;&#101;&#98;&#95;&#117;&#115;&#101;&#114;&#50;">backup@202.99.11.120::web_user2</a><span class="Apple-converted-space">&nbsp;</span>/backup/web_user2/ --password-file=/etc/rsync.pass</p>
<p>可以将客户命令通过crontab -e命令来实现自动备份，如crontab -e：</p>
<p>一些示例脚本</p>
<p>这里这些脚本都是rsync网站上的例子：</p>
<p>1、每隔七天将数据往中心服务器做增量备份</p>
<p>#!/bin/sh</p>
<p># This script does personal backups to a rsync backup server. You will end up<span class="Apple-converted-space">&nbsp;</span><br />
# with a 7 day rotating incremental backup. The incrementals will go<span class="Apple-converted-space">&nbsp;</span><br />
# into subdirectories named after the day of the week, and the current<span class="Apple-converted-space">&nbsp;</span><br />
# full backup goes into a directory called "current"<span class="Apple-converted-space">&nbsp;</span><br />
#<span class="Apple-converted-space">&nbsp;</span><a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#114;&#105;&#100;&#103;&#101;&#64;&#108;&#105;&#110;&#117;&#120;&#99;&#97;&#114;&#101;&#46;&#99;&#111;&#109;">tridge@linuxcare.com</a></p>
<p># directory to backup<span class="Apple-converted-space">&nbsp;</span><br />
BDIR=/home/$USER</p>
<p># excludes file - this contains a wildcard pattern per line of files to exclude<span class="Apple-converted-space">&nbsp;</span><br />
EXCLUDES=$HOME/cron/excludes</p>
<p># the name of the backup machine<span class="Apple-converted-space">&nbsp;</span><br />
BSERVER=owl</p>
<p># your password on the backup server<span class="Apple-converted-space">&nbsp;</span><br />
export RSYNC_PASSWORD=XXXXXX</p>
<p><br />
########################################################################</p>
<p>BACKUPDIR=`date +%A`<span class="Apple-converted-space">&nbsp;</span><br />
OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES<span class="Apple-converted-space">&nbsp;</span><br />
--delete --backup --backup-dir=/$BACKUPDIR -a"</p>
<p>export PATH=$PATH:/bin:/usr/bin:/usr/local/bin</p>
<p># the following line clears the last weeks incremental directory<span class="Apple-converted-space">&nbsp;</span><br />
[ -d $HOME/emptydir ]' 'mkdir $HOME/emptydir<span class="Apple-converted-space">&nbsp;</span><br />
rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/<span class="Apple-converted-space">&nbsp;</span><br />
rmdir $HOME/emptydir</p>
<p># now the actual transfer<span class="Apple-converted-space">&nbsp;</span><br />
rsync $OPTS $BDIR $BSERVER::$USER/current</p>
<p>2、备份至一个空闲的硬盘</p>
<p>#!/bin/sh</p>
<p>export PATH=/usr/local/bin:/usr/bin:/bin</p>
<p>LIST="rootfs usr data data2"</p>
<p>for d in $LIST; do<span class="Apple-converted-space">&nbsp;</span><br />
mount /backup/$d<span class="Apple-converted-space">&nbsp;</span><br />
rsync -ax --exclude fstab --delete /$d/ /backup/$d/<span class="Apple-converted-space">&nbsp;</span><br />
umount /backup/$d<span class="Apple-converted-space">&nbsp;</span><br />
done</p>
<p>DAY=`date "+%A"`</p>
<p>rsync -a --delete /usr/local/apache /data2/backups/$DAY<span class="Apple-converted-space">&nbsp;</span><br />
rsync -a --delete /data/solid /data2/backups/$DAY</p>
<p>3、对vger.rutgers.edu的cvs树进行镜像</p>
<p>#!/bin/bash</p>
<p>cd /var/www/cvs/vger/<span class="Apple-converted-space">&nbsp;</span><br />
PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin</p>
<p>RUN=`lps x | grep rsync | grep -v grep | wc -l`<span class="Apple-converted-space">&nbsp;</span><br />
if [ "$RUN" -gt 0 ]; then<span class="Apple-converted-space">&nbsp;</span><br />
echo already running<span class="Apple-converted-space">&nbsp;</span><br />
exit 1<span class="Apple-converted-space">&nbsp;</span><br />
fi</p>
<p>rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog</p>
<p>sum1=`sum $HOME/ChangeLog`<span class="Apple-converted-space">&nbsp;</span><br />
sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`</p>
<p>if [ "$sum1" = "$sum2" ]; then<span class="Apple-converted-space">&nbsp;</span><br />
echo nothing to do<span class="Apple-converted-space">&nbsp;</span><br />
exit 0<span class="Apple-converted-space">&nbsp;</span><br />
fi</p>
<p>rsync -az --delete --force vger.rutgers.edu::cvs/ /var/www/cvs/vger/<span class="Apple-converted-space">&nbsp;</span><br />
exit 0</p>
<p>FAQ</p>
<p>Q：如何通过ssh进行rsync，而且无须输入密码？<span class="Apple-converted-space">&nbsp;</span><br />
A：可以通过以下几个步骤</p>
<p>1. 通过ssh-keygen在server A上建立SSH keys，不要指定密码，你会在~/.ssh下看到identity和identity.pub文件<span class="Apple-converted-space">&nbsp;</span><br />
2. 在server B上的home目录建立子目录.ssh<span class="Apple-converted-space">&nbsp;</span><br />
3. 将A的identity.pub拷贝到server B上<span class="Apple-converted-space">&nbsp;</span><br />
4. 将identity.pub加到~[user b]/.ssh/authorized_keys<span class="Apple-converted-space">&nbsp;</span><br />
5. 于是server A上的A用户，可通过下面命令以用户B ssh到server B上了<span class="Apple-converted-space">&nbsp;</span><br />
e.g. ssh -l userB serverB<span class="Apple-converted-space">&nbsp;</span><br />
这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。</p>
<p>Q：如何通过在不危害安全的情况下通过防火墙使用rsync?<span class="Apple-converted-space">&nbsp;</span><br />
A：解答如下：</p>
<p>这通常有两种情况，一种是服务器在防火墙内，一种是服务器在防火墙外。无论哪种情况，通常还是使用ssh，这时最好新建一个备份用户，并且配置sshd仅允许这个用户通过RSA认证方式进入。 如果服务器在防火墙内，则最好限定客户端的IP地址，拒绝其它所有连接。如果客户机在防火墙内，则可以简单允许防火墙打开TCP端口22的ssh外发连接就ok了。</p>
<p>Q：我能将更改过或者删除的文件也备份上来吗？<span class="Apple-converted-space">&nbsp;</span><br />
A：当然可以：</p>
<p>你可以使用如：rsync -other -options -backupdir = ./backup-2000-2-13 ...这样的命令来实现。<span class="Apple-converted-space">&nbsp;</span><br />
这样如果源文件:/path/to/some/file.c改变了，那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c，<span class="Apple-converted-space">&nbsp;</span><br />
这里这个目录需要自己手工建立起来</p>
<p>Q：我需要在防火墙上开放哪些端口以适应rsync？<span class="Apple-converted-space">&nbsp;</span><br />
A：视情况而定</p>
<p>rsync可以直接通过873端口的tcp连接传文件，也可以通过22端口的ssh来进行文件传递，但你也可以通过下列命令改变它的端口：</p>
<p>rsync --port 8730 otherhost::<span class="Apple-converted-space">&nbsp;</span><br />
或者<span class="Apple-converted-space">&nbsp;</span><br />
rsync -e 'ssh -p 2002' otherhost:</p>
<p>Q：我如何通过rsync只复制目录结构，忽略掉文件呢？<span class="Apple-converted-space">&nbsp;</span><br />
A：rsync -av --include '*/' --exclude '*' source-dir dest-dir</p>
<p>Q：为什么我总会出现"Read-only file system"的错误呢？<span class="Apple-converted-space">&nbsp;</span><br />
A：看看是否忘了设"read only = no"了</p>
<p>Q：为什么我会出现<a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#64;&#69;&#82;&#82;&#79;&#82;">'@ERROR</a>: invalid gid'的错误呢？<span class="Apple-converted-space">&nbsp;</span><br />
A：rsync使用时默认是用uid=nobody;gid=nobody来运行的，如果你的系统不存在nobody组的话，就会出现这样的错误，可以试试gid = nogroup或者其它</p>
<p>Q：绑定端口873失败是怎么回事？<span class="Apple-converted-space">&nbsp;</span><br />
A：如果你不是以root权限运行这一守护进程的话，因为1024端口以下是特权端口，会出现这样的错误。你可以用--port参数来改变。</p>
<p>Q：为什么我认证失败？<span class="Apple-converted-space">&nbsp;</span><br />
A：从你的命令行看来：</p>
<p>你用的是：<span class="Apple-converted-space">&nbsp;</span><br />
&gt; bash$ rsync -a 144.16.251.213::test test<span class="Apple-converted-space">&nbsp;</span><br />
&gt; Password:<span class="Apple-converted-space">&nbsp;</span><br />
&gt; @ERROR: auth failed on module test<span class="Apple-converted-space">&nbsp;</span><br />
&gt;<span class="Apple-converted-space">&nbsp;</span><br />
&gt; I dont understand this. Can somebody explain as to how to acomplish this.<span class="Apple-converted-space">&nbsp;</span><br />
&gt; All suggestions are welcome.</p>
<p>应该是没有以你的用户名登陆导致的问题，试试rsync -a<span class="Apple-converted-space">&nbsp;</span><a style="font-size: 9pt; color: black; text-decoration: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#97;&#120;&#64;&#49;&#52;&#52;&#46;&#49;&#54;&#46;&#50;&#53;&#49;&#46;&#50;&#49;&#51;&#58;&#58;&#116;&#101;&#115;&#116;">max@144.16.251.213::test</a><span class="Apple-converted-space">&nbsp;</span>test<span class="Apple-converted-space">&nbsp;</span></p>
</span></span>
 <img src ="http://www.blogjava.net/jinfeng_wang/aggbug/318279.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> 2010-04-14 17:14 <a href="http://www.blogjava.net/jinfeng_wang/archive/2010/04/14/318279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>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>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>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></channel></rss>