posts - 122,  comments - 25,  trackbacks - 0
          1、LINUX系統啟動級別

          查看/etc/inittab文件,其主要內容如下:
          0 - halt (Do NOT set initdefault to this
          1 - Single user mode 
          2 - Multiuser, without NFS (The same as 3if you do not have networking) 
          3 - Full multiuser mode 
          4 - unused 
          5 - X11 
          6 - reboot (Do NOT set initdefault to this

          id:
          5:initdefault:
          ... ...
           

          0:停機(不要設置為啟動默認級別)
          1:單用戶模式
          2:多用戶,無NFS(如果您沒有配置網絡,該級別與3一樣)
          3:完全多用戶模式
          4:不使用
          5:X11圖形模式
          6:重啟(不要設置為啟動默認級別)

          如果想讓系統不用圖形模式登陸可將id:5:initdefault: 中的5改為3即可。

          2、Linux運行級別

          Linux 啟動時,運行一個叫做init 的程序,然后由它來啟動后面的任務,包括多用戶環境,網絡等。

          那么,到底什么是運行級別呢?簡單的說,運行級就是操作系統當前正在運行的功能級別。這個級別從1 到6 ,具有不同的功能。這些級別在/etc/inittab 文件里指定。這個文件是init 程序尋找的主要文件,最先運行的服務是那些放在/etc/rc.d 目錄下的文件。

          大多數的Linux 發行版本中,啟動腳本放在/etc/rc.d/init.d,這些腳本被ln 命令來連接到 /etc/rc.d/rcn.d 目錄(這里的n 就是運行級0-6)。如:/etc/rc.d/rc5.d 下面的S10network 就是連接到/etc/rc.d/init.d下的network 腳本的。因此,我們可以知道,rc5.d 下面的文件就是和運行級5 有關的。

          3、Samba的自啟動

          samba安裝完后,默認是不會自啟動的。通過查看/etc/rc.d/rcn.d/目錄下的文件或通過chkconfig命令查詢,如:
          [alisoft@kplan-dev8 ~]$ ll /etc/rc.d/rc5.d
          總用量 
          272
           
          lrwxrwxrwx  
          1 root root 22  8月 13 11:17 K30spamassassin -> ../init.d/spamassassin
          lrwxrwxrwx  1 root root 13  8月 18 21:59 K35smb -> ../init.d/smb
          lrwxrwxrwx  1 root root 19  8月 13 11:17 K35vncserver -> ../init.d/vncserver
          lrwxrwxrwx  
          1 root root 17  8月 13 11:17 S10network -> ../init.d/network
           
          文件開頭的S 代表start 就是啟動服務,K代表kill。后面的數字10 就是啟動的順序。例如,有S80postfix 文件,80 就是順序在 10 以后,表示postfix啟動需先啟動網絡。/etc/rc.d/rc5.d/K35smb ,K 代表 kill。標準的Linux運行級別為3 或者5 ,Linux啟動時,init 就會執行 K35smb 腳本。

          [alisoft@kplan-dev8 ~]$ /sbin/chkconfig --list | grep smb
          smb             
          0:off  1:off  2:off  3:off  4:off  5:off  6:off
          0~6 表示運行級別。on 表示啟動;off 表示關閉。

          要設置Samba自啟動,需通過chkconfig命令進行設置:
          [alisoft@kplan-dev8 ~]/sbin/chkconfig --level 35 smb on
          [alisoft@kplan
          -dev8 ~]$ /sbin/chkconfig --list | grep smb
          smb             
          0:off  1:off  2:off  3:on  4:off  5:on  6:off

          Linux系統運行級別為3 或者5時,系統就會自啟動Samba服務。
          posted @ 2009-01-07 11:14 josson 閱讀(4398) | 評論 (2)編輯 收藏
          在K-system中,需通過域名來訪問,在各個測試環境及開發環境中訪問時,需在本地做hosts域名綁定。這在開發、測試過程中就會經常的修改hosts文件,來完成在開發、測試、預發及正式環境之間切換。修改hosts文件并不是件復雜的事,但頻繁的修改,也是挺累人的事。因此,寫個批處理,自動完成環境域名綁定的工作,也可以省不少心。

          域名綁定,包括k-system的域名及依賴環境的域名(如AEP、支付寶等)。不同的開發、測試環境只需變更k-system的變更,依賴環境的域名相同;預發環境只需綁定k-system的域名,不需依賴環境的域名綁定;生產環境則取消所有的域名綁定。基于此,一個hosts文件可分成幾個部份:與K-system無關的其他域名綁定;K-system依賴環境的域名綁定;預發環境K-system域名的綁定;開發、測試環境的K-system域名綁定。

          根據上述分析,預定義若干hosts文件,分別對應上述列的幾部份內容。為每個環境建一個批處理文件,根據環境需要將這些預定義的hosts文件進行組合,并動態替換系統的hosts(C:\WINDOWS\system32\drivers\etc)文件。同時,調用IE,打開K-system登錄頁面。這樣,通過一個批處理,可以很方便的在各個環境中切換,免去經常要去編輯hosts文件的煩擾。

          考慮到開發和測試會在多個本地測試環境切換,建立過多的批處理也不是個好辦法。這時,可以考慮將本地開發、測試環境的切換用同一個腳本實現,不同的環境由用戶提供運行參數來指定。如:"test_env.bat 10.2.225.87",則表示將K-system環境切換到87服務器。

          部份批處理內容如下,test_env.bat:
          @echo off

          rem 根據實際情況,修改windows的安裝目錄
          set WIN_DIR
          =C:\WINDOWS

          echo 生成測試hosts文件.
          if exist .env_temp del .env_temp
          if "%1"=="" (
              type inc\local.
          default >> .env_temp
              goto endl
          )

          echo #FI 開發、測試環境 
          >> .env_temp
          rem 指定其他的IP
          echo 
          %1    fi.alisoft.com  image.alisoft.com >> .env_temp

          :endl

          rem 合并hosts文件
          call inc\merger.bat env.host inc\.env_base inc\.env_local .env_temp

          rem 備份系統的hosts
          set SYS_HOST
          =%WIN_DIR%\system32\drivers\etc\hosts
          set SYS_HOST_BAK
          =%SYS_HOST%-bak0
          if not exist %SYS_HOST_BAK% (
              copy 
          %SYS_HOST% %SYS_HOST_BAK%
          )

          rem 復制hosts文件到系統目錄
          move env.host 
          %SYS_HOST%
          del .env_temp


          rem 打開瀏覽器.
          call cmd 
          /c start iexplore https://fi.alisoft.com
          echo done!

          文件合并批處理 merger.bat:
          @echo off
          set output
          =%1 
          if exist %output% del %output%
          :getfile 
              shift 
              
          if "%1"=="" goto end 
              type 
          %1 >> %output% 
              goto getfile 

          :end 
              set todir
          = 
          posted @ 2008-12-24 15:09 josson 閱讀(607) | 評論 (0)編輯 收藏
          我們的項目都是基于https協議訪問的,由于費用問題,在開發、測試環境中使了一個過期證書。所以每天得面對瀏覽器提示證書過期問題,若只是頁面訪問,多確認一下就完了,但遇到系統間的頁面跳轉、互相調用,就玩不轉了。沒折,干脆自已做證書。

          通過Openssl建立根證書和服務器證書,并用根證書對服務器證書進行簽名。

          1、使用Openssl的CA腳本來建立根證書(/usr/share/ssl/misc/CA)
          運行CA -newca,Openssl會找CA自己的私有密鑰密碼文件。如果沒有這個文件?按回車會自動創建,輸入密碼來保護這個密碼文件。之后會提示你輸入公司信息來做CA.crt文件。最后,在當前目錄下多了一個demoCA目錄,demoCA/private/cakey.pem就是CA的key文件了,而demoCA/cacert.pem就是CA的crt文件了。具體如下:
          [root@xplan-dev8 ca]# ./CA -newca
          CA certificate filename (or enter to create)

          Making CA certificate 

          Generating a 
          1024 bit RSA private key
          .++++++
          ++++++
          writing new private key to 
          './demoCA/private/./cakey.pem'
          Enter PEM pass phrase
          :
          Verifying 
          - Enter PEM pass phrase:
          -----
          You are about to be asked to enter information that will be incorporated
          into your certificate request
          .
          What you are about to enter is what is called a Distinguished Name or a DN
          .
          There are quite a few fields but you can leave some blank
          For some fields there will be a default value,
          If you enter '.', the field will be left blank.
          -----
          Country Name (
          2 letter code) [GB]:CN
          State or Province Name (full name) [Berkshire]
          :Zhejiang
          Locality Name (eg
          , city) [Newbury]:Hangzhou
          Organization Name (eg
          , company) [My Company Ltd]:Mysoft.com corpration
          Organizational Unit Name (eg
          , section) []:Mysoft.com
          Common Name (eg
          , your name or your server's hostname) []:Mysoft.com
          Email Address []:

          2、生成服務器證書
          生成服務器私鑰Key文件,openssl genrsa -des3 -out server.key 1024,并輸入保護密碼:
          [root@xplan-dev8 ca]# openssl genrsa -des3 -out server.key 1024
          Generating RSA private key, 1024 bit long modulus
          ..++++++
          ..++++++
          e is 
          65537 (0x10001)
          Enter pass phrase 
          for server.key:
          Verifying 
          - Enter pass phrase for server.key:

          生成服務器證書(注:輸入Common Name一項時,若需對泛域名支持證書時,需用*.mysoft.com):
          [root@xplan-dev8 ca]# openssl req -new -key server.key -out server.csr -days 365
          Enter pass phrase for server.key:
          You are about to be asked to enter information that will be incorporated
          into your certificate request
          .
          What you are about to enter is what is called a Distinguished Name or a DN
          .
          There are quite a few fields but you can leave some blank
          For some fields there will be a default value,
          If you enter '.', the field will be left blank.
          -----
          Country Name (
          2 letter code) [GB]:CN
          State or Province Name (full name) [Berkshire]
          :Zhejiang
          Locality Name (eg
          , city) [Newbury]:Hangzhou
          Organization Name (eg
          , company) [My Company Ltd]:Mysoft.com
          Organizational Unit Name (eg
          , section) []:Mysoft.com
          Common Name (eg
          , your name or your server's hostname) []:*.mysoft.com
          Email Address []:

          Please enter the following 
          'extra' attributes
          to be sent with your certificate request
          A challenge password []:
          An optional company name []:

          3、用根證書對服務器證書進行簽名
          把server.crt文件重命名成newreq.pem,然后用CA腳本進行簽名,期間會提示要求輸入cakey.pem的保護密碼。

          [root@xplan-dev8 ca]# mv server.csr newreq.pem

          [root@xplan-dev8 ca]# ./CA -sign
          Using configuration from /usr/share/ssl/openssl.cnf
          Enter pass phrase for ./demoCA/private/cakey.pem:
          Check that the request matches the signature
          Signature ok
          Certificate Details:
                  Serial Number: 1 (0x1)
                  Validity
                      Not Before: Dec  8 12:27:14 2008 GMT
                      Not After : Dec  8 12:27:14 2009 GMT
                  Subject:
                      countryName               = CN
                      stateOrProvinceName       = Zhejiang
                      localityName              = Hangzhou
                      organizationName          = Mysoft.com
                      organizationalUnitName    = Mysoft.com
                      commonName                = *.mysoft.com
                  X509v3 extensions:
                      X509v3 Basic Constraints:
                      CA:FALSE
                      Netscape Comment:
                      OpenSSL Generated Certificate
                      X509v3 Subject Key Identifier:
                      0F:0C:46:82:EB:68:61:CE:6F:06:10:78:BC:7B:2F:10:F8:96:7E:09
                      X509v3 Authority Key Identifier:
                      keyid:E0:01:2C:50:62:87:8D:10:7A:17:6D:AB:2C:43:0A:79:EB:5F:26:0C
                      DirName:/C=CN/ST=Zhejiang/L=Hangzhou/O=Mysoft.com corpration/OU=Mysoft.com/CN=Mysoft.com
                      serial:00

          Certificate is to be certified until Dec  8 12:27:14 2009 GMT (365 days)
          Sign the certificate? [y/n]:y


          1 out of 1 certificate requests certified, commit? [y/n]y
          Write out database with 1 new entries
          Data Base Updated
          Certificate:
              Data:
                  Version: 3 (0x2)
                  Serial Number: 1 (0x1)
                  Signature Algorithm: md5WithRSAEncryption
                  Issuer: C=CN, ST=Zhejiang, L=Hangzhou, O=Mysoft.com corpration, OU=Mysoft.com, CN=Mysoft.com
                  Validity
                      Not Before: Dec  8 12:27:14 2008 GMT
                      Not After : Dec  8 12:27:14 2009 GMT
                  Subject: C=CN, ST=Zhejiang, L=Hangzhou, O=Mysoft.com, OU=Mysoft.com, CN=*.mysoft.com
                  Subject Public Key Info:
                      Public Key Algorithm: rsaEncryption
                      RSA Public Key: (1024 bit)
                          Modulus (1024 bit):
                              00:f0:46:a7:a3:9d:8d:ce:09:da:f1:02:a0:fd:1f:
                              5c:df:a5:08:66:ea:13:0d:17:ac:49:92:9f:65:21:
                              cf:ec:f8:79:73:a1:73:0a:3e:d6:d0:c3:a4:d4:36:
                              22:b8:4c:82:51:fe:5d:e1:13:22:99:5f:4c:ef:c6:
                              65:3a:5d:de:1f:83:f2:17:a5:2b:f3:03:94:9a:31:
                              bc:09:c8:1c:9e:4d:ad:3b:90:2d:dc:65:0c:e3:04:
                              9b:8a:d5:c2:93:b7:51:8e:fe:92:1d:ee:55:6e:a0:
                              77:25:e1:a1:24:7f:55:7a:b4:4d:f4:84:83:13:56:
                              8d:62:be:2d:db:f8:1a:de:35
                          Exponent: 65537 (0x10001)
                  X509v3 extensions:
                      X509v3 Basic Constraints:
                      CA:FALSE
                      Netscape Comment:
                      OpenSSL Generated Certificate
                      X509v3 Subject Key Identifier:
                      0F:0C:46:82:EB:68:61:CE:6F:06:10:78:BC:7B:2F:10:F8:96:7E:09
                      X509v3 Authority Key Identifier:
                      keyid:E0:01:2C:50:62:87:8D:10:7A:17:6D:AB:2C:43:0A:79:EB:5F:26:0C
                      DirName:/C=CN/ST=Zhejiang/L=Hangzhou/O=Mysoft.com corpration/OU=Mysoft.com/CN=Mysoft.com
                      serial:00

              Signature Algorithm: md5WithRSAEncryption
                  0b:dc:15:f3:87:5c:e0:07:23:0e:78:47:af:56:fb:43:31:4b:
                  0d:12:76:57:95:cd:d7:2a:75:00:01:21:96:9d:d4:bf:9d:e9:
                  b6:26:cc:70:98:95:fd:ca:af:ad:68:fb:10:79:09:05:32:20:
                  02:7a:84:53:2f:e0:d5:cd:ed:4d:42:e7:d5:9d:90:78:9a:2e:
                  d8:72:cb:7f:f7:29:30:24:25:f2:0f:2d:b4:9d:a2:b3:24:00:
                  b4:f7:e9:de:5c:1a:50:d3:59:a4:9c:1d:03:15:04:17:6d:c2:
                  ab:95:a8:1f:28:e5:ad:3c:a9:a8:c8:30:3a:09:3f:75:5d:70:
                  2e:af
          -----BEGIN CERTIFICATE-----
          MIIDfDCCAuWgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBgDELMAkGA1UEBhMCQ04x
          ETAPBgNVBAgTCFpoZWppYW5nMREwDwYDVQQHEwhIYW5nemhvdTEfMB0GA1UEChMW
          QWxpc29mdC5jb20gY29ycHJhdGlvbjEUMBIGA1UECxMLQWxpc29mdC5jb20xFDAS
          BgNVBAMTC0FsaXNvZnQuY29tMB4XDTA4MTIwODEyMjcxNFoXDTA5MTIwODEyMjcx
          NFowdzELMAkGA1UEBhMCQ04xETAPBgNVBAgTCFpoZWppYW5nMREwDwYDVQQHEwhI
          YW5nemhvdTEUMBIGA1UEChMLQWxpc29mdC5jb20xFDASBgNVBAsTC0FsaXNvZnQu
          Y29tMRYwFAYDVQQDFA0qLmFsaXNvZnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN
          ADCBiQKBgQDwRqejnY3OCdrxAqD9H1zfpQhm6hMNF6xJkp9lIc/s+HlzoXMKPtbQ
          w6TUNiK4TIJR/l3hEyKZX0zvxmU6Xd4fg/IXpSvzA5SaMbwJyByeTa07kC3cZQzj
          BJuK1cKTt1GO/pId7lVuoHcl4aEkf1V6tE30hIMTVo1ivi3b+BreNQIDAQABo4IB
          DDCCAQgwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0
          ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFA8MRoLraGHObwYQeLx7LxD4ln4JMIGt
          BgNVHSMEgaUwgaKAFOABLFBih40QehdtqyxDCnnrXyYMoYGGpIGDMIGAMQswCQYD
          VQQGEwJDTjERMA8GA1UECBMIWmhlamlhbmcxETAPBgNVBAcTCEhhbmd6aG91MR8w
          HQYDVQQKExZBbGlzb2Z0LmNvbSBjb3JwcmF0aW9uMRQwEgYDVQQLEwtBbGlzb2Z0
          LmNvbTEUMBIGA1UEAxMLQWxpc29mdC5jb22CAQAwDQYJKoZIhvcNAQEEBQADgYEA
          C9wV84dc4AcjDnhHr1b7QzFLDRJ2V5XN1yp1AAEhlp3Uv53ptibMcJiV/cqvrWj7
          EHkJBTIgAnqEUy/g1c3tTULn1Z2QeJou2HLLf/cpMCQl8g8ttJ2isyQAtPfp3lwa
          UNNZpJwdAxUEF23Cq5WoHyjlrTypqMgwOgk/dV1wLq8=
          -----END CERTIFICATE-----
          Signed certificate is in newcert.pem

          這樣就生成了server的證書newcert.pem,把newcert.pem 重命名為server.crt。

          4、配置apache

          NameVirtualHost *:443
          <VirtualHost *:443>
              ServerAdmin sa@mysoft.com
              ServerName xplan.mysoft.com
              DocumentRoot /home/admin/project/htdocs

              SSLEngine on
              SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+SSLv3:+EXP:+eNULL
              SSLCertificateFile /home/admin/modules/crt/server.crt
              SSLCertificateKeyFile /home/admin/modules/crt/server.key

              SSLProxyEngine on
              RewriteEngine on
              RewriteRule ^/$ /xplan/user/login!login.jspa [L,P]
          </VirtualHost>

          重啟apache時,會提示要求輸入服務端證書的密碼。如下:

          [root@localhost]# bin/apachectl restart
          httpd not running, trying to start
          Apache/2.2.0 mod_ssl/2.2.0 (Pass Phrase Dialog)
          Some of your private key files are encrypted for security reasons.
          In order to read them you have to provide the pass phrases.

          Server xplan.mysoft.com:443 (RSA)
          Enter pass phrase:

          OK: Pass Phrase Dialog successful.



          5、客戶端(IE)導入根證書(ca.cert)
          在"選項"->"內容"->"證書"->"受信任根證書頒發機構"中點擊"導入",選中"ca.crt",完成導入。或者,直接在點ca.crt文件右鍵,選擇安裝即可。


          6、重啟apache,要求輸入密碼的問題解決

          1)、去掉bin/apachectl start啟動的pass phrase,用空pass phrase啟動apache
          (while preserving the original file):
          [root@xplan-dev8 ca]$ cp server.key server.key.org
          [root@xplan-dev8 ca]$ openssl rsa -in server.key.org -out server.key

          確認server.key 文件為root可讀
          [root@xplan-dev8 ca]$ chmod 400 server.key

          2、編輯
          [root@xplan-dev8 ca]$ vi conf/extra/httpd-ssl.conf
          注釋SSLPassPhraseDialog  builtin
          在后添加:SSLPassPhraseDialog exec:/usr/local/apache2/conf/apache_pass.sh

          [root@xplan-dev8 ca]$ vi conf/apache_pass.sh
          #!/bin/sh
          echo "密碼"
          [root@xplan-dev8 ca]$ chmod +x /usr/local/apache2/conf/apache_pass.sh

          posted @ 2008-12-08 21:19 josson 閱讀(2642) | 評論 (1)編輯 收藏

          1、Spket for eclipse
          spket支持JavaScript、XUL/XBL、Laszlo、SVG and Yahoo! Widget等新產品,具有代碼自動完成、語法高亮、內容概要等功能特點,可以幫助開發人員高效地創建JavaScript程序,它可以以一個獨立的桌面應用程序運行或者以Eclipse的插件運行,從它的官方網站http://www.spket.com/可以下載。

          插件安裝地址:http://www.spket.com/update
          相關資料:
          Spket Eclipse Plugin & IDE(Ext在Spket上的安裝方法)
          spket 1.6.6 破解

          2、Propedit for eclipse
          不錯的編寫properties文件的Eclipse插件(plugin),有了它我們在編輯一些簡體中文、繁體中文等Unicode文本時,就不必再使用native2ascii編碼了。
          插件安裝地址:http://propedit.sourceforge.jp/eclipse/updates/

          3、Velocity for eclipse

          http://veloeclipse.googlecode.com/svn/trunk/update/

          posted @ 2008-11-28 10:04 josson 閱讀(538) | 評論 (0)編輯 收藏
          現有需求如下:需對若干服務器做相同的環境配置,且配置工作相當復雜,若人工一臺一臺的處理比較耗時且容易出錯。我們可以考慮先完成一臺服務器的配置工作,確認配置無誤后,再通過腳本,將相應的配置工作同步到其他所有的服務器中。設有已完成配置的服務器:A (192.168.0.2) 和 待配置的服務器B ~ Z(192.168.0.101 ~ 126)。

          實現上述需求,關鍵有兩點:1). 通過ssh信任登錄,避免每次同步時要求輸入密碼;2). 通過rsync命令實現服務器之間文件的同步。具體實現細節如下:

          1. 完成單向Trusted SSH Authorized
          首先在A產生public/private dsa key pair:
          ……………………………………………………………………………………………………
          [root@kplan-test3 .ssh]# ssh-keygen -d
          Generating public/private dsa key pair.
          Enter file in which to save the key (
          /root/.ssh/id_dsa):
          Enter passphrase (empty 
          for no passphrase):
          Enter same passphrase again
          :
          Your identification has been saved in 
          /root/.ssh/id_dsa.
          Your public key has been saved in 
          /root/.ssh/id_dsa.pub.
          The key fingerprint is
          :
          f3
          :47:3b:b0:2a:50:f8:77:7e:ca:29:85:e8:d9:05:9b root@kplan-test3
          [root
          @kplan-test3 .ssh]#
          ……………………………………………………………………………………………………

          完成上述命令后,會在系統/root/.ssh目錄生成兩個文件:id_dsa與id_dsa.pub。現在復制id_dsa.pub到B服務器,并更名為 authorized_keys2
          ……………………………………………………………………………………………………
          [root
          @kplan-test3 .ssh]# scp id_dsa.pub 192.168.0.101:/root/.ssh/authorized_keys2
          root@192.168.0.101's password:
          id_dsa.pub 100% |*****************************************************| 612 00:00
          [root@kplan-test3 .ssh]#
          ……………………………………………………………………………………………………

          如果上述步驟順利完成的話,現在您可以執行”ssh 192.168.0.101”,無需輸入登錄密碼,即可登錄到B服務器了。

          2.使用rsync 做Remote sync﹕
          rsync特性簡介: rsync是unix-like系統下的數據鏡像備份工具,從命名上就可以看出來了remote sync。它的特性如下:
          1、可以鏡像保存整個目錄樹和文件系統。
          2、可以很容易做到保持原來文件的權限、時間等等。
          3、無須特殊權限即可安裝。
          4、優化的流程,文件傳輸效率高。
          5、可以使用rcp、ssh等方式來傳輸文件,當然也可以通過直接的socket連接。
          6、支持匿名傳輸。

          參數意義如下﹕
          -a, --archive
          It is a quick way of saying you want recursion and want to preserve almost everything.
          -v, --verbose
          This option increases the amount of information you are given during the transfer.
          -l, --links
          When symlinks are encountered, recreate the symlink on the destination.
          -R, --relative
          Use relative paths. 保留相對路徑...才不會讓子目錄跟 parent 擠在同一層...
          --delete
          是指如果Server端刪除了一文件,那客戶端也相應把這一文件刪除,保持真正的一致。
          -e ssh
          建立起加密的連接。
          3、同步腳本
          創建腳本,實現自動配置工作。
          ……………………………………………………………………………………………………
          [root
          @kplan-test3 backup]# vi install_env.sh
          #!/bin/bash

          WEBSERVER='kplan-test1 kplan-test2 kplan-test3'
          echo 
          "auto install envirment … ------------------------"
          for webserver in $WEBSERVER
          do
              echo 
          "install server:$webserver's envirment."
              echo 
          'transport file : /etc/profile & /etc/hosts'
              rsync 
          ---------e ssh --delete /etc/profile root@$webserver:/etc/profile
              rsync 
          ---------e ssh --delete /etc/hosts root@$webserver:/etc/hosts

              echo 
          'run shell command : /home/init_env.sh'
              ssh 
          --o StrictHostKeyChecking=no root@$webserver "/home/init_env.sh"
              ssh 
          --o StrictHostKeyChecking=no  root@$webserver "rm -f /home/init_env.sh"
              echo 
          " $webserver is end  ------------------------- "
          done
          sleep 1
          clear
          ……………………………………………………………………………………………………

          4、其他
          如果你想用來做自動備份,則在crontab中加入備份腳本即可。如在每天0時0分做備份(設/root目錄下已有完成備份的腳本 backup.sh):
          ……………………………………………………………………………………………………
          [root
          @kplan-test3 backup]# crontab -e
          0 0 * * * /root/backup.sh
          ……………………………………………………………………………………………………



          posted @ 2008-10-15 16:50 josson 閱讀(537) | 評論 (0)編輯 收藏
          檢查SVN設置如下:
          右鍵->TortoiseSVN->Settings->Look and Feel ->Icon Overlays->Driver Types : 選中"Network drives"后,應用即可。


          posted @ 2008-09-09 15:38 josson 閱讀(807) | 評論 (0)編輯 收藏
          一、相關資源:
          Jboss 下載: http://www.jboss.org/jbossas/downloads/
          Apache 下載(包含OpenSSL的版本): http://httpd.apache.org/download.cgi
          Apache與Tomcat的連接器: jakarta-tomcat-connectors-jk2.0.4-win32-apachex.x.xx.zip

          二、Apache 配置
          安裝過程很簡單,按默認安裝即可。Apache配置文件conf/httpd.conf 需要做的修改如下:
          #監聽443端口
          Listen 443
          ServerName crm.company.com

          #確認下列module啟用
          LoadModule proxy_module modules/mod_proxy.so
          LoadModule proxy_connect_module modules/mod_proxy_connect.so
          LoadModule proxy_http_module modules/mod_proxy_http.so
          LoadModule rewrite_module modules/mod_rewrite.so
          LoadModule ssl_module modules/mod_ssl.so

          #需將默認的SSL配置注釋(也可將下面虛擬機中關于SSL的配置更改到ssl.conf)
          #
          <IfModule mod_ssl.c>
          #    Include conf/ssl.conf
          #
          </IfModule>

          #定義虛擬主機
          NameVirtualHost *:443
          <VirtualHost *:443>
              ServerAdmin admin@company.com
              ServerName crm.company.com
              DocumentRoot E:/projects/crm/htdocs

              SSLEngine On
              SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+SSLv3:+EXP:+eNULL
              SSLCertificateFile D:/Services/crt/crm.crt
              SSLCertificateKeyFile D:/Services/crt/crm.key

              SSLProxyEngine on
              RewriteEngine on
              RewriteRule ^/$ /crm/login!login.jspa [L,P]
          </VirtualHost>

          三、Jboss 配置
          解壓后即完成安裝,應用配置需要修改的配置文件為:server\default\conf\jboss-service.xml
                #在此配置屬性中加入應用所在路徑.或者將應用直接布署到deploy目錄下面.
                <attribute name="URLs">
                   deploy/, file:/d:/project/crm/deploy/target/
                
          </attribute>

          四、Apache 與 Jboss集成
          1、將mod_jk2.so文件拷貝到Apache安裝目錄下的modules文件夾中,并修改Apache的配置文件(httpd.conf),加入如下內容:
          #與Jboss集成所需的配置
          <IfModule mod_jk2.c>
              JkSet config.file ./workers2.properties
          </IfModule>
          LoadModule jk2_module modules/mod_jk2.so

          2、在Apache配置目錄conf下新建文件work.properties,并加入如內容:
          [channel.socket:localhost:8009]
          port=8009
          host=127.0.0.1

          [ajp13:localhost:8009]
          channel=channel.socket:localhost:8009

          [uri:/*]
          [uri:/*.jsp]
          [uri:/*.jspa]
          worker=ajp13:localhost:8009

          3、JBOSS的server\default\conf目錄下,新建一個jk2.properties的文件,內容如下:
          # Set the desired handler list
          handler.list=apr,request,channelSocket

          #
          # Override the default port for the socketChannel
          channelSocket.port=8009

          五、測試
          完成上述配置后,分別啟動Jboss和Apache,使用https訪問應用,如https://crm.company.com,apache收到請求后,按虛擬機中設置的kURL重寫規則,轉向/crm/login!login.jspa。連接器檢測到jspa文件,則將該請求轉給Jboss處理。如jspa頁面的內容被顯示出來,則表示配置成功。

          六、小結
          配置過程中,httpd.con配置比較容易出現問題,一般使用apache提供的配置文件檢測功能,確定httpd.conf正確。其次,可查看apache的log日志文件,按日志文件的錯誤描述進行處理。

          配置過程中,可按步進行:Apache & ssl配置;Jboss 應用配置;集成配置;如此可減少一些問題。

          posted @ 2008-09-05 14:18 josson 閱讀(1447) | 評論 (0)編輯 收藏

          對于任何數據庫來說,提供唯一標識數據表中一行記錄的能力是至關重要的。幾乎所有數據庫都提供了為新添加的行自動生成主鍵的方法。這樣再操作數據庫的時候比較方便,但它也帶來了一個問題,如果我們需要知道新生成的主鍵值該怎么辦?

          有的數據庫供應商是預先生成(pre-generate)主鍵的(如OraclePostgreSQL),有的則是事后生成(post-generate)的(如SQL ServerMySQL)。不管是哪種方式,我們都可以使用<selectKey>節點來獲取<insert>語句所產生的主鍵。下面的例子演示了這兩種方式下的做法:

          <!-- Oracle SEQUENCE Example using .NET 1.1 System.Data.OracleClient -->
          <insert id="insertProduct-ORACLE" parameterClass="product">
              
          <selectKey resultClass="int" type="pre" property="Id" >
                  SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
              
          </selectKey>
              insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
          </insert>

          <!-- Microsoft SQL Server IDENTITY Column Example -->
          <insert id="insertProduct-MSSQL" parameterClass="product">
              insert into PRODUCT (PRD_DESCRIPTION)
              values (#description#)
              
          <selectKey resultClass="int" type="post" property="id" >
                  select @@IDENTITY as value
              
          </selectKey>
          </insert>

          <!-- MySQL Example -->
          <insert id="insertProduct-MYSQL" parameterClass="product">
              insert into PRODUCT (PRD_DESCRIPTION)
              values (#description#)
              
          <selectKey resultClass="int" type="post" property="id" >
                  select LAST_INSERT_ID() as value
              
          </selectKey>
          </insert>

          posted @ 2008-08-01 14:44 josson 閱讀(475) | 評論 (0)編輯 收藏
            Spring 提供兩種事務處理方式,一種是編程式事務處理;一種是聲明式事務處理。如果需要大量的事務處理,就用聲明式事務處理,如果很少的事務處理,就用編程式。

          編程式事務:
          使用TransactionTemplate進行事務處理(Spring進行commit和rollback),原型定義如下:

          public class TransactionTemplate extends DefaultTransactionDefinition implements InitializingBean {
              

              
          public Object execute(TransactionCallback action) throws TransactionException {
                  
          if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
                      
          return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
                  }
                  
          else {
                      TransactionStatus status 
          = this.transactionManager.getTransaction(this);
                      Object result 
          = null;
                      
          try {
                         
          // 參數TransactionCallback 是一個接口,接口中定義了doInTransaction方法
                          // 只要實現TransactionCallback接口,在doInTransaction()方法里編寫具體要進行事務處理的代碼即可。
                          result = action.doInTransaction(status);
                      }
                      
          catch (RuntimeException ex) {
                          
          // 回滾事務
                          rollbackOnException(status, ex);
                          
          throw ex;
                      }
                      
          catch (Error err) {
                          
          // 回滾事務
                          rollbackOnException(status, err);
                          
          throw err;
                      }
                      
          this.transactionManager.commit(status);
                      
          return result;
                  }
              }

              
          }

          實現TransactionCallback接口。
          transactionTemplate.execute(
              
          new TransactionCallback() {
                  
          public Object doInTransaction(TransactionStatus ts) {
                       //代碼實現.
          }
               }

          }

          配置文件定義:
                  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                      
          <property name="dataSource">  
                          
          <ref bean="myDataSource" />  
                      
          </property> 
                  
          </bean>
                  
                  
          <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
                      
          <property name="transactionManager">  
                          
          <ref bean="transactionManager" />  
                      
          </property>
                  
          </bean>

          posted @ 2008-07-28 14:37 josson 閱讀(1091) | 評論 (0)編輯 收藏

            Shell基本語法

            像高級程序設計語言一樣,Shell也提供說明和使用變量的功能。對Shell來講,所有變量的取值都是一個字串,Shell程序采用$var的形式來引用名為var的變量的值。

            Shell有以下幾種基本類型的變量。

            (1)Shell定義的環境變量:

            Shell在開始執行時就已經定義了一些和系統的工作環境有關的變量,用戶還可以重新定義這些變量,常用的Shell環境變量有:

            HOME 用于保存注冊目錄的完全路徑名。

            PATH 用于保存用冒號分隔的目錄路徑名,Shell將按PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執行文件將被執行。

            TERM 終端的類型。

            UID 當前用戶的識別字,取值是由數位構成的字串。

            PWD 當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。

            PS1 主提示符,在特權用戶下,默認的主提示符是#,在普通用戶下,默認的主提示符是$。

            PS2 在Shell接收用戶輸入命令的過程中,如果用戶在輸入行的末尾輸入“”然后回車,或者當用戶按回車鍵時Shell判斷出用戶輸入的命令沒有結束時,就顯示這個輔助提示符,提示用戶繼續輸入命令的其余部分,默認的輔助提示符是>。

            (2)用戶定義的變量:

            用戶可以按照下面的語法規則定義自己的變量:

            變量名=變量值

            要注意的一點是,在定義變量時,變量名前不應加符號$,在引用變量的內容時則應在變量名前加$;在給變量賦值時,等號兩邊一定不能留空格,若變量中本身就包含了空格,則整個字串都要用雙引號括起來。

            在編寫Shell程序時,為了使變量名和命令名相區別,建議所有的變量名都用大寫字母來表示。

            有時我們想要在說明一個變量并對它設置為一個特定值后就不在改變它的值時,可以用下面的命令來保證一個變量的只讀性:

            readonly 變量名

            在任何時候,創建的變量都只是當前Shell的局部變量,所以不能被Shell運行的其他命令或Shell程序所利用,而export命令可以將一個局部變量提供給Shell執行的其他命令使用,其格式為:

            export 變量名

            也可以在給變量賦值的同時使用export命令:

            export 變量名=變量值

            使用export說明的變量,在Shell以后運行的所有命令或程序中都可以訪問到。

            (3)位置參數:

          位置參數是一種在調用Shell程序的命令行中按照各自的位置決定的變量,是在程序名之后輸入的參數。位置參數之間用空格分隔,Shell取第一個位置 參數替換程序文件中的$1,第二個替換$2,依次類推。$0是一個特殊的變量,它的內容是當前這個Shell程序的文件名,所以,$0不是一個位置參數, 在顯示當前所有的位置參數時是不包括$0的。

            (4)預定義變量:

            預定義變量和環境變量相類似,也是在Shell一開始時就定義了的變量。所不同的是,用戶只能根據Shell的定義來使用這些變量,而不能重定義它。所有預定義變量都是由$符和另一個符號組成的,常用的Shell預定義變量有:

            $# 位置參數的數量。

            $* 所有位置參數的內容。

            $? 命令執行后返回的狀態。

            $$ 當前進程的進程號。

            $! 后臺運行的最后一個進程號。

            $0 當前執行的進程名。

            其中,$?用于檢查上一個命令執行是否正確。(在Linux中,命令退出狀態為0表示該命令正確執行,任何非0值表示命令出錯。)

            $$變量最常見的用途是用做暫存文件的名字以保證暫存文件不會重復。

            (5)參數置換的變量:

            Shell提供了參數置換功能以便用戶可以根據不同的條件來給變量賦不同的值。參數置換的變量有4種,這些變量通常與某一個位置參數相聯系,根據指定的位置參數是否已經設置類決定變量的取值,它們的語法和功能分別如下。

            a. 變量=${參數-word}:如果設置了參數,則用參數的值置換變量的值,否則用word置換。即這種變量的值等于某一個參數的值,如果該參數沒有設置,則變量就等于word的值。

            b. 變量=${參數=word}:如果設置了參數,則用參數的值置換變量的值,否則把變量設置成word,然后再用word替換參數的值。注意,位置參數不能用于這種方式,因為在Shell程序中不能為位置參數賦值。

          c. 變量=${參數?word}:如果設置了參數,則用參數的值置換變量的值,否則就顯示word并從Shell中退出,如果省略了word,則顯示標準信 息。這種變量要求一定等于某一個參數的值。如果該參數沒有設置,就顯示一個信息,然后退出,因此這種方式常用于出錯指示。

            d. 變量=${參數+word}:如果設置了參數,則用word置換變量,否則不進行置換。

            所有這4種形式中的“參數”既可以是位置參數,也可以是另一個變量,只是用位置參數的情況比較多。Shell程序設計的流程控制

            和其他高級程序設計語言一樣,Shell提供了用來控制程序執行流程的命令,包括條件分支和循環結構,用戶可以用這些命令創建非常復雜的程序。

            與傳統語言不同的是,Shell用于指定條件值的不是布爾運算式,而是命令和字串。

            1.測試命令

            test命令用于檢查某個條件是否成立,它可以進行數值、字符和文件3個方面的測試,其測試符和相應的功能分別如下。

            (1)數值測試:

            -eq 等于則為真。

            -ne 不等于則為真。

            -gt 大于則為真。

            -ge 大于等于則為真。

            -lt 小于則為真。

            -le 小于等于則為真。

            (2)字串測試:

            = 等于則為真。

            != 不相等則為真。

            -z字串 字串長度偽則為真。

            -n字串 字串長度不偽則為真。

            (3)文件測試:

            -e文件名 如果文件存在則為真。

            -r文件名 如果文件存在且可讀則為真。

            -w文件名 如果文件存在且可寫則為真。

            -x文件名 如果文件存在且可執行則為真。

            -s文件名 如果文件存在且至少有一個字符則為真。

            -d文件名 如果文件存在且為目錄則為真。

            -f文件名 如果文件存在且為普通文件則為真。

            -c文件名 如果文件存在且為字符型特殊文件則為真。

            -b文件名 如果文件存在且為塊特殊文件則為真。

            另外,Linux還提供了與(!)、或(-o)、非(-a)三個邏輯操作符,用于將測試條件連接起來,其優先順序為:!最高,-a次之,-o最低。

            同時,bash也能完成簡單的算術運算,格式如下:

            $[expression]

            例如:

            var1=2

            var2=$[var1*10+1]

            則var2的值為21。

            2.if條件語句

            Shell程序中的條件分支是通過if條件語句來實現的,其一般格式為:

            if 條件命令串

            then

            條件為真時的命令串

            else

            條件為假時的命令串

            fi

            3.for循環

            for循環對一個變量的可能的值都執行一個命令序列。賦給變量的幾個數值既可以在程序內以數值列表的形式提供,也可以在程序以外以位置參數的形式提供。for循環的一般格式為:

            for變量名    [in數值列表]

            do

            若干個命令行

            done

            變量名可以是用戶選擇的任何字串,如果變量名是var,則在in之后給出的數值將順序替換循環命令列表中的$var。如果省略了in,則變量var的取值將是位置參數。對變量的每一個可能的賦值都將執行do和done之間的命令列表。

            4.while和until循環

            while和until命令都是用命令的返回狀態值來控制循環的。While循環的一般格式為:

            while

            若干個命令行1

            do

            若干個命令行2

            done

            只要while的“若干個命令行1”中最后一個命令的返回狀態為真,while循環就繼續執行do...done之間的“若干個命令行2”。

            until命令是另一種循環結構,它和while命令相似,其格式如下:

            until

             若干個命令行1

            do

             若干個命令行2

            done

            until循環和while循環的區別在于:while循環在條件為真時繼續執行循環,而until則是在條件為假時繼續執行循環。

            Shell還提供了true和false兩條命令用于創建無限循環結構,它們的返回狀態分別是總為0或總為非0。

            5.case條件選擇

            if條件語句用于在兩個選項中選定一項,而case條件選擇為用戶提供了根據字串或變量的值從多個選項中選擇一項的方法,其格式如下:

            case string in

            exp-1)

            若干個命令行1

            ;;

            exp-2)

             若干個命令行2

            ;;

            ……

            *)

            其他命令行

            esac

            Shell通過計算字串string的值,將其結果依次和運算式exp-1, exp-2等進行比較,直到找到一個匹配的運算式為止。如果找到了匹配項,則執行它下面的命令直到遇到一對分號(;;)為止。

            在case運算式中也可以使用Shell的通配符(“*”、“?”、“[ ]”)。通常用 * 作為case命令的最后運算式以便在前面找不到任何相應的匹配項時執行“其他命令行”的命令。

            6.無條件控制語句break和continue

            break用于立即終止當前循環的執行,而contiune用于不執行循環中后面的語句而立即開始下一個循環的執行。這兩個語句只有放在do和done之間才有效。

            7.函數定義

            在Shell中還可以定義函數。函數實際上也是由若干條Shell命令組成的,因此它與Shell程序形式上是相似的,不同的是它不是一個單獨的進程,而是Shell程序的一部分。函數定義的基本格式為:

            functionname

            {

             若干命令行

            }

            調用函數的格式為:

            functionname param1 param2…

            Shell函數可以完成某些例行的工作,而且還可以有自己的退出狀態,因此函數也可以作為if, while等控制結構的條件。

            在函數定義時不用帶參數說明,但在調用函數時可以帶有參數,此時Shell將把這些參數分別賦予相應的位置參數$1, $2, ...及$*。

            8.命令分組

          在Shell中有兩種命令分組的方法:()和{}。前者當Shell執行()中的命令時將再創建一個新的子進程,然后這個子進程去執行圓括弧中的命令。 當用戶在執行某個命令時不想讓命令運行時對狀態集合(如位置參數、環境變量、當前工作目錄等)的改變影響到下面語句的執行時,就應該把這些命令放在圓括弧 中,這樣就能保證所有的改變只對子進程產生影響,而父進程不受任何干擾。{}用于將順序執行的命令的輸出結果用于另一個命令的輸入(管道方式)。當我們要 真正使用圓括弧和花括弧時(如計算運算式的優先順序),則需要在其前面加上轉義符()以便讓Shell知道它們不是用于命令執行的控制所用。

            9.信號

            trap命令用于在Shell程序中捕捉信號,之后可以有3種反應方式:

            (1)執行一段程序來處理這一信號。

            (2)接受信號的默認操作。

            (3)忽視這一信號。

            trap對上面3種方式提供了3種基本形式:

            第一種形式的trap命令在Shell接收到與signal list清單中數值相同的信號時,將執行雙引號中的命令串。

            trap 'commands' signal-list

            trap "commands" signal-list

            為了恢復信號的默認操作,使用第二種形式的trap命令:

            trap signal-list

            第三種形式的trap命令允許忽略信號:

            trap " " signal-list

            注意:

            (1)對信號11(段違例)不能捕捉,因為Shell本身需要捕捉該信號去進行內存的轉儲。

            (2)在trap中可以定義對信號0的處理(實際上沒有這個信號),Shell程序在其終止(如執行exit語句)時發出該信號。

            (3)在捕捉到signal-list中指定的信號并執行完相應的命令之后,如果這些命令沒有將Shell程序終止的話,Shell程序將繼續執行收到信號時所執行的命令后面的命令,這樣將很容易導致Shell程序無法終止。

          另外,在trap語句中,單引號和雙引號是不同的。當Shell程序第一次碰到trap語句時,將把commands中的命令掃描一遍。此時若 commands是用單引號括起來的話,那么Shell不會對commands中的變量和命令進行替換,否則commands中的變量和命令將用當時具體 的值來替換。運行Shell程序的方法

            用戶可以用任何編輯程序來編寫Shell程序。因為 Shell程序是解釋執行的,所以不需要編譯成目的程序。按照Shell編程的慣例,以bash為例,程序的第一行一般為“#!/bin/bash”,其 中 # 表示該行是注釋,嘆號 ! 告訴Shell運行嘆號之后的命令并用文檔的其余部分作為輸入,也就是運行/bin/bash并讓/bin/bash去執行Shell程序的內容。

            執行Shell程序的方法有3種。

            1.sh Shell程序文件名

            這種方法的命令格式為:

            bash Shell程序文件名

            這實際上是調用一個新的bash命令解釋程序,而把Shell程序文件名作為參數傳遞給它。新啟動的Shell將去讀指定的文件,可執行文件中列出的命令,當所有的命令都執行完后結束。該方法的優點是可以利用Shell調試功能。

            2.sh

            格式為:

            bash< Shell程序名

            這種方式就是利用輸入重定向,使Shell命令解釋程序的輸入取自指定的程序文件。

            3.用chmod命令使Shell程序成為可執行的

            一個文件能否運行取決于該文檔的內容本身可執行且該文件具有執行權。對于Shell程序,當用編輯器生成一個文件時,系統賦予的許可權都是644(rw-r-r--),因此,當用戶需要運行這個文件時,只需要直接鍵入文件名即可。

          在這3種運行Shell程序的方法中,最好按下面的方式選擇:當剛創建一個Shell程序,對它的正確性還沒有把握時,應當使用第一種方式進行調試。當 一個Shell程序已經調試好時,應使用第三種方式把它固定下來,以后只要鍵入相應的文件名即可,并可被另一個程序所調用。

            4.bash程序的調試

            在編程過程中難免會出錯,有的時候,調試程序比編寫程序花費的時間還要多,Shell程序同樣如此。

            Shell程序的調試主要是利用bash命令解釋程序的選擇項。調用bash的形式是:

            bash -選擇項Shell程序文件名

            幾個常用的選擇項是:

            -e 如果一個命令失敗就立即退出。

            -n 讀入命令但是不執行它們。

            -u 置換時把未設置的變量看做出錯。

            -v 當讀入Shell輸入行時把它們顯示出來。

            -x 執行命令時把命令和它們的參數顯示出來。

            上面的所有選項也可以在Shell程序內部用“set -選擇項”的形式引用,而“set +選擇項”則將禁止該選擇項起作用。如果只想對程序的某一部分使用某些選擇項時,則可以將該部分用上面兩個語句包圍起來。

            (1)未置變量退出和立即退出

          未置變量退出特性允許用戶對所有變量進行檢查,如果引用了一個未賦值的變量就終止Shell程序的執行。Shell通常允許未置變量的使用,在這種情況 下,變量的值為空。如果設置了未置變量退出選擇項,則一旦使用了未置變量就顯示錯誤信息,并終止程序的運行。未置變量退出選擇項為-u。

          當Shell運行時,若遇到不存在或不可執行的命令、重定向失敗或命令非正常結束等情況時,如果未經重新定向,該出錯信息會顯示在終端屏幕上,而 Shell程序仍將繼續執行。要想在錯誤發生時迫使Shell程序立即結束,可以使用-e選項將Shell程序的執行立即終止。

            (2)Shell程序的跟蹤

          調試Shell程序的主要方法是利用Shell命令解釋程序的-v或-x選項來跟蹤程序的執行。-v選擇項使Shell在執行程序的過程中,把它讀入的 每一個命令行都顯示出來,而-x選擇項使Shell在執行程序的過程中把它執行的每一個命令在行首用一個+加上命令名顯示出來。并把每一個變量和該變量所 取的值也顯示出來。因此,它們的主要區別在于:在執行命令行之前無-v,則顯示出命令行的原始內容,而有-v時則顯示出經過替換后的命令行的內容。

          除了使用Shell的-v和-x選擇項以外,還可以在Shell程序內部采取一些輔助調試的措施。例如,可以在Shell程序的一些關鍵地方使用 echo命令把必要的信息顯示出來,它的作用相當于C語言中的printf語句,這樣就可以知道程序運行到什么地方及程序目前的狀態。bash的內部命令

          bash命令解釋套裝程序包含了一些內部命令。內部命令在目錄列表時是看不見的,它們由Shell本身提供。常用的內部命令有:echo, eval, exec, export, readonly, read, shift, wait和點(.)。下面簡單介紹其命令格式和功能。

            1.echo

            命令格式:echo arg

            功能:在屏幕上顯示出由arg指定的字串。

            2.eval

            命令格式:eval args

            功能:當Shell程序執行到eval語句時,Shell讀入參數args,并將它們組合成一個新的命令,然后執行。

            3.exec

            命令格式:exec命令參數

            功能:當Shell執行到exec語句時,不會去創建新的子進程,而是轉去執行指定的命令,當指定的命令執行完時,該進程(也就是最初的Shell)就終止了,所以Shell程序中exec后面的語句將不再被執行。

            4.export

            命令格式:export變量名 或:export變量名=變量值

            功能:Shell可以用export把它的變量向下帶入子Shell,從而讓子進程繼承父進程中的環境變量。但子Shell不能用export把它的變量向上帶入父Shell。

            注意:不帶任何變量名的export語句將顯示出當前所有的export變量。

            5.readonly

            命令格式:readonly變量名

            功能:將一個用戶定義的Shell變量標識為不可變。不帶任何參數的readonly命令將顯示出所有只讀的Shell變量。

            6.read

            命令格式:read變量名表

            功能:從標準輸入設備讀入一行,分解成若干字,賦值給Shell程序內部定義的變量。

            7.shift語句

            功能:shift語句按如下方式重新命名所有的位置參數變量,即$2成為$1,$3成為$2…在程序中每使用一次shift語句,都使所有的位置參數依次向左移動一個位置,并使位置參數$#減1,直到減到0為止。

            8.wait

            功能:使Shell等待在后臺啟動的所有子進程結束。wait的返回值總是真。

            9.exit

            功能:退出Shell程序。在exit之后可有選擇地指定一個數位作為返回狀態。

            10.“.”(點)

            命令格式:. Shell程序文件名

            功能:使Shell讀入指定的Shell程序文件并依次執行文件中的所有語句。

          posted @ 2008-07-21 13:14 josson 閱讀(293) | 評論 (0)編輯 收藏
          僅列出標題
          共11頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 崇左市| 邮箱| 平顶山市| 隆林| 南靖县| 河源市| 彩票| 平阳县| 益阳市| 阜阳市| 汝南县| 青浦区| 都匀市| 长岛县| 大厂| 广南县| 蒙城县| 普洱| 连江县| 屯昌县| 根河市| 东乡县| 永登县| 襄垣县| 武义县| 望奎县| 潞西市| 博湖县| 佳木斯市| 梓潼县| 都匀市| 尼木县| 沾益县| 双牌县| 静安区| 肇东市| 邮箱| 昌都县| 惠安县| 苗栗县| 宜昌市|