|
網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來(lái)的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實(shí)現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計(jì)算機(jī)、存儲(chǔ)資源、數(shù)據(jù)資源、信息資源、知識(shí)資源、專家資源、大型數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。 Sppence Murray 是 Linux 開(kāi)發(fā)高手之一,同時(shí)長(zhǎng)期以來(lái)他一直是 UNIX 的堅(jiān)定支持者。本文介紹的是 Murray 和他在 Codemonks Consulting 的同事在日常的 Linux 開(kāi)發(fā)以及應(yīng)用服務(wù)工作中用到的基本技術(shù): shell 腳本,相信 Linux 的開(kāi)發(fā)人員都會(huì)受益于這項(xiàng)有用而且通用的技術(shù)。Spence Murray 是 Codemonks Consulting 的創(chuàng)始人之一,自從 20 世紀(jì) 80 年代最早在 SunOS 上編寫(xiě)代碼到現(xiàn)在,一直致力于 UNIX/Linux 的開(kāi)發(fā)。從那時(shí)起,他曾在 IBM 公司的 AIX、SGI 公司的 Irix 工作,長(zhǎng)時(shí)間地編寫(xiě)跨平臺(tái)的 UNIX 代碼,包括 HP/UX,Irix,Solaris/SunOS,SCO UNIX,各種 BSD,MacOS X,當(dāng)然,還有 Linux。從圖形/視頻設(shè)備驅(qū)動(dòng)程序到 UI 代碼,他什么工作都做過(guò)。Murray 編寫(xiě)的跨平臺(tái)代碼包括 X Window System Xserver 代碼,以及作為 Netscape Navigator 一部分的核心瀏覽器代碼。 Murray 最經(jīng)常使用的 Linux 工具是 vi、bash 和 Emacs!安徽撐沂窃趯(xiě) C、C++、Java、shell 腳本,還是 HTML,大部分的時(shí)間我都在這些工具中來(lái)回切換”,他說(shuō)。 Linux 秘密武器 Murray 認(rèn)為,對(duì)一個(gè) Linux 開(kāi)發(fā)人員來(lái)說(shuō),shell 是一個(gè)強(qiáng)大的軟件開(kāi)發(fā)工具,無(wú)論怎么評(píng)價(jià)都不過(guò)分!霸谖易龅拿恳豁(xiàng)工作中都要用到 shell 腳本,不論是快速地閱讀和修改普通文本還是編寫(xiě)代碼”,他說(shuō)!八p便而快捷,它短小的命令使得來(lái)回移動(dòng)代碼稱為一個(gè)迅速而沒(méi)有痛苦的過(guò)程。作為一名編輯,它很快就會(huì)成為第二本能”。 對(duì) Murray 來(lái)說(shuō),Emacs 作為一個(gè)開(kāi)發(fā)工具出現(xiàn)的晚了一些!霸 90 年代早期,我嘗試使用 Emacs 作為一個(gè) IDE,并很快就轉(zhuǎn)換門(mén)廳。Emacs 非常強(qiáng)大,在那些日子里,我會(huì)一直開(kāi)著一個(gè) Emacs 窗口,經(jīng)常打開(kāi)幾十個(gè)源文件,每個(gè)都有我編輯的上下文、使用 gdb 的調(diào)試會(huì)話以及在不同的源目錄下運(yùn)行的 bash 腳本。有很多關(guān)于 Emacs 的資料,可以說(shuō),這是個(gè)可怕的工具...再者,您可以在任何您想要花時(shí)間去做開(kāi)發(fā)的系統(tǒng)上運(yùn)行 Emacs。 自從 20 世紀(jì) 80 年代中期第一次使用 SunOS支持的 vi 這個(gè)簡(jiǎn)潔的環(huán)境以來(lái),Emacs 編輯器已經(jīng)成為了 Murray 的標(biāo)準(zhǔn)工具。"它在各種流派的 UNIX 上都可以使用,這是我在致力于跨平臺(tái)的開(kāi)發(fā)工作時(shí)選擇它的主要原因之一”,他說(shuō)。 Linux 開(kāi)發(fā)人員:了解您的 shell Murray 要求您要了解您的 shell。“Bash、tcsh、csh――shell 是您最基本的軟件開(kāi)發(fā)工具”,他強(qiáng)調(diào)說(shuō)。“它可以做許多了不起的事情。所有的工作都要依賴于它……和它的強(qiáng)大功能”。作為說(shuō)明通用的 shell 腳本功能強(qiáng)大的例子,在參考資料部分中有一個(gè)可以下載的文件,其中有一組腳本,用于獲得 Red Hat 發(fā)行的更新 RPM 軟件包并將它們合并到原來(lái)的軟件包和定制的軟件包。下載文件并解壓縮后,您可以在 /developerworks/rpm_update_scripts 目錄下找到腳本。最終結(jié)果是一個(gè)包括所有軟件包最新版本的目錄和一個(gè)用于網(wǎng)絡(luò)安裝的升級(jí)的 hdlist 文件。 下面的代碼片段實(shí)現(xiàn)的是對(duì) Red Hat RPM 軟件包的自動(dòng)更新,以創(chuàng)建一個(gè)使用最新的 RPM 的可以安裝的版本。這對(duì)任何一個(gè)維護(hù)公共 Linux 服務(wù)器的人來(lái)說(shuō)是一個(gè)基本的步驟。就我們而言,我們通常是維護(hù)許多公共 Linux 服務(wù)器上的大量網(wǎng)絡(luò)服務(wù)。下面是可以自動(dòng)完成更新最新的安全和功能的過(guò)程的部分腳本。 下面的腳本樣例證明了普通的 shell 編程技術(shù)可以廣泛應(yīng)用于各種系統(tǒng)配置和程序設(shè)計(jì)應(yīng)用。腳本使用的是 bourne shell,它是在不同的 UNIX 系統(tǒng)中最為常見(jiàn)的 shell。這樣就可以保證這些非常輕便的代碼可以稍加修改或者不加修改地在不同的 UNIX 系統(tǒng)上使用。修改 Red Hat 軟件包的規(guī)范以應(yīng)用于其它 Linux 發(fā)行版本是很容易的。 freshen.sh 使用指定的 RPM ftp 更新站點(diǎn)上的 RPM 軟件包來(lái)更新原有的 RPM 列表。執(zhí)行過(guò)濾器來(lái)替換更新 RPM 軟件包。最后,長(zhǎng)長(zhǎng)的發(fā)行列表根據(jù)從更新鏡像站點(diǎn)上得到的新 RPM 軟件包完成更新。 清單 1. fresh.sh #!/bin/sh rh_ver=$1 rh_path=$2 update_dir=${rh_path}/RH${rh_ver}-updates custom_dir=${rh_path}/RH${rh_ver}-custom install_dir=${rh_path}/RH${rh_ver}-install # Sanity check for the original directory. # Create update and install directories if they don’t exist [ -d ${update_dir} ] || mkdir ${update_dir} [ -d ${install_dir}/RedHat/RPMS ] || mkdir -p ${install_dir}/RedHat/RPMS # Get latest updates from fresh rpms FTP site ./get_update.sh ${rh_ver} ${update_dir} # Create/update hardlinks from update, and custom directories # to the install directory. We assume that original RPMS are already # hardlinked to the install directory, so all we need to do is filter # out any replaced by updated packages. ./do-links.sh ${update_dir} ${install_dir}/RedHat/RPMS [ -d ${custom_dir} ] && ./do-links.sh ${custom_dir} ${install_dir}/RedHat/RPMS # Filter out all but the latest version of everything. ./filter-rpms.pl $install_dir/RedHat/RPMS # Rebuild the hard disk lists /usr/lib/anaconda-runtime/genhdlist ${install_dir} freshen.sh 調(diào)用 do-links.sh 和 get_update.sh ,分別去設(shè)置 RPM 發(fā)行版本的源、宿(省略了源 RPM 軟件包;硬鏈接用來(lái)設(shè)置目的 RPM)和檢索更新。 清單 2. do-links.sh #!/bin/sh src=$1 dest=$2 #for file in $src/*; do for file in `find $src -name *.rpm -a ! -name *.src.rpm -print`; do base=`basename $file;` if test ! -f $dest/$base; then echo "Linking $file"; ln $file $dest else echo "EXISTS: $file"; fi done [page_break] 清單 3. get_update.sh #!/bin/sh rh_ver=$1 dest=$2 echo "Retrieving updates for version ${rh_ver} to $dest" lftp << EOF open ftp.freshrpms.net mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i386 $dest/i386 mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i486 $dest/i486 mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i586 $dest/i568 mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i686 $dest/i686 mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/SRPMS $dest/SRPMS mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/noarch $dest/noarch Java 和 Linux 在Codemonks,相當(dāng)多的開(kāi)發(fā)工作是在 Linux 上用 Java 完成。這兩個(gè)工具的組合為創(chuàng)建商業(yè)級(jí)質(zhì)量的 Web 應(yīng)用提供了一個(gè)平臺(tái),Murray 說(shuō)!霸谧鲞@些項(xiàng)目的過(guò)程中,我們發(fā)現(xiàn)我們要總體上了解客戶已有的應(yīng)用代碼”,他回憶說(shuō)。locks.c (在下載得到的壓縮文件中的 /developerworks/locks 目錄下) 是一個(gè)代碼片段,實(shí)現(xiàn)的是用于 Java Virtual Machine Profiler Interface (JVMPI) 的讀/寫(xiě)鎖以及大量的調(diào)試代碼。 Linux 開(kāi)發(fā)人員的代表 “在情況允許的時(shí)候,不要寫(xiě)特定于系統(tǒng)的代碼”,Murray 說(shuō),而是克服困難去“寫(xiě)好的跨平臺(tái)的代碼”。受雇的 Murray 堅(jiān)持認(rèn)為他最大的資本永遠(yuǎn)是“寫(xiě)具有商業(yè)品質(zhì)的代碼,構(gòu)建和提供網(wǎng)絡(luò)服務(wù),定制 OS 或內(nèi)核,而且完全基于可靠的開(kāi)放源代碼的平臺(tái)”。 下面是一個(gè)代碼片段,來(lái)自于一個(gè)跨平臺(tái)的定制的 IMAP 服務(wù)器,這個(gè)服務(wù)器由 Linux 和 MacOS X 的開(kāi)發(fā)人員共同開(kāi)發(fā)。代碼實(shí)現(xiàn)的是一個(gè)用來(lái)處理字符串的簡(jiǎn)單的增長(zhǎng)緩存。這樣避免了緩存溢出的問(wèn)題(不要忘記那些安全漏洞),而不必要您每次做某些事情的時(shí)候重新分配空間。它是通過(guò)維護(hù)一個(gè)簡(jiǎn)單的可變長(zhǎng)的緩存來(lái)實(shí)現(xiàn)的,這個(gè)緩存可以寫(xiě)滿和清空。這個(gè)緩存已經(jīng)被用于一個(gè)實(shí)驗(yàn)用的 IMAP 服務(wù)器,這個(gè)服務(wù)器是由一個(gè)團(tuán)隊(duì)緊張工作了一周完成的。 除了一個(gè)簡(jiǎn)單的字符串緩沖區(qū)的實(shí)現(xiàn)之外,這段代碼還實(shí)現(xiàn)了一個(gè)可變大小的字符串?dāng)?shù)組。它完成的是一個(gè)簡(jiǎn)單的接口,當(dāng)您寫(xiě)完一個(gè)字符串以后,您可以標(biāo)記它然后繼續(xù)寫(xiě)下一個(gè)。此外,這樣會(huì)節(jié)約空間分配,并且將比較亂的代碼組織到一起。 完整的 IMAP 服務(wù)器的代碼將在今年某個(gè)時(shí)間發(fā)布。 清單 4. 定制的 IMAP 服務(wù)器一部分 #ifndef HOED_BUF_H #define HOED_BUF_H typedef struct { char *str; int size; int length; int str_start; int max_size; int n_strings; int size_strings; int *str_posn; char **str_set; } hoed_buf_t; #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) #define PRINTF(f, a) __attribute__((format (printf, f, a))) #else #define PRINTF(f,a) #endif extern hoed_buf_t *hoed_buf_alloc(int init_size, int max_size); extern void hoed_buf_free(hoed_buf_t *); extern void hoed_buf_reset(hoed_buf_t *); extern void hoed_buf_new_string(hoed_buf_t *); extern char **hoed_buf_get_set(hoed_buf_t *, int *n_string); extern char *hoed_buf_put_char(hoed_buf_t *, char toadd); extern char *hoed_buf_sprintf(hoed_buf_t *, const char *format,...) PRINTF(2,3); extern char *hoed_buf_strcat(hoed_buf_t *, const char *append); extern char *hoed_buf_cat_sprintf(hoed_buf_t *, const char *format, ...) PRINTF(2,3); #endif /* HOED_BUF_H */ 稱為殺手級(jí)的 Linux 應(yīng)用程序 對(duì)Murray 來(lái)說(shuō),有兩個(gè)殺手級(jí)的 Linux 應(yīng)用程序:Emacs 和 Netscape Navigator!癊macs 或許是給人印象最深而且廣為應(yīng)用的基于 Linux 的應(yīng)用程序”,他說(shuō)!傲硪粋(gè)是 Netscape Navigator。有一次,我們要支持20多種 UNIX,我在 Linux 上完成了所有的工作”。 他繼續(xù)說(shuō),“有趣的是,基于 Linux 的應(yīng)用程序可能運(yùn)行于許多不同風(fēng)格的 UNIX 系統(tǒng)上,甚至安裝了 Cygwin 的 Windows 系統(tǒng)! Linux 的未來(lái)如何? 當(dāng)前,Murray 正在進(jìn)行的 Linux 項(xiàng)目有好幾個(gè),從支持電子郵件、消息和共享數(shù)據(jù)庫(kù)的分布式辦公應(yīng)用程序到使用標(biāo)準(zhǔn)工具的網(wǎng)絡(luò)應(yīng)用程序(標(biāo)準(zhǔn)工具包括:Apache/Tomcat, PHP, PostgreSQL, MySQL, 和 Linux)。 Murray 有他自己的公司專門(mén)為網(wǎng)絡(luò)服務(wù)和網(wǎng)絡(luò)應(yīng)用提供主機(jī)服務(wù)。 對(duì)Murray 來(lái)說(shuō),得益于 Linux 強(qiáng)大功能的應(yīng)用程序的列表在不斷地增長(zhǎng)!坝泻芏唷保f(shuō)!癘racle, WebSphere, Apache, PostgresQL, MySQL, Cyrus IMAP... 這個(gè)列表很長(zhǎng)而且在不斷增長(zhǎng)! 對(duì) Murray 來(lái)說(shuō),Linux 到此為止了!拔覀兯械姆⻊(wù)器都運(yùn)行 Linux;不管目標(biāo)平臺(tái)如何,我們主要的開(kāi)發(fā)都在 Linux 上進(jìn)行;我們把 Linux 推薦給用戶來(lái)運(yùn)行服務(wù)器應(yīng)用程序”,他說(shuō)! Linux 快速發(fā)展的步伐,開(kāi)放源代碼組織對(duì)它的廣泛支持,低廉的開(kāi)發(fā)費(fèi)用,如果把這些結(jié)合在一起,您就知道它是一個(gè)難以擊敗的平臺(tái)”。 網(wǎng)絡(luò)的神奇作用吸引著越來(lái)越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來(lái)越嚴(yán)峻的考驗(yàn)―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項(xiàng)技術(shù)都需要適時(shí)應(yīng)勢(shì),對(duì)應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。 |
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!