成長空間

          MiLife

          常用鏈接

          統計

          積分與排名

          Automation Testing Development

          最新評論

          2007年10月17日 #

          gdb

          基礎:
          http://blog.csai.cn/user3/50125/archives/2009/35140.html

          多進程:
          http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

          多線程:
          http://www.91linux.com/html/article/program/20070406/1441.html

          break [linespec] thread [threadno]
           http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=program&Number=692404&page=0&view=collapsed&sb=5&o=all

          posted @ 2009-05-25 13:45 Picasso 閱讀(348) | 評論 (0)編輯 收藏

          sonmame - used to provide version backwards-compatibility information.

              In Unix operating systems, a soname is a field of data in a shared object file. The soname is a string (typically the filename of the library) which is used as a "logical name" describing the functionality of the object. This is often used to provide version backwards-compatibility information. For instance, if versions 1.0 through 1.9 of the shared library libx provide identical interface, they would all have the same soname, e.g. libx.so.1. If the system only includes version 1.3 of that shared object, libx.so.1.3, the soname field of the shared object tells the system that it can be used to fill the dependency for a binary which was originally compiled using version 1.2.

          posted @ 2009-05-05 15:13 Picasso 閱讀(369) | 評論 (0)編輯 收藏

          轉載:Linux內存管理(上)

               摘要: http://blog.csdn.net/kanghua/archive/2007/10/22/1837876.aspx http://blog.csdn.net/kanghua/archive/2007/10/22/1837872.aspx 摘要:本章首先以應用程序開發者的角度審視Linux的進程內存管理,在此基礎上逐步深入到內核中討論系統物理內存管理和內核內存地使用方法。力求從外自內、...  閱讀全文

          posted @ 2009-03-17 17:21 Picasso 閱讀(1032) | 評論 (0)編輯 收藏

          Linux 關于動態鏈接庫以及靜態鏈接庫的一些概念

          From http://os.rdxx.com/Linux/LinuxRudiment/2008/5/17017197011.shtml

          庫有動態與靜態兩種,動態通常用.so為后綴,靜態用.a為后綴。例如:libhello.so libhello.a
          為了在同一系統中使用不同版本的庫,可以在庫文件名后加上版本號為后綴,例如: libhello.so.1.0,由于程序連接默認以.so為文件后綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
          ln -s libhello.so.1.0 libhello.so.1
          ln -s libhello.so.1 libhello.so
          使用庫
          當 要使用靜態的程序庫時,連接器會找出程序所需的函數,然后將它們拷貝到執行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然 而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記‘指明當程序執行時,首先必須載入這個庫。由于動態庫節省空間,linux下進行連接的 缺省操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
          現在假設有一個叫hello的程序開發包,它提供一個靜態庫libhello.a 一個動態庫libhello.so,一個頭文件hello.h,頭文件中提供sayhello()這個函數
          /* hello.h */
          void sayhello();
          另外還有一些說明文檔。這一個典型的程序開發包結構
          1.與動態庫連接
          linux默認的就是與動態庫連接,下面這段程序testlib.c使用hello庫中的sayhello()函數
          /*testlib.c*/
          #include  
          #include  
          int main()
          {
          sayhello();
          return 0;
          }
          使用如下命令進行編譯
          $gcc -c testlib.c -o testlib.o
          用如下命令連接:
          $gcc testlib.o -lhello -o testlib
          在連接時要注意,假設libhello.o 和libhello.a都在缺省的庫搜索路徑下/usr/lib下,如果在其它位置要加上-L參數
          與與靜態庫連接麻煩一些,主要是參數問題。還是上面的例子:
          $gcc testlib.o -o testlib -WI,-Bstatic -lhello
          注:這個特別的"-WI,-Bstatic"參數,實際上是傳給了連接器ld.
          指示它與靜態庫連接,如果系統中只有靜態庫當然就不需要這個參數了。
          如果要和多個庫相連接,而每個庫的連接方式不一樣,比如上面的程序既要和libhello進行靜態連接,又要和libbye進行動態連接,其命令應為:
          $gcc testlib.o -o testlib -WI,-Bstatic -lhello -WI,-Bdynamic -lbye
          3.動態庫的路徑問題
          為了讓執行程序順利找到動態庫,有三種方法:
          (1)把庫拷貝到/usr/lib和/lib目錄下。
          (2)在LD_LIBRARY_PATH環境變量中加上庫所在路徑。例如動態庫libhello.so在/home/ting/lib目錄下,以bash為例,使用命令:
          $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib
          (3) 修改/etc/ld.so.conf文件,把庫所在的路徑加到文件末尾,并執行ldconfig刷新。這樣,加入的目錄下的所有庫文件都可見、
          4.查看庫中的符號
          有 時候可能需要查看一個庫中到底有哪些函數,nm命令可以打印出庫中的涉及到的所有符號。庫既可以是靜態的也可以是動態的。nm列出的符號有很多,常見的有 三種,一種是在庫中被調用,但并沒有在庫中定義(表明需要其他庫支持),用U表示;一種是庫中定義的函數,用T表示,這是最常見的;另外一種是所謂的“弱 態”符號,它們雖然在庫中被定義,但是可能被其他庫中的同名符號覆蓋,用W表示。例如,假設開發者希望知道上央提到的hello庫中是否定義了 printf():
          $nm libhello.so |grep printf
          U printf
          U表示符號printf被引用,但是并沒有在函數內定義,由此可以推斷,要正常使用hello庫,必須有其它庫支持,再使用ldd命令查看hello依賴于哪些庫:
          $ldd hello
          libc.so.6=>/lib/libc.so.6(0x400la000)
          /lib/ld-linux.so.2=>/lib/ld-linux.so.2 (0x40000000)
          從上面的結果可以繼續查看printf最終在哪里被定義,有興趣可以go on
          生成庫
          第一步要把源代碼編繹成目標代碼。以下面的代碼為例,生成上面用到的hello庫:

          /* hello.c */
          #include  
          void sayhello()
          {
          printf("hello,world\n");
          }
          用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
          gcc -c hello.c -o hello.o
          1.連接成靜態庫
          連接成靜態庫使用ar命令,其實ar是archive的意思
          $ar cqs libhello.a hello.o
          2.連接成動態庫
          生成動態庫用gcc來完成,由于可能存在多個版本,因此通常指定版本號:
          $gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
          另外再建立兩個符號連接:
          $ln -s libhello.so.1.0 libhello.so.1
          $ln -s libhello.so.1 libhello.so
          這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc -shared 參數使其生成是動態庫而不是普通執行程序。
          -Wl 表示后面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正 在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有 soname名字的文件,而不是庫的文件名,換句話說,soname是庫的區分標志。
          這樣做的目的主要是允許系統中多個版本的庫文件共存,習慣上在命名庫文件的時候通常與soname相同
          libxxxx.so.major.minor
          其中,xxxx是庫的名字,major是主版本號,minor 是次版本號



          =====================

          摘要:動態鏈接庫技術實現和設計程序常用的技術,在Windows和Linux系統中都有動態庫的概念,采用動態庫可以有效的減少程序大小,節省空間,提高效率,增加程序的可擴展性,便于模塊化管理。但不同操作系統的動態庫由于格式 不同,在需要不同操作系統調用時需要進行動態庫程序移植。本文分析和比較了兩種操作系統動態庫技術,并給出了將Visual C++編制的動態庫移植到Linux上的方法和經驗。
            
            1、引言
            
            動態庫(Dynamic Link Library abbr,DLL)技術是程序設計中經常采用的技術。其目的減少程序的大小,節省空間,提高效率,具有很高的靈活性。采用動態庫技術對于升級軟件版本更加容易。與靜態庫(Static Link Library)不同,動態庫里面的函數不是執行程序本身的一部分,而是根據執行需要按需載入,其執行代碼可以同時在多個程序中共享。
            
            在Windows和Linux操作系統中,都可采用這種方式進行軟件設計,但他們的調用方式以及程序編制方式不盡相同。本文首先分析了在這兩種操作系統中通常采用的動態庫調用方法以及程序編制方式,然后分析比較了這兩種方式的不同之處,最后根據實際移植程序經驗,介紹了將VC++編制的Windows動態庫移植到Linux下的方法。
            
            2、動態庫技術
            
            2.1 Windows動態庫技術
            
            動態鏈接庫是實現Windows應用程序共享資源、節省內存空間、提高使用效率的一個重要技術手段。常見的動態庫包含外部函數和資源,也有一些動態庫只包含資源,如Windows字體資源文件,稱之為資源動態鏈接庫。通常動態庫以.dll,.drv、.fon等作為后綴。相應的windows靜態庫通常以.lib結尾,Windows自己就將一些主要的系統功能以動態庫模塊的形式實現。
            
            Windows動態庫在運行時被系統加載到進程的虛擬空間中,使用從調用進程的虛擬地址空間分配的內存,成為調用進程的一部分。DLL也只能被該進程的線程所訪問。DLL的句柄可以被調用進程使用;調用進程的句柄可以被DLL使用。DLL模塊中包含各種導出函數,用于向外界提供服務。DLL可以有自己的數據段,但沒有自己的堆棧,使用與調用它的應用程序相同的堆棧模式;一個DLL在內存中只有一個實例;DLL實現了代碼封裝性;DLL的編制與具體的編程語言及編譯器無關,可以通過DLL來實現混合語言編程。DLL函數中的代碼所創建的任何對象(包括變量)都歸調用它的線程或進程所有。
            
            根據調用方式的不同,對動態庫的調用可分為靜態調用方式和動態調用方式。
            
            (1)靜態調用,也稱為隱式調用,由編譯系統完成對DLL的加載和應用程序結束時DLL卸載的編碼(Windows系統負責對DLL調用次數的計數),調用方式簡單,能夠滿足通常的要求。通常采用的調用方式是把產生動態連接庫時產生的.LIB文件加入到應用程序的工程中,想使用DLL中的函數時,只須在源文件中聲明一下。 LIB文件包含了每一個DLL導出函數的符號名和可選擇的標識號以及DLL文件名,不含有實際的代碼。Lib文件包含的信息進入到生成的應用程序中,被調用的DLL文件會在應用程序加載時同時加載在到內存中。
            
            (2)動態調用,即顯式調用方式,是由編程者用API函數加載和卸載DLL來達到調用DLL的目的,比較復雜,但能更加有效地使用內存,是編制大型應用程序時的重要方式。在Windows系統中,與動態庫調用有關的函數包括:
            
            ①LoadLibrary(或MFC 的AfxLoadLibrary),裝載動態庫。
            ②GetProcAddress,獲取要引入的函數,將符號名或標識號轉換為DLL內部地址。
            ③FreeLibrary(或MFC的AfxFreeLibrary),釋放動態鏈接庫。
            
            在windows中創建動態庫也非常方便和簡單。在Visual C++中,可以創建不用MFC而直接用C語言寫的DLL程序,也可以創建基于MFC類庫的DLL程序。每一個DLL必須有一個入口點,在VC++中,DllMain是一個缺省的入口函數。DllMain負責初始化(Initialization)和結束(Termination)工作。動態庫輸出函數也有兩種約定,分別是基于調用約定和名字修飾約定。DLL程序定義的函數分為內部函數和導出函數,動態庫導出的函數供其它程序模塊調用。通常可以有下面幾種方法導出函數:
            
            ①采用模塊定義文件的EXPORT部分指定要輸入的函數或者變量。
            ②使用MFC提供的修飾符號_declspec(dllexport)。
            ③以命令行方式,采用/EXPORT命令行輸出有關函數。
            
            在windows動態庫中,有時需要編寫模塊定義文件(.DEF),它是用于描述DLL屬性的模塊語句組成的文本文件。
            
            2.2 Linux共享對象技術
            
            在Linux操作系統中,采用了很多共享對象技術(Shared Object),雖然它和Windows里的動態庫相對應,但它并不稱為動態庫。相應的共享對象文件以.so作為后綴,為了方便,在本文中,對該概念不進行專門區分。Linux系統的/lib以及標準圖形界面的/usr/X11R6/lib等目錄里面,就有許多以so結尾的共享對象。同樣,在Linux下,也有靜態函數庫這種調用方式,相應的后綴以.a結束。Linux采用該共享對象技術以方便程序間共享,節省程序占有空間,增加程序的可擴展性和靈活性。Linux還可以通過LD-PRELOAD變量讓開發人員可以使用自己的程序庫中的模塊來替換系統模塊。
            
            同Windows系統一樣,在Linux中創建和使用動態庫是比較容易的事情,在編譯函數庫源程序時加上-shared選項即可,這樣所生成的執行程序就是動態鏈接庫。通常這樣的程序以so為后綴,在Linux動態庫程序設計過程中,通常流程是編寫用戶的接口文件,通常是.h文件,編寫實際的函數文件,以.c或.cpp為后綴,再編寫makefile文件。對于較小的動態庫程序可以不用如此,但這樣設計使程序更加合理。
            
            編譯生成動態連接庫后,進而可以在程序中進行調用。在Linux中,可以采用多種調用方式,同Windows的系統目錄(..\system32等)一樣,可以將動態庫文件拷貝到/lib目錄或者在/lib目錄里面建立符號連接,以便所有用戶使用。下面介紹Linux調用動態庫經常使用的函數,但在使用動態庫時,源程序必須包含dlfcn.h頭文件,該文件定義調用動態鏈接庫的函數的原型。
            
            (1)_打開動態鏈接庫:dlopen,函數原型void *dlopen (const char *filename, int flag);
            dlopen用于打開指定名字(filename)的動態鏈接庫,并返回操作句柄。
            
            (2)取函數執行地址:dlsym,函數原型為: void *dlsym(void *handle, char *symbol);
            dlsym根據動態鏈接庫操作句柄(handle)與符號(symbol),返回符號對應的函數的執行代碼地址。
            
            (3)關閉動態鏈接庫:dlclose,函數原型為: int dlclose (void *handle);
            dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。
            
            (4)動態庫錯誤函數:dlerror,函數原型為: const char *dlerror(void); 當動態鏈接庫操作函數執行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數執行成功。
            
            在取到函數執行地址后,就可以在動態庫的使用程序里面根據動態庫提供的函數接口聲明調用動態庫里面的函數。在編寫調用動態庫的程序的makefile文件時,需要加入編譯選項-rdynamic和-ldl。
            
            除了采用這種方式編寫和調用動態庫之外,Linux操作系統也提供了一種更為方便的動態庫調用方式,也方便了其它程序調用,這種方式與Windows系統的隱式鏈接類似。其動態庫命名方式為“lib*.so.*”。在這個命名方式中,第一個*表示動態鏈接庫的庫名,第二個*通常表示該動態庫的版本號,也可以沒有版本號。在這種調用方式中,需要維護動態鏈接庫的配置文件/etc/ld.so.conf來讓動態鏈接庫為系統所使用,通常將動態鏈接庫所在目錄名追加到動態鏈接庫配置文件中。如具有X window窗口系統發行版該文件中都具有/usr/X11R6/lib,它指向X window窗口系統的動態鏈接庫所在目錄。為了使動態鏈接庫能為系統所共享,還需運行動態鏈接庫的管理命令./sbin/ldconfig。在編譯所引用的動態庫時,可以在gcc采用 ?l或-L選項或直接引用所需的動態鏈接庫方式進行編譯。在Linux里面,可以采用ldd命令來檢查程序依賴共享庫。
            
            3、兩種系統動態庫比較分析
            
            Windows和Linux采用動態鏈接庫技術目的是基本一致的,但由于操作系統的不同,他們在許多方面還是不盡相同,下面從以下幾個方面進行闡述。
            
            (1)動態庫程序編寫,在Windows系統下的執行文件格式是PE格式,動態庫需要一個DllMain函數作為初始化的人口,通常在導出函數的聲明時需要有_declspec(dllexport)關鍵字。Linux下的gcc編譯的執行文件默認是ELF格式,不需要初始化入口,亦不需要到函數做特別聲明,編寫比較方便。
            
            (2)動態庫編譯,在windows系統下面,有方便的調試編譯環境,通常不用自己去編寫makefile文件,但在linux下面,需要自己動手去編寫makefile文件,因此,必須掌握一定的makefile編寫技巧,另外,通常Linux編譯規則相對嚴格。
            
            (3)動態庫調用方面,Windows和Linux對其下編制的動態庫都可以采用顯式調用或隱式調用,但具體的調用方式也不盡相同。
            
            (4)動態庫輸出函數查看,在Windows中,有許多工具和軟件可以進行查看DLL中所輸出的函數,例如命令行方式的dumpbin以及VC++工具中的DEPENDS程序。在Linux系統中通常采用nm來查看輸出函數,也可以使用ldd查看程序隱式鏈接的共享對象文件。
            
            (5)對操作系統的依賴,這兩種動態庫運行依賴于各自的操作系統,不能跨平臺使用。因此,對于實現相同功能的動態庫,必須為兩種不同的操作系統提供不同的動態庫版本。
            
            4、動態庫移植方法
            
            如果要編制在兩個系統中都能使用的動態鏈接庫,通常會先選擇在Windows的VC++提供的調試環境中完成初始的開發,畢



          posted @ 2009-01-21 15:56 Picasso 閱讀(14929) | 評論 (0)編輯 收藏

          轉貼:ORA-01034 ORA-27121 錯誤

          ORA-01034: ORACLE not available
          ORA-27121: unable to determine size of shared memory segment
          Linux Error: 13: Permission denied

          主要是因為oracle安裝程序沒有給oracle這個可執行程序設置正確的setuid。這樣設置一下:

          $ cd $ORACLE_HOME/bin
          $ chmod 6751 oracle

          結果類似這樣就行了。

          $ ls -l $ORACLE_HOME/bin/oracle
          -rwsr-s--x 1 oracle oinstall 23352783 Aug 14 2001 /home/oracle/app/oracle/product/8.1.6/bin/oracle


          ========================

          ORA-01034 ORA-27121 13: Permission denied

          ORA-01034

          ORA-27121

          Error: 13: Permission denied

          雙實例 兩個實例

          日月明王      http://sunmoonking.spaces.live.com

          環境               
          HP-UX jmc080 B.11.11 U 9000/800 1805586595 unlimited-user license
           
          SQL*Plus: Release 9.2.0.1.0 - Production on Mon Oct 16 16:48:45 2006
          Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
          Connected to:
          Oracle9i Enterprise Edition Release 9.2.0.1.0 - 64bit Production
          With the Partitioning, OLAP and Oracle Data Mining options
          JServer Release 9.2.0.1.0 – Production
          裝兩個數據庫db1db2,分別有兩個用戶db1userdb2user,分別屬于ORADBA1,ORADBA2,共同屬于oragroup安裝組。裝好兩個庫后出現如下錯誤
          現象
          SQL> connect db2user/db2user@db2
          ERROR:
          ORA-01034: ORACLE not available
          ORA-27121: unable to determine size of shared memory segment
          HP-UX Error: 13: Permission denied
          此時
          $ ls -alt $ORACLE_HOME/bin/oracle
           
           Warning! One or more of your selected locales are not available.
           Please invoke the commands "locale" and "locale -a" to verify your
           selections and the available locales.
           
           Continuing processing using the "C" locale.
           
          -rwsrwsrwx   1 oracle1    oragroup   77765688 Sep  7 16:00 /usr/sap3/oracle/product/920/bin/oracle    (原權限是6751
          如果把/usr/sap3/oracle/product/920/bin/oracle的所有者改成oracle2則可以啟動DB2,但是DB1卻出現同樣錯誤,無法連接。于是判斷是某個文件的權限不對。于是一步一步檢查。
          看誰擁有內存
          $ ipcs -a
          IPC status from /dev/kmem as of Mon Oct 16 18:05:13 2006
          T         ID     KEY        MODE        OWNER     GROUP   CREATOR    CGROUP CBYTES  QNUM QBYTES LSPID LRPID   STIME    RTIME    CTIME
          Message Queues:
          q          0 0x3c200731 -Rrw--w--w-      root      root      root      root     0     0  65535     0     0 no-entry no-entry 19:46:07
          q          1 0x3e200731 --rw-r--r--      root      root      root      root     0     0    264     0     0 no-entry no-entry 19:46:07
          T         ID     KEY        MODE        OWNER     GROUP   CREATOR    CGROUP NATTCH      SEGSZ  CPID  LPID   ATIME    DTIME    CTIME
          Shared Memory:
          m          0 0x412007a8 --rw-rw-rw-      root      root      root      root      0        348   607   607 19:46:17 19:46:17 19:46:11
          m          1 0x4e0c0002 --rw-rw-rw-      root      root      root      root      1      61760   607   607 19:46:13 19:46:17 19:46:11
          m          2 0x411809a4 --rw-rw-rw-      root      root      root      root      1       8192   607   619 19:46:13 19:46:11 19:46:11
          m          3 0x30203ebc --rw-rw-rw-      root      root      root      root      2    1048576  1282  1302 19:49:19 no-entry 19:48:40
          m      17412 0x5e14045d --rw-------      root      root      root      root      1        512  1667  1667 19:49:13 no-entry 19:49:13
          m     312325 0x7bf2fe68 --rw-------   oracle1     users   oracle1     users     13  873955328 20914 22016 18:04:49 18:04:49 16:22:30
          m       4102 0x36ba48e8 --rw-rw----   oracle2     users   oracle2     users     14  706183168 21014 21991 18:03:37 18:03:37 16:26:16
          T         ID     KEY        MODE        OWNER     GROUP   CREATOR    CGROUP NSEMS   OTIME    CTIME
          Semaphores:
          s          0 0x412007a8 --ra-ra-ra-      root      root      root      root     1 19:46:17 19:46:11
          s          1 0x4e0c0002 --ra-ra-ra-      root      root      root      root     2 19:46:13 19:46:11
          s          2 0x411809a4 --ra-ra-ra-      root      root      root      root     2 no-entry 19:46:11
          s          3 0x00446f6e --ra-r--r--      root      root      root      root     1 no-entry 19:46:50
          s          4 0x00446f6d --ra-r--r--      root      root      root      root     1 no-entry 19:46:50
          s          5 0x01090522 --ra-r--r--      root      root      root      root     1 no-entry 19:47:09
          s          6 0x41207339 --ra-ra-ra-      root      root      root      root     1 19:48:35 19:48:35
          s          7 0x31203ebc --ra-ra-ra-      root      root      root      root     1 19:49:19 19:48:40
          s          8 0x611804f5 --ra-ra-ra-      root      root      root      root     1 19:53:03 19:49:04
          s          9 0x731804f5 --ra-ra-ra-      root      root      root      root     1 19:59:47 19:49:04
          s         10 0x701804f5 --ra-ra-ra-      root      root      root      root     1 19:53:43 19:49:04
          s         11 0x691804f5 --ra-ra-ra-      root      root      root      root     1 19:53:01 19:49:04
          s         12 0x751804f5 --ra-ra-ra-      root      root      root      root     1 19:49:04 19:49:04
          s         13 0x631804f5 --ra-ra-ra-      root      root      root      root     1 19:49:04 19:49:04
          s         14 0x641804f5 --ra-ra-ra-      root      root      root      root     1 19:53:04 19:49:04
          s         15 0x661804f5 --ra-ra-ra-      root      root      root      root     1 no-entry 19:49:04
          s         16 0x6c1804f5 --ra-ra-ra-      root      root      root      root     1 19:53:03 19:49:04
          s         17 0x6d1804f5 --ra-ra-ra-      root      root      root      root     1 19:59:47 19:49:04
          s         18 0x6f1804f5 --ra-ra-ra-      root      root      root      root     1 no-entry 19:49:04
          s         19 0x410c01e0 --ra-ra-ra-      root      root      root      root     1 19:49:09 19:49:09
          s         20 0x00000001 --ra-ra-ra-      root      root      root      root     1 19:49:49 19:49:13
          s         21 0x4528e5bf --ra-ra-ra-      root      root      root      root     1 no-entry 19:49:19
          s         22 0x4528e5c0 --ra-ra-ra-      root      root      root      root     1 19:49:19 19:49:19
          s         23 0x521804f5 --ra-ra-ra-      root      root      root      root     1 19:59:47 19:53:04
          s     182624 0xfc6c0898 --ra-------   oracle1     users   oracle1     users   154 18:05:06 16:22:32
          s      49825 0xa01e08b0 --ra-ra----   oracle2     users   oracle2     users   154 18:04:44 16:26:17
          沒看出什么明顯問題。
          首先設置UMAKS 000
          在設置/var/opt/oracle/oratab
          DB1:/usr/sap3/oracle/product/920:Y
          DB2:/usr/sap3/oracle/product/920:Y 
          chown -R oracle1:oragroup $ORACLE_BASE
          chmod -R 777 $ORACLE_BASE
          chmod 6777 $ORACLE_HOME/bin/oracle

          posted @ 2009-01-11 14:55 Picasso 閱讀(2329) | 評論 (0)編輯 收藏

          轉貼: 讓進程在后臺可靠運行的幾種方法

          讓進程在后臺可靠運行的幾種方法

          想讓進程在斷開連接后依然保持運行?如果該進程已經開始運行了該如何補救? 如果有大量這類需求如何簡化操作?

              我們經常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結果卻由于網絡的不穩定導致任務中途失敗。如何讓命令提交后不受本地關閉終端窗口/網絡斷開連接的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。

              nohup/setsid/&

              場景:

              如果只是臨時有一個命令需要長時間運行,什么方法能最簡便的保證它在后臺穩定運行呢?

              解決方法:

              我們知道,當用戶注銷(logout)或者網絡斷開時,終端會收到 HUP(hangup)信號從而關閉其所有子進程。因此,我們的解決辦法就有兩種途徑:要么讓進程忽略 HUP 信號,要么讓進程運行在新的會話里從而成為不屬于此終端的子進程。

              1. nohup

              nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup(在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發送 hangup 信號來通知其關閉所有子進程。) 信號。讓我們先來看一下 nohup 的幫助信息
          NOHUP(1)                        User Commands                        NOHUP(1)

          NAME
                 nohup - run a command immune to hangups, with output to a non-tty

          SYNOPSIS
                 nohup COMMAND [ARG]...
                 nohup OPTION

          DESCRIPTION
                 Run COMMAND, ignoring hangup signals.

                 --help display this help and exit

                 --version
                        output version information and exit 


              可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 文件中。一般我們可在結尾加上"&"來將命令同時放入后臺運行,也可用">filename 2>&1"來更改缺省的重定向文件名。

              nohup 示例

             [root@pvcent107 ~]# nohup ping www.ibm.com &
          [1] 3059
          nohup: appending output to `nohup.out'
          [root@pvcent107 ~]# ps -ef |grep 3059
          root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com
          root      3067   984  0 21:06 pts/3    00:00:00 grep 3059
          [root@pvcent107 ~]#


              2。setsid

              nohup 無疑能通過忽略 HUP 信號來使我們的進程避免中途被中斷,但如果我們換個角度思考,如果我們的進程不屬于接受 HUP 信號的終端的子進程,那么自然也就不會受到 HUP 信號的影響了。setsid 就能幫助我們做到這一點。讓我們先來看一下 setsid 的幫助信息:

              
          SETSID(8) Linux Programmer’s Manual SETSID(8) NAME setsid - run a program in a new session SYNOPSIS setsid program [ arg ... ] DESCRIPTION setsid runs a program in a new session. 


              可見 setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。

              setsid 示例

           [root@pvcent107 ~]# setsid ping www.ibm.com
          [root@pvcent107 ~]# ps -ef |grep www.ibm.com
          root     31094     1  0 07:28 ?        00:00:00 ping www.ibm.com
          root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com
          [root@pvcent107 ~]#   


              值得注意的是,上例中我們的進程 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 進程 ID),并不是當前終端的進程 ID。請將此例與nohup 例中的父 ID 做比較。

              3。&
              這里還有一個關于 subshell 的小技巧。我們知道,將一個或多個命名包含在“()”中就能讓這些命令在子 shell 中運行中,從而擴展出很多有趣的功能,我們現在要討論的就是其中之一。

              當我們將"&"也放入“()”內之后,我們就會發現所提交的作業并不在作業列表中,也就是說,是無法通過jobs來查看的。讓我們來看看為什么這樣就能躲過 HUP 信號的影響吧。

              subshell 示例

               [root@pvcent107 ~]# (ping www.ibm.com &)
          [root@pvcent107 ~]# ps -ef |grep www.ibm.com
          root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com
          root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
          [root@pvcent107 ~]#   


              從上例中可以看出,新提交的進程的父 ID(PPID)為1(init 進程的 PID),并不是當前終端的進程 ID。因此并不屬于當前終端的子進程,從而也就不會受到當前終端的 HUP 信號的影響了
          screen

              場景:

              我們已經知道了如何讓進程免受 HUP 信號的影響,但是如果有大量這種命令需要在穩定的后臺里運行,如何避免對每條命令都做這樣的操作呢?

              解決方法:

              此時最方便的方法就是 screen 了。簡單的說,screen 提供了 ANSI/VT100 的終端模擬器,使它能夠在一個真實終端下運行多個全屏的偽終端。screen 的參數很多,具有很強大的功能,我們在此僅介紹其常用功能以及簡要分析一下為什么使用 screen 能夠避免 HUP 信號的影響。我們先看一下 screen 的幫助信息:

               SCREEN(1)                                                           SCREEN(1)

          NAME
                 screen - screen manager with VT100/ANSI terminal emulation

          SYNOPSIS
                 screen [ -options ] [ cmd [ args ] ]
                 screen -r [[pid.]tty[.host]]
                 screen -r sessionowner/[[pid.]tty[.host]]

          DESCRIPTION
                 Screen  is  a  full-screen  window manager that multiplexes a physical
                 terminal between several  processes  (typically  interactive  shells).
                 Each  virtual  terminal provides the functions of a DEC VT100 terminal
                 and, in addition, several control functions from the  ISO  6429  (ECMA
                 48,  ANSI  X3.64)  and ISO 2022 standards (e.g. insert/delete line and
                 support for multiple character sets).  There is a  scrollback  history
                 buffer  for  each virtual terminal and a copy-and-paste mechanism that
                 allows moving text regions between windows.


              使用 screen 很方便,有以下幾個常用選項:

              用screen -dmS session name 來建立一個處于斷開模式下的會話(并指定其會話名)。
              用screen -list 來列出所有會話。
              用screen -r session name 來重新連接指定會話。
              用快捷鍵CTRL-a d 來暫時斷開當前會話。

              screen 示例

               [root@pvcent107 ~]# screen -dmS Urumchi
          [root@pvcent107 ~]# screen -list
          There is a screen on:
                  12842.Urumchi   (Detached)
          1 Socket in /tmp/screens/S-root.

          [root@pvcent107 ~]# screen -r Urumchi


              當我們用“-r”連接到 screen 會話后,我們就可以在這個偽終端里面為所欲為,再也不用擔心 HUP 信號會對我們的進程造成影響,也不用給每個命令前都加上“nohup”或者“setsid”了。這是為什么呢?讓我來看一下下面兩個例子吧。

              1. 未使用 screen 時新進程的進程樹

               [root@pvcent107 ~]# ping www.google.com &
          [1] 9499
          [root@pvcent107 ~]# pstree -H 9499
          init─┬─Xvnc
               ├─acpid
               ├─atd
               ├─2*[sendmail]
               ├─sshd─┬─sshd───bash───pstree
               │      └─sshd───bash───ping
                      


              我們可以看出,未使用 screen 時我們所處的 bash 是 sshd 的子進程,當 ssh 斷開連接時,HUP 信號自然會影響到它下面的所有子進程(包括我們新建立的 ping 進程)。

              2. 使用了 screen 后新進程的進程樹

               [root@pvcent107 ~]# screen -r Urumchi
          [root@pvcent107 ~]# ping www.ibm.com &
          [1] 9488
          [root@pvcent107 ~]# pstree -H 9488
          init─┬─Xvnc
               ├─acpid
               ├─atd
               ├─screen───bash───ping
               ├─2*[sendmail]


              而使用了 screen 后就不同了,此時 bash 是 screen 的子進程,而 screen 是 init(PID為1)的子進程。那么當 ssh 斷開連接時,HUP 信號自然不會影響到 screen 下面的子進程了。

              總結

              現在幾種方法已經介紹完畢,我們可以根據不同的場景來選擇不同的方案。nohup/setsid 無疑是臨時需要時最方便的方法,disown 能幫助我們來事后補救當前已經在運行了的作業,而 screen 則是在大批量操作時不二的選擇了

          posted @ 2009-01-10 13:48 Picasso 閱讀(285) | 評論 (0)編輯 收藏

          更改Suse 主機名、IP

          Q: 在SLES8中如何修改主機名(hostname)
          A: SLES8中可以用yast network來修改主機名(hostname),也可以通過修改配置文件的方式并運行命令
          實現這個目的

          方法1. 通過yast2管理工具進行配置
          在console中運行yast2工具修改主機名(hostname)
          # yast2 network
          對于配置未經配置的網卡
          "Network cards configuration"中"Network cards configuration"中“Configure...”
          對于修改已配置網卡的設置
          "Network cards configuration"中"Network cards configuration"中“Changev...”

          “Network address setup”中“Detailed settings”單擊“Host name and name server”
          在“Host name”輸入框中輸入主機名,在“Domain name”中數入域名,如果沒有域名,接受缺省的
          “local”

          方法2. 通過修改配置文件的方式并運行命令修改主機名
          修改/etc/HOSTNAME文件,在此文件中保存主機名,例如:
          linuxserv1

          然后運行命令設置主機名
          # /etc/rc.d/boot.localnet start

          方法3. 運行 sysctl 動態改變主機名
          # sysctl -w kernel.hostname=linuxserv1



          Q:如何更改網卡配置IP

          # vi /etc/sysconfig/network/ifcfg-eth-id-00\:0d\:61\:cd\:31\:f2


          BOOTPROTO='static'
          BROADCAST=''
          ETHTOOL_OPTIONS=''
          IPADDR='192.168.1.70'
          MTU=''
          NAME='Giga-byte GA-7VM400M/7VT600 Motherboard'
          NETMASK='255.255.255.0'
          NETWORK=''
          REMOTE_IPADDR=''
          STARTMODE='auto'
          UNIQUE='rBUF.0ayJ55PfLqC'
          USERCONTROL='no'
          _nm_name='bus-pci-0000:01:05.0'

          posted @ 2009-01-04 16:20 Picasso 閱讀(3082) | 評論 (0)編輯 收藏

          AIX 下的 core dump 分析入門

               摘要:   http://www.ibm.com/developerworks/cn/aix/library/0806_chench_core/index.html ...  閱讀全文

          posted @ 2008-11-10 10:52 Picasso 閱讀(1555) | 評論 (0)編輯 收藏

          轉載:ldconfig幾個需要注意的地方

               摘要:   閱讀全文

          posted @ 2008-10-07 22:24 Picasso 閱讀(494) | 評論 (0)編輯 收藏

          轉載: 用vi 編輯文件時“終端太寬”(Terminal too wide)

              
          用vi 編輯文件時“終端太寬”(Terminal too wide)

          #stty -a    check you columns setting .
          #stty columns 132    may solve it .

          posted @ 2008-09-02 09:07 Picasso| 編輯 收藏

          轉載: root用戶ftp-telnet 登陸設置

          root用戶ftp-telnet 登陸設置

          root用戶ftp-telnet 登陸設置
          --------------------------------------
          Linux 精華---root用戶ftp/telnet 登陸設置  (筆者原版---共享)
          --------------------------------------------------------
          筆者以FedCore 4(2.6.11)為藍本,一般情況下系統默認的 root用戶不能遠程ftp 和 telnet 服務器.網絡上有些更改
          遠程登陸的文章,筆者還是認為都不夠全面,經過自己一個小時的折騰終于解決了.
          1),解決root用戶 ftp登陸的問題
            一般情況下,由于種種原因ftp是不讓root用戶遠程登陸,但只要你修改以個文件就可以登陸了.
             a ,去掉或注釋掉  /etc/vsftpd/ftpusers 中的root
             b ,去掉或注釋掉  /etc/vsftpd/user_list  中的root
          2),修改ftp的默認的路徑
          我的硬盤空間有限,如何把帳號ftp默認的路徑/var/ftp更改到別處?或者是,我的linux所有的目錄都放在/根分區,因為空間緊張,我能否把ftp這個用戶的默認路徑放到別的分區?
          可以,應該如下操作!
          首先要把ftp這個用戶刪除
            #userdel -r ftp
          會有錯誤信息,不過不用理,這是正常的。
          然后我們再把這個用戶添加上,比如我想為帳號ftp的家目錄設置在/mnt/LinG/ftp,我們就可以如下操作
            [root@linuxsir001 root]# mkdir /root/ftp
             [root@linuxsir001 root]# adduser -d /root/ftp -g ftp -s /sbin/nologin ftp
          僅僅是這樣做還不行,因為這樣還是不能讓匿名用戶找到它的家目錄,所以我們必須改變/mnt/LinG/ftp這個目錄的權限。
            [root@linuxsir001 root]# chmod 755 /root/ftp/  
              [root@linuxsir001 root]# chown -R root.root /root/ftp/
          3),root用戶登陸 telnet
            a,檢查你的服務器是否安裝 telnet 服務器
             rpm -qa | grep  telnet-server[root@fedorasvr tmp]# ls
             telnet-server-0.17-35.i386.rpm
          [root@fedorasvr tmp]# rpm -i telnet-server-0.17-35.i386.rpm
          warning: telnet-server-0.17-35.i386.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
          error: Failed dependencies:
          xinetd is needed by telnet-server-0.17-35.i386
          -------------哦是什么出錯了呢?????
          檢查,檢查可能是沒有安裝 xinetd ,因為linux的安裝包依賴性可能強,好安裝一下了,在安1.rpm -ivh xinetd-2.3.13-6.i386.rpm
          2.service xinetd start
          3.rpm-ivh telnet-server-0.17-35.i386.rpm
          4.chkconfig telnet on
          裝telnet-server 等
          測試 telnet 服務器已經安裝好了,
             b),開啟root用戶的telnet功能
              1,編輯/etc/default/login文件.
                  添加內容:CONSOLE=/dev/console
                  2,編輯/etc/securetty   文件,加上下面幾行:   
              pts/0   
                  pts/1   
                  pts/2   
                  pts/3
                     測試root用戶直接telnet登陸成功,
                特別提示:對了最好不要使用root用戶telnet 登陸,也不要使用telnet功能,因為它太不安全了,最好使用 ssh2登陸.
          ----------------------------------------------------
          Linux 精華---root用戶ftp/telnet 登陸設置  (筆者原版---共享)
          --------------------------------------------------------
          筆者以FedCore 4(2.6.11)為藍本,一般情況下系統默認的 root用戶不能遠程ftp 和 telnet 服務器.網絡上有些更改
          遠程登陸的文章,筆者還是認為都不夠全面,經過自己一個小時的折騰終于解決了.
          1),解決root用戶 ftp登陸的問題
            一般情況下,由于種種原因ftp是不讓root用戶遠程登陸,但只要你修改以個文件就可以登陸了.
             a ,去掉或注釋掉  /etc/vsftpd/ftpusers 中的root
             b ,去掉或注釋掉  /etc/vsftpd/user_list  中的root
          2),修改ftp的默認的路徑
          我的硬盤空間有限,如何把帳號ftp默認的路徑/var/ftp更改到別處?或者是,我的linux所有的目錄都放在/根分區,因為空間緊張,我能否把ftp這個用戶的默認路徑放到別的分區?
          可以,應該如下操作!
          首先要把ftp這個用戶刪除
            #userdel -r ftp
          會有錯誤信息,不過不用理,這是正常的。
          然后我們再把這個用戶添加上,比如我想為帳號ftp的家目錄設置在/mnt/LinG/ftp,我們就可以如下操作
            [root@linuxsir001 root]# mkdir /root/ftp
             [root@linuxsir001 root]# adduser -d /root/ftp -g ftp -s /sbin/nologin ftp
          僅僅是這樣做還不行,因為這樣還是不能讓匿名用戶找到它的家目錄,所以我們必須改變/mnt/LinG/ftp這個目錄的權限。
            [root@linuxsir001 root]# chmod 755 /root/ftp/  
              [root@linuxsir001 root]# chown -R root.root /root/ftp/
          3),root用戶登陸 telnet
            a,檢查你的服務器是否安裝 telnet 服務器
             rpm -qa | grep  telnet-server[root@fedorasvr tmp]# ls
             telnet-server-0.17-35.i386.rpm
          [root@fedorasvr tmp]# rpm -i telnet-server-0.17-35.i386.rpm
          warning: telnet-server-0.17-35.i386.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
          error: Failed dependencies:
          xinetd is needed by telnet-server-0.17-35.i386
          -------------哦是什么出錯了呢?????
          檢查,檢查可能是沒有安裝 xinetd ,因為linux的安裝包依賴性可能強,好安裝一下了,在安1.rpm -ivh xinetd-2.3.13-6.i386.rpm
          2.service xinetd start
          3.rpm-ivh telnet-server-0.17-35.i386.rpm
          4.chkconfig telnet on
          裝telnet-server 等
          測試 telnet 服務器已經安裝好了,
             b),開啟root用戶的telnet功能
              1,編輯/etc/default/login文件.
                  添加內容:CONSOLE=/dev/console
                  2,編輯/etc/securetty   文件,加上下面幾行:   
              pts/0   
                  pts/1   
                  pts/2   
                  pts/3
                     測試root用戶直接telnet登陸成功,
                特別提示:對了最好不要使用root用戶telnet 登陸,也不要使用telnet功能,因為它太不安全了,最好使用 ssh2登陸.
          ----------------------------------------------------

          posted @ 2008-09-01 20:22 Picasso| 編輯 收藏

          Solaris NIS NFS 配置

          一.NFS Server設置:

              啟動NFS Server服務:
          # /etc/rc3.d/S15nfs.server start

              Share目錄:
                 編輯文件/etc/dfs/dfstab:
          share -F nfs -o rw=10.0.0.13,root=10.0.0.13 /home
                 然后運行shareall將目錄share出去,或者不編輯該文件,直接在命令行輸入效果一樣.

                  查看是否成功share"
                 # dfshares
          RESOURCE                                  SERVER ACCESS    TRANSPORT
             solaris:/home                         solaris  -         -


          二.NIS設置:

              復制配置文件:
          # cp /etc/nsswitch.nis /etc/nsswitch.conf

              設置域名:
          # domainname congli
          # echo congli > /etc/defaultdomain

              初始化及啟動服務:
          # ypinit -m
          # /usr/lib/netsvc/yp/ypstart


          客戶端(Solaris 9)

          一.NFS Client設置: 

              啟動NFS Client服務:
          # /etc/rc2.d/S73nfs.client start

              編輯/etc/vfstab:
          10.0.0.12:/home - /home nfs - yes soft,bg

              把NFS文件系統掛上:
          # mountall -r


          二.NIS設置:

              復制配置文件:
          # cp /etc/nsswitch.nis /etc/nsswitch.conf

              設置域名:
          # domainname congli
          # echo congli > /etc/defaultdomain

              把NIS服務端的IP加到/etc/hosts:
          10.0.0.12       solaris

              初始化及啟動服務:
          # ypinit -m    (填上NIS服務端的hostname,Ctrl+D結束)
          # /usr/lib/netsvc/yp/ypstart

          posted @ 2008-09-01 20:18 Picasso| 編輯 收藏

          Unix Basic

               摘要: 1 UNIX起源、流派及標準 1.1 UNIX的發展簡史 60年代由麻省理工學院、通用電器公司、AT&T貝爾試驗室組成一個專家小組,研制一個MULICS,是一個靈活的交互式操作系統。 60年后期,BELL脫離該組織,失去了靈活的交互式操作系統。 1990年,有一個叫Ken.Tompson寫了一個SPACE TRAVEL的游戲,是在PDP-7上寫的,為了更有效地發揮PDP-7的強大功...  閱讀全文

          posted @ 2008-06-25 15:24 Picasso 閱讀(536) | 評論 (0)編輯 收藏

          Unix Basic

               摘要: 1 UNIX起源、流派及標準 1.1 UNIX的發展簡史 60年代由麻省理工學院、通用電器公司、AT&T貝爾試驗室組成一個專家小組,研制一個MULICS,是一個靈活的交互式操作系統。 60年后期,BELL脫離該組織,失去了靈活的交互式操作系統。 1990年,有一個叫Ken.Tompson寫了一個SPACE TRAVEL的游戲,是在PDP-7上寫的,為了更有效地發揮PDP-7的強大功...  閱讀全文

          posted @ 2008-06-25 15:18 Picasso 閱讀(243) | 評論 (0)編輯 收藏

          STL 的排序算法差異

          http://blog.csdn.net/taodm/archive/2003/04/16/15756.aspx

          posted @ 2008-01-09 15:12 Picasso 閱讀(194) | 評論 (0)編輯 收藏

          VMWare Workstation、GSX Server、ESX Server有什么區別?

          http://keith.ecjtu.com/article.asp?id=657

          總結的比較全,但對esx snapshot的功能說得不對, esx server 支持多級snapshots,應該是權限受到了控制的原因.

          posted @ 2008-01-02 16:35 Picasso 閱讀(2075) | 評論 (1)編輯 收藏

          Technical Area for new GUI design related

          ASP.net
          WCF
          Flex
          Siverlight

          Web Service
          WPF

          posted @ 2007-10-17 16:34 Picasso 閱讀(365) | 評論 (2)編輯 收藏

          主站蜘蛛池模板: 闵行区| 利川市| 灌南县| 西安市| 永州市| 宝山区| 资溪县| 米脂县| 廊坊市| 南皮县| 木兰县| 土默特右旗| 淮北市| 四会市| 英山县| 兴业县| 蒙自县| 色达县| 新干县| 新野县| 汝城县| 醴陵市| 上高县| 微博| 平南县| 龙井市| 西充县| 张家港市| 宣威市| 大庆市| 墨竹工卡县| 永寿县| 怀来县| 宣汉县| 罗源县| 梁河县| 康乐县| 华亭县| 建德市| 定襄县| 中方县|