Linux命令自己總結


對於每一個Linux學習者來說,了解Linux文件系統的目錄結構,是學好Linux的至關重要的一步.,深入了解linux文件目錄結構的標准和每個目錄的詳細功能,對於我們用好linux系統只管重要,下面我們就開始了解一下linux目錄結構的相關知識。

當 在使用Linux的時候,如果您通過ls –l / 就會發現,在/下包涵很多的目錄,比如etcusrvarbin ... ... 等目錄,而 在這些目錄中,我們進去看看,發現也有很多的目錄或文件。文件系統在Linux下看上去就象樹形結構,所以我們可以把文件系統的結構形象的稱為 樹形結 構。

文 件系統的是用來組織和排列文件存取的,所以她是可見的,在Linux中,我們可以通過ls等工具來查看其結構,在Linux系統中,我們見到的都是樹形結 構;比如操作系統安裝在一個文件系統中,他表現為由/ 起始的樹形結構。linux文件系統的最頂端是/,我們稱/Linuxroot,也就 是 Linux操作系統的文件系統。Linux的文件系統的入口就是/,所有的目錄、文件、設備都在/之下,/就是Linux文件系統的組織者,也是最上 級的領導者。

由於linux是開放源代碼,各大公司和團體根據linux的核心代碼做各自的操作,編程。這樣就造成在根下的目錄的不同。這樣就造成個人不能使用他人的linux系統的PC。因為你根本不知道一些基本的配置,文件在哪里。。。這就造成了混亂。這就是FHSFilesystem Hierarchy Standard 機構誕生的原因。該機構是linux愛好者自發的組成的一個團體,主要是是對linux做一些基本的要求,不至於是操作者換一台主機就成了linux‘文盲’。

根 據FHS(http://www.pathname.com/fhs/)的官方文件指出, 他們的主要目的是希望讓使用者可以了解到已安裝軟件通常放置於 那個目錄下, 所以他們希望獨立的軟件開發商、操作系統制作者、以及想要維護系統的用戶,都能夠遵循FHS的標准。 也就是說,FHS的重點在於規范每個 特定的目錄下應該要放置什么樣子的數據而已。 這樣做好處非常多,因為Linux操作系統就能夠在既有的面貌下(目錄架構不變)發展出開發者想要的獨特風 格。

事實上,FHS是根據過去的經驗一直再持續的改版的,FHS依據文件系統使用的頻繁與否與是否允許使用者隨意更動, 而將目錄定義成為四種交互作用的形態,用表格來說有點像底下這樣:


可分享的(shareable)

不可分享的(unshareable)

不變的(static)

/usr (軟件放置處)

/etc (配置文件)

/opt (第三方協力軟件)(IBM)( WebSphere)

/boot (開機與核心檔)

可變動的(variable)

/var/mail (使用者郵件信箱)

/var/run (程序相關)

/var/spool/news (新聞組)

/var/lock (程序相關)

四中類型:

1. 可分享的:

可以分享給其他系統掛載使用的目錄,所以包括執行文件與用戶的郵件等數據, 是能夠分享給網絡上其他主機掛載用的目錄;

2. 不可分享的:

自己機器上面運作的裝置文件或者是與程序有關的socket文件等, 由於僅與自身機器有關,所以當然就不適合分享給其他主機了。

3. 不變的:

有些數據是不會經常變動的,跟隨着而不變動。 例如函式庫、文件說明文件、系統管理員所管理的主機服務配置文件等等;

4. 可變動的:

經常改變的數據,例如登錄文件、一般用戶可自行收受的新聞組等。

事實上,FHS針對目錄樹架構僅定義出三層目錄底下應該放置什么數據而已,分別是底下這三個目錄的定義:

/ (root, 根目錄):與開機系統有關;

/usr (unix software resource):與軟件安裝/執行有關;

/var (variable):與系統運作過程有關。

. 根目錄 (/) 的意義與內容:

根 目錄是整個系統最重要的一個目錄,因為不但所有的目錄都是由根目錄衍生出來的, 同時根目錄也與開機/還原/系統修復等動作有關。 由於系統開機時需要特 定的開機軟件、核心文件、開機所需程序、 函式庫等等文件數據,若系統出現錯誤時,根目錄也必須要包含有能夠修復文件系統的程序才行。 因為根目錄是這么 的重要,所以在FHS的要求方面,他希望根目錄不要放在非常大的分區, 因為越大的分區內你會放入越多的數據,如此一來根目錄所在分區就可能會有較多發生 錯誤的機會。

因此FHS標准建議:根目錄(/)所在分區應該越小越好, 且應用程序所安裝的軟件最好不要與根目錄放在同一個分區內,保持根目錄越小越好。 如此不但效能較佳,根目錄所在的文件系統也較不容易發生問題。說白了,就是根目錄和WindowsC盤一個樣

根據以上原因,FHS認為根目錄(/)下應該包含如下子目錄:

目錄

應放置檔案內容

/bin

系統有很多放置執行檔的目錄,但/bin比較特殊。因為/bin放置的是在單人維護模式下還能夠被操作的指令。在/bin底下的指令可以被root與一般帳號所使用,主要有:cat,chmod(修改權限), chown, date, mv, mkdir, cp, bash等等常用的指令。

/boot

主要放置開機會使用到的檔案,包括Linux核心檔案以及開機選單與開機所需設定檔等等。Linux kernel常用的檔名為:vmlinuz ,如果使用的是grub這個cd 開機管理程式,則還會存在/boot/grub/這個目錄

/dev

Linux系統上,任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中。 只要通過存取這個目錄下的某個檔案,就等於存取某個裝置。比要重要的檔案有 /dev/null, /dev/zero, /dev/tty , /dev/lp*, / dev/hd*, /dev/sd*等等

/etc

系 統主要的設定檔幾乎都放置在這個目錄內,例如人員的帳號密碼檔、各種服務的啟始檔等等。 一般來說,這個目錄下的各檔案屬性是可以讓一般使用者查閱的,但 是只有root有權力修改。 FHS建議不要放置可執行檔(binary)在這個目錄中。 比較重要的檔案有:/etc/inittab, /etc /init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等 等。 另外,其下重要的目錄有:/etc/init.d/ :所有服務的預設啟動script都是放在這里的,例如要啟動或者關閉iptables的 話: /etc/init.d/iptables start/etc/init.d/ iptables stop

/etc/xinetd.d/ :這就是所謂的super daemon管理的各項服務的設定檔目錄。

/etc/X11/ :與X Window有關的各種設定檔都在這里,尤其是xorg.confXF86Config這兩個X Server的設定檔。

/home

這是系統預設的使用者家目錄(home directory)。 在你新增一個一般使用者帳號時,預設的使用者家目錄都會規范到這里來。比較重要的是,家目錄有兩種代號:
~
:代表當前使用者的家目錄,而 ~guest:則代表用戶名為guest的家目錄

/lib

系 統的函式庫非常的多,而/lib放置的則是在開機時會用到的函式庫,以及在/bin/sbin底下的指令會呼叫的函式庫而已 。 什么是函式庫呢?妳可 以將他想成是外掛,某些指令必須要有這些外掛才能夠順利完成程式的執行之意。 尤其重要的是/lib/modules/這個目錄,因為該目錄會放置核心相 關的模組(驅動程式)

/media

media是媒體的英文,顧名思義,這個/media底下放置的就是可移除的裝置 包括軟碟、光碟、DVD等等裝置都暫時掛載於此。 常見的檔名有:/media/floppy, /media/cdrom等等。

/mnt

如果妳想要暫時掛載某些額外的裝置,一般建議妳可以放置到這個目錄中。在古早時候,這個目錄的用途與/media相同啦 只是有了/media之后,這個目錄就用來暫時掛載用了。

/opt

這 個是給第三方協力軟體放置的目錄 。 什么是第三方協力軟體啊?舉例來說,KDE這個桌面管理系統是一個獨立的計畫,不過他可以安裝到Linux系統中, 因此KDE的軟體就建議放置到此目錄下了。 另外,如果妳想要自行安裝額外的軟體(非原本的distribution提供的),那么也能夠將你的軟體安裝 到這里來。 不過,以前的Linux系統中,我們還是習慣放置在/usr/local目錄下

/root

系統管理員(root)的家目錄。 之所以放在這里,是因為如果進入單人維護模式而僅掛載根目錄時,該目錄就能夠擁有root的家目錄,所以我們會希望root的家目錄與根目錄放置在同一個分區中。

/sbin

Linux 有非常多指令是用來設定系統環境的,這些指令只有root才能夠利用來設定系統,其他使用者最多只能用來查詢而已。放在/sbin底下的為開機過程中所需 要的,里面包括了開機、修復、還原系統所需要的指令。至於某些伺服器軟體程式,一般則放置到/usr/sbin/當中。至於本機自行安裝的軟體所產生的系 統執行檔(system binary),則放置到/usr/local/sbin/當中了。常見的指令包 括:fdisk, fsck, ifconfig, init, mkfs等等。cd

/srv

srv可以視為service的縮寫,是一些網路服務啟動之后,這些服務所需要取用的資料目錄。 常見的服務例如WWW, FTP等等。 舉例來說,WWW伺服器需要的網頁資料就可以放置在/srv/www/里面。呵呵,看來平時我們編寫的代碼應該放到這里了。

/tmp

這是讓一般使用者或者是正在執行的程序暫時放置檔案的地方。這個目錄是任何人都能夠存取的,所以你需要定期的清理一下。當然,重要資料不可放置在此目錄啊 因為FHS甚至建議在開機時,應該要將/tmp下的資料都刪除


事實上FHS針對根目錄所定義的標准就僅限於上表,不過仍舊有些目錄也需要我們了解一下,具體如下:

目錄

應放置文件內容

/lost+found

這 個目錄是使用標准的ext2/ext3檔案系統格式才會產生的一個目錄,目的在於當檔案系統發生錯誤時,將一些遺失的片段放置到這個目錄下。 這個目錄通 常會在分割槽的最頂層存在,例如你加裝一個硬盤於/disk中,那在這個系統下就會自動產生一個這樣的目錄/disk/lost+found

/proc

這個目錄本身是一個虛擬文件系統(virtual filesystem) 他放置的資料都是在內存當中,例如系統核心、行程資訊(process)(是進程嗎?)、周邊裝置的狀態及網絡狀態等等。因為這個目錄下的資料都是在記憶體(內存)當中,所以本身不占任何硬盤空間比較重要的檔案(目錄)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虛擬內存嗎[guest]

/sys

這個目錄其實跟/proc非常類似,也是一個虛擬的檔案系統,主要也是記錄與核心相關的資訊。 包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。 這個目錄同樣不占硬盤容量


除了這些目錄的內容之外,另外要注意的是,因為根目錄與開機有關,開機過程中僅有根目錄會被掛載, 其他分區則是在開機完成之后才會持續的進行掛載的行為。就是因為如此,因此根目錄下與開機過程有關的目錄, 就不能夠與根目錄放到不同的分區去那哪些目錄不可與根目錄分開呢?有底下這些:

/etc:配置文件

/bin:重要執行檔

/dev:所需要的裝置文件

/lib:執行檔所需的函式庫與核心所需的模塊

/sbin:重要的系統執行文件

這五個目錄千萬不可與根目錄分開在不同的分區請背下來啊 

. /usr 的意義與內容:

依據FHS的基本定義,/usr里面放置的數據屬於可分享的與不可變動的(shareable, static), 如果你知道如何透過網絡進行分區的掛載(例如在服務器篇會談到的NFS服務器),那么/usr確實可以分享給局域網絡內的其他主機來使用喔。

/usr 不是user的縮寫,其實usrUnix Software Resource的縮寫, 也就是Unix操作系統軟件資源所放置的目錄,而不是用戶的數據啦。這點要注意。 FHS建議所有軟件開發者,應該將他們的數據合理的分別放置到這個目錄下的次目錄,而不要自行建立該軟件自己獨立的目錄。

因 為是所有系統默認的軟件(distribution發布者提供的軟件)都會放置到/usr底下,因此這個目錄有點類似Windows 系統的 C:\Windows\ + C:\Program files\這兩個目錄的綜合體,系統剛安裝完畢時,這個目錄會占用最多的硬盤容量。 一般來 說,/usr的次目錄建議有底下這些:

目錄

應放置文件內容

/usr/X11R6/ 

X Window System重要數據所放置的目錄,之所以取名為X11R6是因為最后的X版本為第11版,且該版的第6次釋出之意。 

/usr/bin/ 

絕大部分的用戶可使用指令都放在這里請注意到他與/bin的不同之處。(是否與開機過程有關) 

/usr/include/ 

c/c++等程序語言的檔頭(header)與包含檔(include)放置處,當我們以tarball方式 (*.tar.gz 的方式安裝軟件)安裝某些數據時,會使用到里頭的許多包含檔 

/usr/lib/ 

包 含各應用軟件的函式庫、目標文件(object file),以及不被一般使用者慣用的執行檔或腳本(script)。 某些軟件會提供一些特殊的指令來 進行服務器的設定,這些指令也不會經常被系統管理員操作, 那就會被擺放到這個目錄下啦。要注意的是,如果你使用的是X86_64Linux系統, 那 可能會有/usr/lib64/目錄產生 

/usr/local/ 

統 管理員在本機自行安裝自己下載的軟件(distribution默認提供者),建議安裝到此目錄, 這樣會比較便於管理。舉例來說,你的 distribution提供的軟件較舊,你想安裝較新的軟件但又不想移除舊版, 此時你可以將新版軟件安裝於/usr/local/目錄下,可與原先的 舊版軟件有分別啦 你可以自行到/usr/local去看看,該目錄下也是具有bin, etc, include, lib...的次目錄 

/usr/sbin/ 

非系統正常運作所需要的系統指令。最常見的就是某些網絡服務器軟件的服務指令(daemon) 

/usr/share/ 

放置共享文件的地方,在這個目錄下放置的數據幾乎是不分硬件架構均可讀取的數據, 因為幾乎都是文本文件嘛在此目錄下常見的還有這些次目錄:/usr/share/man:聯機幫助文件

/usr/share/doc:軟件雜項的文件說明

/usr/share/zoneinfo:與時區有關的時區文件

/usr/src/ 

一般原始碼建議放置到這里,srcsource的意思。至於核心原始碼則建議放置到/usr/src/linux/目錄下。 

. /var 的意義與內容:

如 果/usr是安裝時會占用較大硬盤容量的目錄,那么/var就是在系統運作后才會漸漸占用硬盤容量的目錄。 因為/var目錄主要針對常態性變動的文件, 包括緩存(cache)、登錄檔(log file)以及某些軟件運作所產生的文件, 包括程序文件(lock file, run file),或者例 如MySQL數據庫的文件等等。常見的次目錄有:

目錄

應放置文件內容

/var/cache/

應用程序本身運作過程中會產生的一些暫存檔

/var/lib/

程序本身執行的過程中,需要使用到的數據文件放置的目錄。在此目錄下各自的軟件應該要有各自的目錄。 舉例來說,MySQL的數據庫放置到/var/lib/mysql/rpm的數據庫則放到/var/lib/rpm

/var/lock/

某 些裝置或者是文件資源一次只能被一個應用程序所使用,如果同時有兩個程序使用該裝置時, 就可能產生一些錯誤的狀況,因此就得要將該裝置上鎖 (lock),以確保該裝置只會給單一軟件所使用。 舉例來說,刻錄機正在刻錄一塊光盤,你想一下,會不會有兩個人同時在使用一個刻錄機燒片? 如果兩個 人同時刻錄,那片子寫入的是誰的數據?所以當第一個人在刻錄時該刻錄機就會被上鎖, 第二個人就得要該裝置被解除鎖定(就是前一個人用完了)才能夠繼續使 用

/var/log/

非常重要這是登錄文件放置的目錄里面比較重要的文件如/var/log/messages, /var/log/wtmp(記錄登入者的信息)等。

/var/mail/

放置個人電子郵件信箱的目錄,不過這個目錄也被放置到/var/spool/mail/目錄中通常這兩個目錄是互為鏈接文件

/var/run/

某些程序或者是服務啟動后,會將他們的PID放置在這個目錄下

/var/spool/

這個目錄通常放置一些隊列數據,所謂的隊列就是排隊等待其他程序使用的數據 這 些數據被使用后通常都會被刪除。舉例來說,系統收到新信會放置到/var/spool/mail/中, 但使用者收下該信件后該封信原則上就會被刪除。信 件如果暫時寄不出去會被放到/var/spool/mqueue/中, 等到被送出后就被刪除。如果是工作排程數據(crontab),就會被放置到 /var/spool/cron/目錄中

由於FHS僅是定義出最上層(/)及次層(/usr, /var)的目錄內容應該要放置的文件或目錄數據, 因此,在其他次目錄層級內,就可以隨開發者自行來配置了

. 目錄樹(directory tree) :

Linux底下,所有的文件與目錄都是由根目錄開始的。那是所有目錄與文件的源頭, 然后再一個一個的分支下來,因此,我們也稱這種目錄配置方式為:目錄樹(directory tree), 這個目錄樹的主要特性有:

目錄樹的啟始點為根目錄 (/, root)

每一個目錄不止能使用本地端的 partition 的文件系統,也可以使用網絡上的 filesystem 。舉例來說, 可以利用 Network File System (NFS) 服務器掛載某特定目錄等。

每一個文件在此目錄樹中的文件名(包含完整路徑)都是獨一無二的。

如果我們將整個目錄樹以圖的方法來顯示,並且將較為重要的文件數據列出來的話,那么目錄樹架構就如下圖所示:

 

. 絕對路徑與相對路徑

除了需要特別注意的FHS目錄配置外,在文件名部分我們也要特別注意。因為根據檔名寫法的不同,也可將所謂的路徑(path)定義為絕對路徑(absolute)與相對路徑(relative)。 這兩種文件名/路徑的寫法依據是這樣的:

絕對路徑:

由根目錄(/)開始寫起的文件名或目錄名稱, 例如 /home/dmtsai/.bashrc

相對路徑:

相對於目前路徑的文件名寫法。 例如 ./home/dmtsai http://www.cnblogs.com/home/dmtsai/ 等等。反正開頭不是 / 就屬於相對路徑的寫法cd

而你必須要了解,相對路徑是以你當前所在路徑的相對位置來表示的。舉例來說,你目前在 /home 這個目錄下, 如果想要進入 /var/log 這個目錄時,可以怎么寫呢?

cd /var/log (absolute)

cd ../var/log (relative)

因為你在 /home 底下,所以要回到上一層 (../) 之后,才能繼續往 /var 來移動的,特別注意這兩個特殊的目錄:

. :代表當前的目錄,也可以使用 ./ 來表示;

.. :代表上一層目錄,也可以 ../ 來代表。

這個 . .. 目錄概念是很重要的,你常常會看到 cd .. ./command 之類的指令下達方式, 就是代表上一層與目前所在目錄的工作狀態。

實例1:如何先進入/var/spool/mail/目錄,再進入到/var/spool/cron/目錄內?

命令

cd /var/spool/mail

cd ../cron

說明:

由 於/var/spool/mail/var/spool/cron是同樣在/var/spool/目錄中。如此就不需要在由根目錄開始寫起了。這個相對 路徑是非常有幫助的,尤其對於某些軟件開發商來說。 一般來說,軟件開發商會將數據放置到/usr/local/里面的各相對目錄。 但如果用戶想要安裝 到不同目錄呢?就得要使用相對路徑。

實例2:網絡文件常常提到類似./run.sh之類的數據,這個指令的意義為何?

說明:

由於指令的執行需要變量的支持,若你的執行文件放置在本目錄,並且本目錄並非正規的執行文件目錄(/bin, /usr/bin等為正規),此時要執行指令就得要嚴格指定該執行檔。./代表本目錄的意思,所以./run.sh代表執行本目錄下, 名為run.sh的文件。

  1. Linux文件類型與擴展名

Linux文件類型和Linux文件的文件名所代表的意義是兩個不同的概念。我們通過一般應用程序而創建的比如file.txtfile.tar.gz ,這些文件雖然要用不同的程序來打開,但放在Linux文件類型中衡量的話,大多是常規文件(也被稱為普通文件)。

. 文件類型

Linux文件類型常見的有:普通文件、目錄文件、字符設備文件塊設備文件、符號鏈接文件等現在我們進行一個簡要的說明。

1. 普通文件 

我 們用 ls -lh 來查看某個文件的屬性,可以看到有類似-rwxrwxrwx,值得注意的是第一個符號是 - ,這樣的文件在Linux中就是普通文 件。這些文件一般是用一些相關的應用程序創建,比如圖像工具、文檔工具、歸檔工具... .... cp工具等。這類文件的刪除方式是用rm 命 令。 另外,依照文件的內容,又大略可以分為:

1>. 純文本檔(ASCII)

這是Linux系統中最多的一種文件類型,稱為純文本檔是因為內容為我們人類可以直接讀到的數據,例如數字、字母等等。 幾乎只要我們可以用來做為設定的文件都屬於這一種文件類型。 舉例來說,你可以用命令:cat ~/.bashrc看到該文件的內容。 (cat 是將一個文件內容讀出來的指令).

2>. 二進制文件(binary)

Linux系統其實僅認識且可以執行二進制文件(binary file)Linux當中的可執行文件(scripts, 文字型批處理文件不算)就是這種格式的文件。 剛剛使用cat就是一個binary file

3>. 數據格式文件(data) 

有些程序在運作的過程當中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件 (data file)。舉例來說,我們的Linux在使用者登時,都會將登錄的數據記錄在 /var/log/wtmp那個文件內,該文件是一個data file,他能夠透過last這個指令讀出來! 但是使用cat時,會讀出亂碼~因為他是屬於一種特殊格式的文件?

2. 目錄文件

當 我們在某個目錄下執行,看到有類似 drwxr-xr-x ,這樣的文件就是目錄,目錄在Linux是一個比較特殊的文件。注意它的第一個字符是d。創建 目錄的命令可以用 mkdir 命令,或cp命令,cp可以把一個目錄復制為另一個目錄。刪除用rm rmdir命令。

3. 字符設備或塊設備文件 

如時您進入/dev目錄,列一下文件,會看到類似如下的:

[root@localhost ~]# ls -al /dev/tty

crw-rw-rw- 1 root tty 5, 0 11-03 15:11 /dev/tty

[root@localhost ~]# ls -la /dev/sda1

brw-r----- 1 root disk 8, 1 11-03 07:11 /dev/sda1

我們看到/dev/tty的屬性是 crw-rw-rw- ,注意前面第一個字符是 c ,這表示字符設備文件。比如貓等串口設備。我們看到 /dev/sda1 的屬性是 brw-r----- ,注意前面的第一個字符是b,這表示塊設備,比如硬盤,光驅等設備。

這個種類的文件,是用mknode來創建,用rm來刪除。目前在最新的Linux發行版本中,我們一般不用自己來創建設備文件。因為這些文件是和內核相關聯的。

與系統周邊及儲存等相關的一些文件, 通常都集中在/dev這個目錄之下!通常又分為兩種:

區塊(block)設備檔 :

就是一些儲存數據, 以提供系統隨機存取的接口設備,舉例來說,硬盤與軟盤等就是啦! 你可以隨機的在硬盤的不同區塊讀寫,這種裝置就是成組設備!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]

字符(character)設備文件:

亦即是一些串行端口的接口設備, 例如鍵盤、鼠標等等!這些設備的特色就是一次性讀取的,不能夠截斷輸出。 舉例來說,你不可能讓鼠標跳到另一個畫面,而是滑動到另一個地方!第一個屬性為 [ c ]

4. 數據接口文件(sockets)

數據接口文件(或者:套接口文件),這種類型的文件通常被用在網絡上的數據承接了。我們可以啟動一個程序來監聽客戶端的要求, 而客戶端就可以透過這個socket來進行數據的溝通了。第一個屬性為 [ s ], 最常在/var/run這個目錄中看到這種文件類型了。

例如:當我們啟動MySQL服務器時,會產生一個mysql.sock的文件。

[root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock 

srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock

注意這個文件的屬性的第一個字符是 s

5. 符號鏈接文件 

當 我們查看文件屬性時,會看到有類似 lrwxrwxrwx,注意第一個字符是l,這類文件是鏈接文件。是通過ln -s 源文件名 新文件名 。上面是一 個例子,表示setup.loginstall.log的軟鏈接文件。怎么理解呢?這和Windows操作系統中的快捷方式有點相似。

符號鏈接文件的創建方法舉例:

[root@localhost test]# ls -lh log2012.log

-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log

[root@localhost test]# ln -s log2012.log  linklog.log

[root@localhost test]# ls -lh *.log

lrwxrwxrwx 1 root root   11 11-22 06:58 linklog.log -> log2012.log

-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log

6. 數據輸送文件(FIFO,pipe:

FIFO也是一種特殊的文件類型,他主要的目的在解決多個程序同時存取一個文件所造成的錯誤問題。 FIFOfirst-in-first-out的縮寫。第一個屬性為[p]

. Linux文件擴展名

1. 擴展名類型

基 本上,Linux的文件是沒有所謂的擴展名的,一個Linux文件能不能被執行,與他的第一欄的十個屬性有關, 與檔名根本一點關系也沒有。這個觀念跟 Windows的情況不相同喔!在Windows底下, 能被執行的文件擴展名通常是 .com .exe .bat等等,而在Linux底下,只要你的 權限當中具有x的話,例如[ -rwx-r-xr-x ] 即代表這個文件可以被執行



過,可以被執行跟可以執行成功是不一樣的~舉例來說,在root家目錄下的install.log 是一個純文本檔,如果經由修改權限成 為 -rwxrwxrwx 后,這個文件能夠真的執行成功嗎? 當然不行~因為他的內容根本就沒有可以執行的數據。所以說,這個x代表這個文件具有可執行 的能力, 但是能不能執行成功,當然就得要看該文件的內容.

雖然如此,不過我們仍然希望可以藉由擴展名來了解該文件是什么東西,所以,通常我們還是會以適當的擴展名來表示該文件是什么種類的。底下有數種常用的擴展名:

*.sh : 腳本或批處理文件 (scripts),因為批處理文件為使用shell寫成的,所以擴展名就編成 .sh

*Z, *.tar, *.tar.gz, *.zip, *.tgz: 經過打包的壓縮文件。這是因為壓縮軟件分別為 gunzip, tar 等等的,由於不同的壓縮軟件,而取其相關的擴展名!

*.html, *.php:網頁相關文件,分別代表 HTML 語法與 PHP 語法的網頁文件.html 的文件可使用網頁瀏覽器來直接開啟,至於 .php 的文件, 則可以透過 client 端的瀏覽器來 server 端瀏覽,以得到運算后的網頁結果

基本上,Linux系統上的文件名真的只是讓你了解該文件可能的用途而已,真正的執行與否仍然需要權限的規范才行例如雖然有一個文件為可執行文件,如常見的/bin/ls這個顯示文件屬性的指令,不過,如果這個文件的權限被修改成無法執行時,那么ls就變成不能執行

上述的這種問題最常發生在文件傳送的過程中。例如你在網絡上下載一個可執行文件,但是偏偏在你的 Linux系統中就是無法執行!呵呵!那么就是可能文件的屬性被改變了不要懷疑,從網絡上傳送到你的 Linux系統中,文件的屬性與權限確實是會被改變的

2. Linux文件

長度限制:

Linux底下,使用預設的Ext2/Ext3文件系統時,針對文件名長度限制為:

單一文件或目錄的最大容許文件名為 255 個字符

包含完整路徑名稱及目錄 (/) 之完整檔名為 4096 個字符

是相當長的檔名!我們希望Linux的文件名可以一看就知道該文件在干嘛的, 所以檔名通常是很長很長

3. Linux文件名的字符的限制:

由於Linux在文字接口下的一些指令操作關系,一般來說,你在設定Linux底下的文件名時, 最好可以避免一些特殊字符比較好!例如底下這些:

* ? > < ; & ! [ ] | \ ' " ` ( ) { }

因為這些符號在文字接口下,是有特殊意義的另外,文件名的開頭為小數點.時, 代表這個文件為隱藏文件!同時,由於指令下達當中,常常會使用到 -option 之類的選項, 所以你最好也避免將文件檔名的開頭以 - + 來命名

Linux中的目錄

路徑:也就是linux中的目錄(文件夾)有絕對路徑和相對路徑
根目錄:/
用戶主目錄(home directory):位於/home目錄下,用戶登錄時
工作目錄(working directory):當前目錄

當前目錄查看命令:pwd (print working directory)
當前目錄:./
當前目錄的上一級目錄:../..
返回到上一級目錄:cd ..

進入當前目錄下的dirfile目錄:cd dirfile
cd ~ :
進入用戶主目錄(賬號所在目錄)  或者直接cd回車
cd - :(
回到先前的目錄

3.查看當前目錄

格式:pwd

功能:pwd (print working directory),查看當前目錄.

常用選項說明:

【例】:查看當前目錄

 

[root@localhost rootfile]# pwd

/home/rootfile

5.顯示目錄內容

格式:ls  [選項]  [文件目錄]

功能:顯示指定目錄中的文件和了目錄信息,當不指定目錄時,顯示當前目錄下的文件和子目錄信息

常用選項說明:

-a  顯示所有文件和子目錄,包括隱藏文件和主目錄

-l  顯示文件和子目錄的詳細信息,包括文件類型、權限、所有者和所屬群組、文件大小、最后修改時間、文件名

-d  如果參數是目錄,則只顯示目錄信息,而不顯示其中所包含的文件信息

-t  按時間順序顯示

-R  不僅顯示指定目錄下的文件和子目錄信息,而且還遞歸地顯示子目錄下的文件和子目錄信息

 【例】:

范例一:將目錄下面的文件都列出來(含屬性與隱藏文件)

[root@dsetl tmp]# ls -al

drwx------ 2 fex 602 4096 Jan 9 11:41 keyring-XoSvfl

范例二:完整的顯示文件的修改時間

[root@dsetl tmp]# ls -al --full-time

rwx------ 2 fex 602 4096 2014-01-09 11:41:48.000000000 +0800 .esd-602

創建和查看文件內容

cat命令

cat命令的用途是連接文件或標准輸入並打印。這個命令常用來顯示文件內容,或者將幾個文件連接起來顯示,或者從標准輸入讀取內容並顯示,它常與重定向符號配合使用。 

1命令格式:

cat [選項] [文件]...

2命令功能:

cat主要有三大功能:

1.一次顯示整個文件:cat filename

2.從鍵盤創建一個文件:cat > filename 只能創建新文件,不能編輯已有文件.

3.將幾個文件合並為一個文件:cat file1 file2 > file

3命令參數:

-A, --show-all 等價於 -vET

-b, --number-nonblank 對非空輸出行編號

-e 等價於 -vE

-E, --show-ends 在每行結束處顯示 $

-n, --number 對輸出的所有行編號,1開始對所有輸出的行數編號

-s, --squeeze-blank 有連續兩行以上的空白行,就代換為一行的空白行

-t -vT 等價

-T, --show-tabs 將跳格字符顯示為 ^I

-u (被忽略)

-v, --show-nonprinting 使用 ^ M- 引用,除了 LFD TAB 之外


常用選項說明:

【例】:讀取rootfileTest.javafile中的文件內容

Cd etc

查看/etc/ issue目錄下的內容。

 [dsuser@dsetl etc]$ find issue

issue

[dsuser@dsetl etc]$ find *issue*

issue

issue.net

[dsuser@dsetl etc]$ cat issue --查看/etc/ issue目錄下的內容

Red Hat Enterprise Linux Server release 6.4 (Santiago)

Kernel \r on an \m


[dsuser@dsetl etc]$ cat -n issue –顯示行號

1 Red Hat Enterprise Linux Server release 6.4 (Santiago)

2 Kernel \r on an \m

3

[dsuser@dsetl etc]$

cat: invalid option -- 'a'

Try `cat --help' for more information.

[dsuser@dsetl etc]$ cat -A issue

Red Hat Enterprise Linux Server release 6.4 (Santiago)$

Kernel \r on an \m$

【例】:查看內核:

1.[root@dsetl /]# cat /etc/issue

Red Hat Enterprise Linux Server release 6.4 (Santiago)

2.cat /etc/lsb-release

LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch

3.[root@dsetl /]# cat /proc/version

Linux version 2.6.32-358.el6.x86_64 (mockbuild@x86-022.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Tue Jan 29 11:47:41 EST 2013



實例一:把issue1的文件內容加上行號后輸入 issue2這個文件里

命令:

[root@dsetl lp]# cp /etc/issue .

[root@dsetl lp]# vi issue

[root@dsetl lp]# mv issue issue1

[root@dsetl lp]# vi issue2

[root@dsetl lp]# cat issue1

a

b

c

d

e

f

g

h

i

j

k

l

[root@dsetl lp]# cat issue2

p

q

z

x

v

b

n

n

輸出:

[root@dsetl lp]# cat -n issue1 issue2

1 a

2 b

3 c

4 d

5 e

6 f

7 g

8 h

9 i

10 j

11 k

12 l

13 p

14 q

15 z

16 x

17 v

18 b

19 n

20 n

說明:

實例二:把 issue1issue2的文件內容加上行號(空白行不加)之后將內容合並到 issue3 里。

命令:

[root@dsetl lp]# vi issue1


a

b

c


d

e

f

g

h

i

j

k

[root@dsetl lp]# cat -b issue1 issue2 > issue3

[root@dsetl lp]# cat issue3

1 a

2 b

3 c


4 d

5 e

6 f

7 g

8 h

9 i

10 j

11 k

12 l

13 p

14 q

15 z

16 x

17 v

18 b

19 n

20 n實例三:把 issue1的文件內容加上行號后輸入 issue2這個文件里

命令:

輸出:

[root@localhost test]# cat issue1

[root@dsetl lp]# cat -n issue1 > issue2

[root@dsetl lp]# cat issue2

a

b

c


d

e

f

g

h

i

j

k

l [root@localhost test]#


Uname:

Uname –a 用來獲取電腦和操作系統的相關信息。

內核名稱,主機名,內核版本號,內核版本,硬件名,處理器類型,硬件平台類型,操作系統名稱

 

3命令參數:

-m或–machine 顯示主機的硬件(CPU)


-n
-nodename 顯示主機在網絡節點上的名稱或主機名稱
-r
或–release 顯示linux操作系統內核版本號
-s
或–sysname 顯示linux內核名稱
-v
顯示顯示操作系統是第幾個 version 版本
-p
顯示處理器類型或unknown
-i
顯示硬件平台類型或unknown
-o
顯示操作系統名
–help
獲得幫助信息
–version
  顯示uname版本信息

實例1

--依次為內核名稱,主機名,內核版本號,內核版本,硬件名,處理器類型,硬件平台類型,操作系統名稱


[root@dsetl /]# uname –a

Linux --顯示內核名稱(Linux

dsetl --顯示主機在網絡節點上的名稱或主機名稱 (dsetl

2.6.32-358.el6.x86_64 -顯示主機的硬件(CPU)

x86_64

#1 SMP Tue Jan 29 11:47:41 EST 2013 --顯示操作系統是第幾個 version 版本

x86_64 x86_64 x86_64

GNU/Linux --顯示操作系統名 (GNU/Linux


[root@dsetl /]# uname –r --linux操作系統的內核版本號(2.6.32-358.el6.x86_64

[root@dsetl /]# uname –o --顯示操作系統名 (GNU/Linux
[root@dsetl /]# uname –s --
顯示內核名稱(Linux

[root@dsetl /]# uname –m --顯示主機的硬件(CPU)

x86_64

[root@dsetl /]# uname –n --顯示主機在網絡節點上的名稱或主機名稱 (dsetl

[root@dsetl /]# uname –v --顯示操作系統是第幾個 version 版本( #1 SMP Tue Jan 29 11:47:41 EST 2013

Tac命令:

反向顯示

more命令 翻頁查看

more命令,功能類似 cat cat命令整個文件的內容從上到下顯示在屏幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能 more命令從前向后讀取文件,因此在啟動時就加載整個文件

格式:more  [選項]  filename

功能:依次讀取filename中的內容,該命令與cat的不同是可以逐屏往下翻頁顯示,按q退出。

常用選項說明:

+n 從笫n行開始顯示

-n 定義屏幕大小為n

-p  顯示下一屏之前先清屏

-s  文件中連續的空白行壓縮成一個空白行顯示

-l 忽略Ctrl+l(換頁)字符


查看man.config


命令:More /etc/ man.config

# If no catdir is given, it is assumed to be equal to the mandir

# (so that this dir has both man1 etc. and cat1 etc. subdirs).

# This is the traditional Unix setup.

# Certain versions of the FSSTND recommend putting formatted versions

# of /usr/.../man/manx/page.x into /var/catman/.../catx/page.x.

# The keyword FSSTND will cause this behaviour.

# Certain versions of the FHS recommend putting formatted versions of

# /usr/.../share/man/[locale/]manx/page.x into

# /var/cache/man/.../[locale/]catx/page.x.

# The keyword FHS will cause this behaviour (and overrides FSSTND).

# Explicitly given catdirs override.

#

# FSSTND

FHS

#

# This file is also read by man in order to find how to call nroff, less, etc.

--More--(27%)

1)空格鍵:表示向下翻一頁

2enter鍵表示向下翻一行。

 實例1顯示文件中從第3行起的內容

命令:

more +3 log2012.log

輸出:

[root@localhost test]# cat log2012.log 

2012-01

2012-02

2012-03

2012-04-day1

2012-04-day2

2012-04-day3

======[root@localhost test]# more +3 log2012.log 

2012-03

2012-04-day1

2012-04-day2

2012-04-day3

======[root@localhost test]#

實例2從文件中查找第一個出現"day3"字符串的行,並從該處前兩行開始顯示輸出 

命令:

 more +/day3 log2012.log

輸出:

[root@localhost test]# more +/day3 log2012.log 

...skipping

2012-04-day1

2012-04-day2

2012-04-day3

2012-05

2012-05-day1

======[root@localhost test]#

實例3:設定每屏顯示行數 

命令:

more -5 log2012.log

輸出:

[root@localhost test]# more -5 log2012.log 

2012-01

2012-02

2012-03

2012-04-day1

2012-04-day2

說明:

如下圖所示,最下面顯示了該屏展示的內容占文件總行數的比例,按 Ctrl+F 或者 空格鍵 將會顯示下一屏5條內容,百分比也會跟着變化。


實例4列一個目錄下的文件,由於內容太多,我們應該學會用more來分頁顯示。這得和管道 | 結合起來

命令:

ls -l | more -5

輸出:

[root@localhost test]#  ls -l  | more -5

總計 36

-rw-r--r-- 1 root root  308 11-01 16:49 log2012.log

-rw-r--r-- 1 root root   33 10-28 16:54 log2013.log

-rw-r--r-- 1 root root  127 10-28 16:51 log2014.log

lrwxrwxrwx 1 root root    7 10-28 15:18 log_link.log -> log.log


說明:

每頁顯示5個文件信息,按 Ctrl+F 或者 空格鍵 將會顯示下5條文件信息。



less命令 翻頁查看

格式:less  [選項]  filename

功能:依次讀取filename中的內容,該命令與more的不同是不僅可以向下翻頁,還可以向上翻頁,使用上下鍵、Enter、空格、pageDownpageUp可以實現前后翻頁,按q退出。

常用選項說明:

 命令:less /etc/ man.config

實例2ps查看進程信息並通過less分頁顯示 

命令:

ps -ef |less

   輸出:

                

實例3:查看命令歷史使用記錄並通過less分頁顯示

命令:

history | less

輸出:

         [root@localhost test]# history | less

    22  scp -r tomcat6.0.32 root@192.168.120.203:/opt/soft

    23  cd ..

    24  scp -r web root@192.168.120.203:/opt/

    25  cd soft

    26  ls

    27  scp -r jdk1.6.0_16/ root@192.168.120.203:/opt/soft

    28  clear

    29  vim /etc/profile

    30  vim /etc/profile

    31  cd tomcat6.0.32/bin/

    32  ls

    33  ./shutdown.sh

    34  ./startup.sh

    35  vim startup.sh

   36  ls

    37  echo $JAVA_HOME

    38  java

    39  ls

    40  ls

    41  clear

    42  cd /opt

    43  ls

    44  cp apache-tomcat-6.0.32.tar.gz soft/

    45  ls

    46  rm -f apache-tomcat-6.0.32.tar.gz 

    47  ls

    48  cd soft

    49  ls

    50  tar -vzf apache-tomcat-6.0.32.tar.gz 

    51  tar -vzfx apache-tomcat-6.0.32.tar.gz 

    52  tar -zxvf apache-tomcat-6.0.32.tar.gz 

    53  ls

    54  cd apache-tomcat-6.0.32

    55  ls

    56  cd ..

    57  mv apache-tomcat-6.0.32 tomcat6.0.32

    58  ls

    59  cd tomcat6.0.32/

    60  ls

實例5瀏覽多個文件 

命令:

Less log2013.log log2014.log

輸出:


    說明:

輸入 :n后,切換到 log2014.log

輸入 :p 后,切換到log2013.log

5附加備注

1.全屏導航

ctrl + F - 向前移動一屏

ctrl + B - 向后移動一屏

ctrl + D - 向前移動半屏

ctrl + U - 向后移動半屏

 

2.單行導航

j - 向前移動一行

k - 向后移動一行

 

3.其它導航

G - 移動到最后一行

g - 移動到第一行

q / ZZ - 退出 less 命令zz

 

4.其它有用的命令

v - 使用配置的編輯器編輯當前文件

h - 顯示 less 的幫助文檔

&pattern - 僅顯示匹配模式的行,而不是整個文件

 

5.標記導航

當使用 less 查看大文件時,可以在任何一個位置作標記,可以通過命令導航到標有特定標記的文本位置:

ma - 使用 a 標記文本的當前位置

'a - 導航到標記 a


head命令

格式:head  [選項]  filename

功能:顯示文件的頭幾行

常用選項說明:

-n  顯示文件的前n行,如果沒有n值,默認為10

-c<字節> 顯示字節數

命令:Head -2  /etc/ man.config –顯示前兩行

Head –n 2  /etc/ man.config –顯示前兩行

【例】

文件太大,取文件的部分數據:

head -100000 /home/inputfile/data/inputfile/CORE/RUCCDTA/20131231/CORE_SCECA_20131231_INIT.DATA > CORE_SCECA_20131231_INIT.DATA

實例2:顯示文件前n個字節

命令:

head -c 20 log2014.log

輸出:

[root@localhost test]# head -c 20 log2014.log

2014-01

2014-02

2014

[root@localhost test]#

實例3文件的除了最后n個字節以外的內容 

命令:

head -c -32 log2014.log

輸出:

[root@localhost test]# head -c -32 log2014.log

2014-01

2014-02

2014-03

2014-04

2014-05

2014-06

2014-07

2014-08

2014-09

2014-10

2014-11

2014-12[root@localhost test]#

實例4:輸出文件除了最后n行的全部內容

命令:

head -n -6 log2014.log

輸出:

[root@localhost test]# head -n -6 log2014.log

2014-01

2014-02

2014-03

2014-04

2014-05

2014-06

2014-07[root@localhost test]#

>>>重定向命令:

  • 重定向命令,可以結合headls等使用。

  • head -10 file1>file2 :把file1的前10條記錄保存到file2文件。

  • head -10 file1>>file2 :把file1的前10條記錄追加保存到file2文件。

  • cat file1 file2>file3 :將file1file2合並成一個文件file3.

[root@dsetl lp]# head -6 man.config>man.test.config

[root@dsetl lp]# cat man.config > man.test.config

    1. tail命令

tail 命令從指定點開始將文件寫到標准輸出.使用tail命令的-f選項可以方便的查閱正在改變的日志文件,tail -f filename會把filename里最尾部的內容顯示在屏幕上,並且不但刷新,使你看到最新的文件內容.

格式:tail  [選項]  filename

2.命令功能:

用於顯示指定文件末尾內容,不指定文件時,作為輸入信息進行處理。常用查看日志文件

常用選項說明:

+n  從第n行開始顯示

-n  顯示文件的最后n行,如果沒有n值,默認為最后10

-f 循環讀取

實例1:顯示文件末尾內容

命令:

tail -n 5 log2014.log

輸出:

[root@localhost test]# tail -n 5 log2014.log 

2014-09

2014-10

2014-11

2014-12

==============================[root@localhost test]#

說明:

顯示文件最后5行內容


實例2:循環查看文件內容

命令:

tail -f test.log

輸出:

[root@localhost ~]# ping 192.168.120.204 > test.Log &

[1] 11891[root@localhost ~]# tail -f test.log 

PING 192.168.120.204 (192.168.120.204) 56(84) bytes of data.

64 bytes from 192.168.120.204: icmp_seq=1 ttl=64 time=0.038 ms

64 bytes from 192.168.120.204: icmp_seq=2 ttl=64 time=0.036 ms

64 bytes from 192.168.120.204: icmp_seq=3 ttl=64 time=0.033 ms

64 bytes from 192.168.120.204: icmp_seq=4 ttl=64 time=0.027 ms

64 bytes from 192.168.120.204: icmp_seq=5 ttl=64 time=0.032 ms

64 bytes from 192.168.120.204: icmp_seq=6 ttl=64 time=0.026 ms

64 bytes from 192.168.120.204: icmp_seq=7 ttl=64 time=0.030 ms

64 bytes from 192.168.120.204: icmp_seq=8 ttl=64 time=0.029 ms

64 bytes from 192.168.120.204: icmp_seq=9 ttl=64 time=0.044 ms

64 bytes from 192.168.120.204: icmp_seq=10 ttl=64 time=0.033 ms

64 bytes from 192.168.120.204: icmp_seq=11 ttl=64 time=0.027 ms

[root@localhost ~]#

說明:

ping 192.168.120.204 > test.log & //在后台ping遠程主機。並輸出文件到test.log這種做法也使用於一個以上的檔案監視。用Ctrlc來終止。 

實例3:從第5行開始顯示文件

命令:

tail -n +5 log2014.log

輸出:

[root@localhost test]# cat log2014.log 

2014-01

2014-02

2014-03

2014-04

2014-05

2014-06

2014-07

2014-08

2014-09

2014-10

2014-11

2014-12

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

[root@localhost test]# tail -n +5 log2014.log

2014-05

2014-06

2014-07

2014-08

2014-09

2014-10

2014-11

2014-12

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


    1. nl命令

linux系統中用來計算文件中行號nl 可以將輸出的文件內容自動的加上行號!其默認的結果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能。

1命令格式:

nl [選項]... [文件]...

2命令參數:

-b :指定行號指定的方式,主要有兩種:l

-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n)

-b t :如果有空行,空的那一行不要列出行號(默認值)

-n :列出行號表示的方法,主要有三種:

-n ln :行號在螢幕的最左方顯示;

-n rn :行號在自己欄位的最右方顯示,且不加 0

-n rz :行號在自己欄位的最右方顯示,且加 0

-w :行號欄位的占用的位數。

-p 在邏輯定界符處不重新開始計算。 

3命令功能:

nl 命 令讀取 File 參數(缺省情況下標准輸入),計算輸入中的行號,將計算過的行號寫入標准輸出。 在輸出中,nl 命令根據您在命令行中指定的標志來計 算左邊的行。 輸入文本必須寫在邏輯頁中。每個邏輯頁有頭、主體和頁腳節(可以有空節)。 除非使用 -p 標志,nl 命令在每個邏輯頁開始的地方重新 設置行號。 可以單獨為頭、主體和頁腳節設置行計算標志(例如,頭和頁腳行可以被計算然而文本行不能)。

4使用實例:

實例一:用 nl 列出 issue3的內容

命令:

nl log2012.log

輸出:

peter@ubuntu:~/lp$ nl issue3

1 1 1

2 2 2

3 3 3

4 4 e

5 5 e

6 6 e

7 7 e

8 8 e:wq

 

說明:

文件中的空白行,nl 不會加上行號

實例二:用 nl 列出 issue3 的內容,空本行也加上行號

命令:

nl -b a log2012.log

輸出:

[root@localhost test]# nl -ba log2012.log 

     1  2012-01

     2  2012-02

     3

     4

     5  ======[root@localhost test]#

實例3:讓行號前面自動補上0,統一輸出格式

命令:

輸出:

[root@localhost test]# nl -ba -n rz log2014.log 

000001  2014-01

000002  2014-02

000003  2014-03

000004  2014-04

000005  2014-05

000006  2014-06

000007  2014-07

000008  2014-08

000009  2014-09

000010  2014-10

000011  2014-11

000012  2014-12

000013  =======

[root@localhost test]# nl -b a -n rz -w 3 log2014.log 

001     2014-01

002     2014-02

003     2014-03

004     2014-04

005     2014-05

006     2014-06

007     2014-07

008     2014-08

009     2014-09

010     2014-10

011     2014-11

012     2014-12

013     =======

說明:

nl -b a -n rz 命令行號默認為六位,要調整位數可以加上參數 -w 3 調整為3位。



find文件查找

Linux find命令在目錄結構中搜索文件,並執行指定的操作。Linuxfind命令提供了相當多的查找條件,功能很強大。由於find具有強大的功能,所 以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。即使系統中含有網絡文件系統( NFS)find命令在該文件系統中同樣有效,只你具有 相應的權限。 在運行一個非常消耗資源的find命令時,很多人都傾向於把它放在后台執行,因為遍歷一個大的文件系統可能會花費很長的時間(這里是指 30G字節以上的文件系統)

1命令格式:

find pathname -options [-print -exec -ok ...]

2命令功能:

用於在文件樹種查找文件,並作出相應的處理 

3命令參數:

pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。

-printfind命令將匹配的文件輸出到標准輸出。

-execfind命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' { } \;,注意{ }\;之間的空格。

-ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

4命令選項:

-name 按照文件名查找文件。

-perm 按照文件權限來查找文件。

-prune 使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那么-prune將被find命令忽略。

-user 按照文件屬主來查找文件。

-group 按照文件所屬的組來查找文件。

-mtime -n +n 按照文件的更改時間來查找文件, - n表示文件更改時間距現在n天以內,+ n表示文件更改時間距現在n天以前。find命令還有-atime-ctime 選項,但它們都和-m time選項。

-nogroup 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。

-nouser 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。

-newer file1 ! file2 查找更改時間比文件file1新但比文件file2舊的文件。

-type 查找某一類型的文件,諸如:

b - 塊設備文件。

d - 目錄。

c - 字符設備文件。

p - 管道文件。

l - 符號鏈接文件。

f - 普通文件。

-size n[c] 查找文件長度為n塊的文件,帶有c時表示文件長度以字節計。-depth:在查找文件時,首先查找當前目錄中的文件,然后再在其子目錄中查找。

-fstype:查找位於某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息。

-mount:在查找文件時不跨越文件系統mount點。

-follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。

-cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。

另外,下面三個的區別:

-amin n 查找系統中最后N分鍾訪問的文件

-atime n 查找系統中最后n*24小時訪問的文件

-cmin n 查找系統中最后N分鍾被改變文件狀態的文件

-ctime n 查找系統中最后n*24小時被改變文件狀態的文件

-mmin n 查找系統中最后N分鍾被改變文件數據的文件

-mtime n 查找系統中最后n*24小時被改變文件數據的文件

格式:find  [選項]  filename

功能:從指定的目錄開始,遞歸地搜索其子目錄,查找滿足條件的文件並對之采取相關的操作

常用選項說明

-name 字串  要查找的文件名,可以用通配符*、?、[]

-group 字串  文件所屬的用戶組名

-user  文件所屬的用戶名

find命令提供的查詢條件可以是一個用邏輯符andornot組成的復合條件

-a  邏輯與

-o  邏輯或

-!  邏輯非

【例】:將過去系統上24小時內更改過的(mtime)的文件列出

[root@dsetl tmp]# find -mtime 0

解釋:0是表示當前的時間,所以是從現在開始到24小時之前。

[root@dsetl tmp]# find -mtime 1

解釋:1是表示當前的時間,所以是從現在開始到1*24小時之前。

【例】:查找gdm用戶下面的所有文件f

[root@dsetl tmp]# find -user peter

【例】:搜索系統中不屬於任何人的文件

[root@dsetl ~]# find / -nouser


【例】:查找當前目錄下文件名含有font的文件

[root@dsetl etc]# find -name 'font*'

【例】:在根目錄下查找文件名為temp或是匹配install*的所有文件

[root@localhost rootfile]# find / -name 'temp' -o -name 'instal*'


/etc/rhgb/temp

/etc/yum/pluginconf.d/installonlyn.conf

/etc/vmware-tools/installer.sh

/software/tomcat5/webapps/docs/appdev/installation.html

/software/tomcat5/temp

/sbin/install-info

/sbin/installkernel

/usr/share/aclocal-1.9/install-sh.m4

/usr/share/icons/Bluecurve/96x96/mimetypes/install.png

/usr/share/icons/Bluecurve/24x24/mimetypes/install.png

/usr/share/icons/Bluecurve/16x16/mimetypes/install.png

/usr/share/icons/Bluecurve/48x48/mimetypes/install.png

/usr/share/aclocal-1.7/install-sh.m4

/usr/share/doc/cyrus-sasl-lib-2.1.22/install.html

/usr/share/doc/sgml-common-0.6.3/html/install-catalog.html

/usr/share/doc/m2crypto-0.16/demo/Zope27/install_dir

/usr/share/doc/m2crypto-0.16/demo/ZopeX3/install_dir

/usr/share/doc/libstdc++-devel-4.1.1/html/install.html

……

【例】:rootfile下查找不含Test*的文件

[root@localhost rootfile]# find ! -name 'Test*'

.

./.Test2.swp

./1q

./.Test.java.swp

./test2

./test2/file2.txt

./combine.txt

./file.txt

 

實例1查找指定時間內訪問過的文件 

命令:

  find -atime -2

輸出:

[root@peidachang ~]# find -atime -2

.

./logs/monitor

./.bashrc

./.bash_profile

./.bash_history

說明:

超找48小時內訪問過的文件 

實例2根據關鍵字查找 

命令:

peter@ubuntu:~/lp$ find -name '*.log'

輸出:

[root@localhost test]# find . -name "*.log" 

./log_link.log

./log2014.log

./test4/log3-2.log

./test4/log3-3.log

./test4/log3-1.log

./log2013.log

./log2012.log

./log.log

./test5/log5-2.log

./test5/log5-3.log

./test5/log.log

./test5/log5-1.log

./test5/test3/log3-2.log

./test5/test3/log3-3.log

./test5/test3/log3-1.log

./test3/log3-2.log

./test3/log3-3.log

./test3/log3-1.log

說明:

在當前目錄查找 以.log結尾的文件。 ". "代表當前目錄 

實例3按照目錄或文件的權限來查找文件

命令:

find /opt/soft/test/ -perm 777

輸出:

[root@localhost test]# find /opt/soft/test/ -perm 777

/opt/soft/test/log_link.log

/opt/soft/test/test4

/opt/soft/test/test5/test3

/opt/soft/test/test3

說明: 

查找/opt/soft/test/目錄下 權限為 777的文件

實例4按類型查找 

命令:

find . -type f -name "*.log"

輸出:

[root@localhost test]# find . -type f -name "*.log"

./log2014.log

./test4/log3-2.log

./test4/log3-3.log

./test4/log3-1.log

./log2013.log

./log2012.log

./log.log

./test5/log5-2.log

./test5/log5-3.log

./test5/log.log

./test5/log5-1.log

./test5/test3/log3-2.log

./test5/test3/log3-3.log

./test5/test3/log3-1.log

./test3/log3-2.log

./test3/log3-3.log

./test3/log3-1.log

[root@localhost test]#

說明:

查找當目錄,以.log結尾的普通文件 

實例5:查找當前所有目錄並排序

命令:

find . -type d | sort

輸出:

[root@localhost test]# find . -type d | sort

.

./scf

./scf/bin

./scf/doc

./scf/lib

./scf/service

./scf/service/deploy

./scf/service/deploy/info

./scf/service/deploy/product

./test3

./test4

./test5

./test5/test3

[root@localhost test]#

d表示目錄,sort進行排序

實例6:按大小查找文件

命令:

find . -size +1000c -print

輸出:

[root@localhost test]#  find . -size +1000c -print

.

./test4

./scf

./scf/lib

./scf/service

./scf/service/deploy

./scf/service/deploy/product

./scf/service/deploy/info

./scf/doc

./scf/bin

./log2012.log

./test5

./test5/test3

./test3

[root@localhost test]#

說明:

查找當前目錄大於1K的文件 

    1. find命令之exec

find是我們很常用的一個Linux命令,但是我們一般查找出來的並不僅僅是看看而已,還會有進一步的操作,這個時候exec的作用就顯現出來了。 

exec解釋:

-exec 參數后面跟的是command命令,它的終止是以;為結束標志的,所以這句命令后面的分號是不可缺少的,考慮到各個系統中分號會有不同的意義,所以前面加反斜杠。

{} 花括號代表前面find查找出來的文件名。

使用find時,只要把想要的操作寫在一個文件里,就可以用exec來配合find查找,很方便的在 有些操作系統中只允許-exec選項執行諸如l sls -l這樣的命令。大多數用戶使用這一選項是為了查找舊文件並刪除它們。建議在真正執行rm命令 刪除文件之前,最好先用ls命令看一下,確認它們是所要刪除的文件。 exec選項后面跟隨着所要執行的命令或腳本,然后是一對兒{ },一個空格和一 個\,最后是一個分號。為了使用exec選項,必須要同時使用print選項。如果驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文 件名

實例1ls -l命令放在find命令的-exec選項中

命令:

find . -type f -exec ls -l {} \;

輸出: 

[root@localhost test]# find . -type f -exec ls -l {} \; 

-rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log

-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log

-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-3.log

-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-1.log

-rw-r--r-- 1 root root 33 10-28 16:54 ./log2013.log

-rw-r--r-- 1 root root 302108 11-03 06:19 ./log2012.log

-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log

-rw-r--r-- 1 root root 37 10-28 17:07 ./log.txt

-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-2.log

-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-3.log

-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log

[root@localhost test]#

說明: 

上面的例子中,find命令匹配到了當前目錄下的所有普通文件,並在-exec選項中使用ls -l命令將它們列出。

find . -name '*.log' -exec ls -l {} \;

實例2在目錄中查找更改時間在n日以前的文件並刪除它們

命令:

find . -type f -mtime +14 -exec rm {} \; 

輸出:

[root@localhost test]# ll

總計 328

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root     33 10-28 16:54 log2013.log

-rw-r--r-- 1 root root    127 10-28 16:51 log2014.log

lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log

-rw-r--r-- 1 root root     25 10-28 17:02 log.log

-rw-r--r-- 1 root root     37 10-28 17:07 log.txt

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxrwx 2 root root   4096 10-28 14:47 test3

drwxrwxrwx 2 root root   4096 10-28 14:47 test4

[root@localhost test]# find . -type f -mtime +14 -exec rm {} \;

[root@localhost test]# ll

總計 312

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxrwx 2 root root   4096 11-12 19:32 test3

drwxrwxrwx 2 root root   4096 11-12 19:32 test4

[root@localhost test]# 

說明

shell中用任何方式刪除文件之前,應當先查看相應的文件,一定要小心!當使用諸如mvrm命令時,可以使用-exec選項的安全模式。它將在對每個匹配到的文件進行操作之前提示你。

實例3在目錄中查找更改時間在n日以前的文件並刪除它們在刪除之前先給出提示

命令:

find . -name "*.log" -mtime +5 -ok rm {} \;

輸出:

[root@localhost test]# ll

總計 312

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxrwx 2 root root   4096 11-12 19:32 test3

drwxrwxrwx 2 root root   4096 11-12 19:32 test4

[root@localhost test]# find . -name "*.log" -mtime +5 -ok rm {} \;

< rm ... ./log_link.log > ? y

< rm ... ./log2012.log > ? n

[root@localhost test]# ll

總計 312

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxrwx 2 root root   4096 11-12 19:32 test3

drwxrwxrwx 2 root root   4096 11-12 19:32 test4

[root@localhost test]#

說明

面的例子中, find命令在當前目錄中查找所有文件名以.log結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除之前先給出提示。 按y鍵刪除文件,按n鍵不刪除。

 

實例4-exec使用grep命令

命令:

find /etc -name "passwd*" -exec grep "root" {} \;

輸出:

[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;

root:x:0:0:root:/root:/bin/bash

root:x:0:0:root:/root:/bin/bash

[root@localhost test]#

說明:

任何形式的命令都可以在-exec選項中使用。 在面的例子中我們使用grep命令。find命令首先匹配所有文件名為“ passwd*”的文件,例如passwdpasswd.oldpasswd.bak,然后執行grep命令看看在這些文件中是否存在一個root用戶。

實例5查找文件移動到指定目錄  

命令:

find . -name '*.log' -exec mv {} .. \;

find . -name '*.log' -exec mv {} /home/peter/lp \;

輸出:

[root@localhost test]# ll

總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf

drwxrwxr-x 2 root root 4096 11-12 22:49 test3

drwxrwxr-x 2 root root 4096 11-12 19:32 test4

[root@localhost test]# cd test3/

[root@localhost test3]# ll

總計 304

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

[root@localhost test3]# find . -name '*.log' -exec mv {} .. \;

[root@localhost test3]# ll

總計 0[root@localhost test3]# cd ..

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-12 22:50 test3

drwxrwxr-x 2 root root   4096 11-12 19:32 test4

[root@localhost test]#

實例6exec選項執行cp命令  

命令:

find . -name "*.log" -exec cp {} test3 \;

find . -name '*.og' -exec cp {} /home/peter/lp \;

輸出:

[root@localhost test3]# ll

總計 0[root@localhost test3]# cd ..

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-12 22:50 test3

drwxrwxr-x 2 root root   4096 11-12 19:32 test4

[root@localhost test]# find . -name "*.log" -exec cp {} test3 \;

cp: “./test3/log2014.log” 及 “test3/log2014.log” 為同一文件

cp: “./test3/log2013.log” 及 “test3/log2013.log” 為同一文件

cp: “./test3/log2012.log” 及 “test3/log2012.log” 為同一文件

[root@localhost test]# cd test3

[root@localhost test3]# ll

總計 304

-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log

[root@localhost test3]#

    1. find命令之xargs

在 使用 find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命 令長度有限制,這樣在find命令運行幾分鍾之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在, 特別是與find命令一起使用。

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,並如此繼續下去。

在 有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進 程過多,系統性能下降的問題,因而效率不高; 而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批 取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。

使用實例:

實例1 查找系統中的每一個普通文件,然后使用xargs命令來測試它們分別屬於哪類文件

命令:

find . -type f -print | xargs file

輸出:

[root@localhost test]# ll

總計 312

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxrwx 2 root root   4096 11-12 19:32 test3

drwxrwxrwx 2 root root   4096 11-12 19:32 test4

[root@localhost test]# find . -type f -print | xargs file

./log2014.log: empty

./log2013.log: empty

./log2012.log: ASCII text

[root@localhost test]#

實例2:在整個系統中查找內存信息轉儲文件(core dump) ,然后把結果保存到/tmp/core.log 文件中

命令:

find / -name "core" -print | xargs echo "" >/tmp/core.log[root@localhost test]# find . -type f -print | xargs file

輸出:

[root@localhost test]# find / -name "core" -print | xargs echo "" >/tmp/core.log

[root@localhost test]# cd /tmp

[root@localhost tmp]# ll

總計 16

-rw-r--r-- 1 root root 1524 11-12 22:29 core.log

drwx------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766

drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815

drwx------ 2 root root 4096 11-03 07:11 vmware-root

實例3:在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,並收回相應的寫權限

命令:

find . -perm -7 -print | xargs chmod o-w

輸出:

[root@localhost test]# ll

總計 312

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxrwx 2 root root   4096 11-12 19:32 test3

drwxrwxrwx 2 root root   4096 11-12 19:32 test4

[root@localhost test]# find . -perm -7 -print | xargs chmod o-w

[root@localhost test]# ll

總計 312

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-12 19:32 test3

drwxrwxr-x 2 root root   4096 11-12 19:32 test4

[root@localhost test]#

說明:

執行命令后,文件夾scftest3test4的權限都發生改變

實例4:用grep命令在所有的普通文件中搜索hostname這個詞

命令:

find . -type f -print | xargs grep "hostname"

輸出:

[root@localhost test]#find . -type f -print | xargs grep 'hostname'

./log2013.log:hostnamebaidu=baidu.com

./log2013.log:hostnamesina=sina.com

./log2013.log:hostnames=true[root@localhost test]#

實例5:用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞

命令

find . -name \* -type f -print | xargs grep "hostnames"

輸出:

[root@peida test]# find . -type f -print | xargs grep 'hostnames'

./log2013.log:hostnamesina=sina.com

./log2013.log:hostnames=true[root@localhost test]#

說明:

注意,在上面的例子中, \用來取消find命令中的*shell中的特殊含義。

實例6使用xargs執行mv

命令:

find . -name "*.log" | xargs -i mv {} test4

輸出:

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-12 22:54 test3

drwxrwxr-x 2 root root   4096 11-12 19:32 test4

[root@localhost test]# cd test4/

[root@localhost test4]# ll

總計 0[root@localhost test4]# cd ..

[root@localhost test]# find . -name '*.og' | xargs -i mv {} /home/peter/lp

[root@localhost test]# ll

總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf

drwxrwxr-x 2 root root 4096 11-13 05:50 test3

drwxrwxr-x 2 root root 4096 11-13 05:50 test4

[root@localhost test]# cd test4/

[root@localhost test4]# ll

總計 304

-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log

[root@localhost test4]#

實例7find后執行xargs提示xargs: argument line too long解決方法:

命令:

find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

輸出:

[root@pd test4]#  find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

rm -f 

[root@pdtest4]#

說明:

-l1是一次處理一個-t是處理之前打印出命令

 

實例8使用-i參數默認的前面輸出用{}代替,-I參數可以指定其他代替字符,如例子中的[]

命令:

輸出:

[root@localhost test]# ll

總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf

drwxrwxr-x 2 root root 4096 11-13 05:50 test3

drwxrwxr-x 2 root root 4096 11-13 05:50 test4

[root@localhost test]# cd test4

[root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..

[root@localhost test4]# ll

總計 304

-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log

[root@localhost test4]# cd ..

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-13 05:50 test3

drwxrwxr-x 2 root root   4096 11-13 05:50 test4

[root@localhost test]#

說明:

使用-i參數默認的前面輸出用{}代替,-I參數可以指定其他代替字符,如例子中的[]

實例9xargs-p參數的使用 

命令:

find . -name "*.log" | xargs -p -i mv {} ..

輸出:

[root@localhost test3]# ll

總計 0

-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log

[root@localhost test3]# cd ..

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-13 06:06 test3

drwxrwxr-x 2 root root   4096 11-13 05:50 test4

[root@localhost test]# cd test3

[root@localhost test3]#  find . -name "*.log" | xargs -p -i mv {} ..

mv ./log2015.log .. ?...y

[root@localhost test3]# ll

總計 0[root@localhost test3]# cd ..

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

-rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-13 06:08 test3

drwxrwxr-x 2 root root   4096 11-13 05:50 test4

[root@localhost test]#

說明:

-p參數會提示讓你確認是否執行后面的命令,y執行,n不執行。

    1. find 命令的參數詳解

find一些常用參數的一些常用實例和一些具體用法和注意事項。

1使用name選項:

文 件名選項是find命令最常用的選項,要么單獨使用該選項,要么和其他選項一起使用。 可以使用某種文件名模式來匹配文件,記住要用引號將文件名模式引 起來。 不管當前路徑是什么,如果想要在自己的根目錄$HOME中查找文件名符合*.log的文件,使用~作為 'pathname'參數,波浪號~代 表了你的$HOME目錄。

find ~ -name "*.log" -print

想要在當前目錄及子目錄中查找所有的‘ *.log‘文件,可以用:

find . -name "*.log" -print

想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件,可以用:

find . -name "[A-Z]*" -print

想要在/etc目錄中查找文件名以host開頭的文件,可以用:

find /etc -name "host*" -print

想要查找$HOME目錄中的文件,可以用:

find ~ -name "*" -print find . -print

要想讓系統高負荷運行,就從根目錄開始查找所有的文件。

find / -name "*" -print

如果想在當前目錄查找文件名以一個個小寫字母開頭,最后是49加上.log結束的文件:

命令:

find . -name "[a-z]*[4-9].log" -print

輸出:

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

-rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-13 06:08 test3

drwxrwxr-x 2 root root   4096 11-13 05:50 test4

[root@localhost test]# find . -name "[a-z]*[4-9].log" -print

./log2014.log

./log2015.log

./test4/log2014.log

[root@localhost test]#

2perm選項:

按照文件權限模式用-perm選項,按文件權限模式來查找文件的話。最好使用八進制的權限表示法。

如在當前目錄下查找文件權限位為755的文件,即文件屬主可以讀、寫、執行,其他用戶可以讀、執行的文件,可以用:

[root@localhost test]# find . -perm 755 -print

.

./scf

./scf/lib

./scf/service

./scf/service/deploy

./scf/service/deploy/product

./scf/service/deploy/info

./scf/doc

./scf/bin

[root@localhost test]#

 

還有一種表達方法:在八進制數字前面要加一個橫杠-,表示都匹配,如-007就相當於777-005相當於555,

命令:

find . -perm -005

輸出:

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

-rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-13 06:08 test3

drwxrwxr-x 2 root root   4096 11-13 05:50 test4

[root@localhost test]# find . -perm -005

.

./test4

./scf

./scf/lib

./scf/service

./scf/service/deploy

./scf/service/deploy/product

./scf/service/deploy/info

./scf/doc

./scf/bin

./test3

[root@localhost test]#

3忽略某個目錄:

如 果在查找文件時希望忽略某個目錄,因為你知道那個目錄中沒有你所要查找的文件,那么可以使用-prune選項來指出需要忽略的目錄。在使用-prune選 項時要當心,因為如果你同時使用了-depth選項,那么-prune選項就會被find命令忽略。如果希望在test目錄下查找文件,但不希望在 test/test3目錄下查找,可以用:

命令:

find test -path "test/test3" -prune -o -print

輸出:

[root@localhost soft]# find test -path "test/test3" -prune -o -print

test

test/log2014.log

test/log2015.log

test/test4

test/test4/log2014.log

test/test4/log2013.log

test/test4/log2012.log

test/scf

test/scf/lib

test/scf/service

test/scf/service/deploy

test/scf/service/deploy/product

test/scf/service/deploy/info

test/scf/doc

test/scf/bin

test/log2013.log

test/log2012.log

[root@localhost soft]#

4使用find查找文件的時候怎么避開某個文件目錄:

實例1lp 目錄下查找不在lp1 子目錄之內的所有文件

命令:

find lp -path 'lp/lp1' -o -print

輸出:

[root@localhost soft]# find lp

lp

lp/ test.Log

lp/issue2

lp/test2.log

lp/lp1

lp/lp1/lp

lp/log2013.log

lp/manpath.config

lp/log2123.log

lp/!

lp/lp2312.log

lp/issue3

lp/lp23323.log

lp/test.log

lp/issue1

lp/lp2012.log

lp/lp123.log

lp/lp

lp/lp201233.og

lp/ test.Log 

lp/issue4

[root@localhost soft]# find lp -path 'lp/lp1' -prune -o -print

lp

lp/ test.Log

lp/issue2

lp/test2.log

lp/log2013.log

lp/manpath.config

lp/log2123.log

lp/!

lp/lp2312.log

lp/issue3

lp/lp23323.log

lp/test.log

lp/issue1

lp/lp2012.log

lp/lp123.log

lp/lp

lp/lp201233.og

lp/ test.Log 

lp/issue4

說明:

find [-path ..] [expression]

在路徑列表的后面的是表達式

-path "test" -prune -o -print -path "test" -a -prune -o -print 的簡寫表達式按順序求值, -a -o 都是短路求值,與 shell && || 類似如果

-path "test" 為 真,則求值 -prune , -prune 返回真,與邏輯表達式為真;否則不求值 -prune,與邏輯表達式為假。如 果 -path "test" -a -prune 為假,則求值 -print -print返回真,或邏輯表達式為真;否則不求值 -print, 或邏輯表達式為真。

這個表達式組合特例可以用偽碼寫為:

if -path "test" then

-prune

else

-print

實例2:避開多個文件夾:

命令:

find test \( -path test/test4 -o -path test/test3 \) -prune -o -print

輸出:

[root@localhost soft]# find test \( -path test/test4 -o -path test/test3 \) -prune -o -print

test

test/log2014.log

test/log2015.log

test/scf

test/scf/lib

test/scf/service

test/scf/service/deploy

test/scf/service/deploy/product

test/scf/service/deploy/info

test/scf/doc

test/scf/bin

test/log2013.log

test/log2012.log

[root@localhost soft]#

 

說明:

圓括號表示表達式的結合。 \ 表示引用,即指示 shell 不對后面的字符作特殊解釋,而留給 find 命令去解釋其意義。

實例3:查找某一確定文件,-name等選項加在-o 之后

命令:

find test \(-path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print

輸出:

[root@localhost soft]# find test \( -path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print

test/log2014.log

test/log2015.log

test/log2013.log

test/log2012.log

[root@localhost soft]#

5使用usernouser選項:

按文件屬主查找文件:

實例1:在$HOME目錄中查找文件屬主為peida的文件 

命令:

find ~ -user peida -print

實例2:在/etc目錄下查找文件屬主為peida的文件:

命令:

find /home/peter/lp -user peter -print

說明:

實例3:為了查找屬主帳戶已經被刪除的文件,可以使用-nouser選項。在/home目錄下查找所有的這類文件

命令:

find /home -nouser -print

說明:

這樣就能夠找到那些屬主在/etc/passwd文件中沒有有效帳戶的文件。在使用-nouser選項時,不必給出用戶名; find命令能夠為你完成相應的工作。

6使用groupnogroup選項:

就像usernouser選項一樣,針對文件所屬於的用戶組, find命令也具有同樣的選項,為了在/apps目錄下查找屬於gem用戶組的文件,可以用:

find /home/peter/lp -group peter -print

要查找沒有有效所屬用戶組的所有文件,可以使用nogroup選項。下面的find命令從文件系統的根目錄處查找這樣的文件:

find / -nogroup-print

7按照更改時間或訪問時間等查找文件:

如果希望按照更改時間來查找文件,可以使用mtime,atimectime選項。如果系統突然沒有可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用mtime選項來查找這樣的文件。

用減號-來限定更改時間在距今n日以內的文件,而用加號+來限定更改時間在距今n日以前的文件。

希望在系統根目錄下查找更改時間在5日以內的文件,可以用:

find / -mtime -5 -print

為了在/var/adm目錄下查找更改時間在3日以前的文件,可以用:

find /var/adm -mtime +3 -print

8查找比某個文件新或舊的文件:

如果希望查找更改時間比某個文件新但比另一個文件舊的所有文件,可以使用-newer選項。

它的一般形式為:

newest_file_name ! oldest_file_name

其中,!是邏輯非符號。

實例1:查找更改時間比文件log2012.log新但比文件log2017.log舊的文件

命令:

find -newer log2012.log ! -newer log2017.log

輸出:

[root@localhost test]# ll

總計 316

-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

-rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

-rw-r--r-- 1 root root      0 11-16 14:41 log2016.log

-rw-r--r-- 1 root root      0 11-16 14:43 log2017.log

drwxr-xr-x 6 root root   4096 10-27 01:58 scf

drwxrwxr-x 2 root root   4096 11-13 06:08 test3

drwxrwxr-x 2 root root   4096 11-13 05:50 test4

[root@localhost test]# find -newer log2012.log ! -newer log2017.log

.

./log2015.log

./log2017.log

./log2016.log

./test3

[root@localhost test]#

實例2:查找更改時間在比log2012.log文件新的文件(更改時間更靠后)

命令:

find . -newer log2012.log -print

輸出:

[root@localhost test]# find -newer log2012.log

.

./log2015.log

./log2017.log

./log2016.log

./test3

[root@localhost test]#

9使用type選項:

實例1:在/etc目錄下查找所有的目錄

命令:

find /etc -type d -print

實例2:在當前目錄下查找除目錄以外的所有類型的文件

命令:

find . ! -type d -print

實例3:在/etc目錄下查找所有的符號鏈接文件

命令:

find /etc -type l -print

10使用size選項:

可以按照文件長度來查找文件,這里所指的文件長度既可以用塊(block)來計量,也可以用字節來計量。以字節計量文件長度的表達形式為N c;以塊計量文件長度只用數字表示即可。

在按照文件長度查找文件時,一般使用這種以字節表示的文件長度,在查看文件系統的大小,因為這時使用塊來計量更容易轉換。

實例1:在當前目錄下查找文件長度大於1 M字節的文件

命令:

find . -size +1000000c -print

實例2:在/home/apache目錄下查找文件長度恰好為100字節的文件:

命令:

find /home/apache -size 100c -print

實例3:在當前目錄下查找長度超過10塊的文件(一塊等於512字節)

命令:

find . -size +10 -print

11使用depth選項:

在使用find命令時,可能希望先匹配所有的文件,再在子目錄中查找。使用depth選項就可以使find命令這樣做。這樣做的一個原因就是,當在使用find命令向磁帶上備份文件系統時,希望首先備份所有的文件,其次再備份子目錄中的文件。

實例1find命令從文件系統的根目錄開始,查找一個名為CON.FILE的文件。

命令:

find / -name "CON.FILE" -depth -print

說明:

它將首先匹配所有的文件然后再進入子目錄中查找

12使用mount選項:

  在當前的文件系統中查找文件(不進入其他文件系統),可以使用find命令的mount選項。

實例1:從當前目錄開始查找位於本文件系統中文件名以XC結尾的文件

命令:

find . -name "*.XC" -mount -print

 

    1. wc 文字統計命令

格式:wc  [選項]  filename

功能:統計文件的字節數、字數、行數

常用選項說明:

-c  統計字節數

-l  統計行數

-w  統計字數

4使用實例:

實例1:查看文件的字節數、字數、行數

命令:

wc test.txt

輸出:

[root@localhost test]# cat test.txt 

hnlinux

peida.cnblogs.com

ubuntu

ubuntu linux

redhat

Redhat

linuxmint

[root@localhost test]# wc test.txt

 7  8 70 test.txt

[root@localhost test]# wc -l test.txt --統計行數

7 test.txt

[root@localhost test]# wc -c test.txt --統計字節數

70 test.txt

[root@localhost test]# wc -w test.txt --統計字數

8 test.txt

[root@localhost test]# wc -m test.txt 

70 test.txt

[root@localhost test]# wc -L test.txt 

17 test.txt

說明:

7 8 70 test.txt

行數 單詞數 字節數 文件名

實例2:用wc命令怎么做到只打印統計數字不打印文件名

命令:

輸出:

peter@ubuntu:~/lp$ wc -l issue2

6 issue2

[root@localhost test]#cat issue2 | wc -l

7[root@localhost test]# 6

說明:

使用管道線,這在編寫shell腳本時特別有用。

實例3用來統計當前目錄下的文件數

命令:

ls -l | wc -l

輸出:

[root@localhost test]# cd test6

[root@localhost test6]# ll

總計 604

---xr--r-- 1 root mail  302108 11-30 08:39 linklog.log

---xr--r-- 1 mail users 302108 11-30 08:39 log2012.log

-rw-r--r-- 1 mail users     61 11-30 08:39 log2013.log

-rw-r--r-- 1 root mail       0 11-30 08:39 log2014.log

-rw-r--r-- 1 root mail       0 11-30 08:39 log2015.log

-rw-r--r-- 1 root mail       0 11-30 08:39 log2016.log

-rw-r--r-- 1 root mail       0 11-30 08:39 log2017.log

[root@localhost test6]# ls -l | wc -l

8

[root@localhost test6]#

說明:

數量中包含當前目錄

    1. which命令

們經常在linux要查找某個文件,但不知道放在哪里了,可以使用下面的一些命令來搜索 
which
查看可執行文件的位置
whereis
查看文件的位置 
locate
配合數據庫查看文件位置
find
實際搜尋硬盤查詢文件名稱

which命令的作用是,在PATH變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果。也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。

1命令格式:

which 可執行文件名稱 

2命令功能:

which指令會PATH變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果

3命令參數:

-n 指定文件名長度,指定的長度必須大於或等於所有文件中最長的文件名。

-p -n參數相同,但此處的包括了文件的路徑。

-w 指定輸出時欄位的寬度。

-V 顯示版本信息

4使用實例:

實例1:查找文件、顯示命令路徑

命令:

which lsmod

輸出:

[root@localhost ~]# which pwd

/bin/pwd

[root@localhost ~]#  which adduser

/usr/sbin/adduser

[root@localhost ~]#

說明:

which 是根據使用者所配置的 PATH 變量內的目錄去搜尋可運行檔的!所以,不同的 PATH 配置內容所找到的命令當然不一樣的!

實例2:用 which 去找出 which

命令:


輸出:

[root@localhost ~]# which which

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

     /usr/bin/which

[root@localhost ~]#

說明:

竟然會有兩個 which ,其中一個是 alias 這就是所謂的『命令別名』,意思是輸入 which 會等於后面接的那串命令!

實例3:找出 cd 這個命令

命令:

which cd

輸出:

 

       說明:

cd 這個常用的命令竟然找不到啊!為什么呢?這是因為 cd bash 內建的命令! 但是 which 默認是找 PATH 內所規范的目錄,所以當然一定找不到的!

    1. whereis 命令

whereis命令只能用於程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。

find相比,whereis查找的速度非常快,這是因為linux系統會將 系統內的所有文件都記錄在一個數據庫文件中,當使用whereis和下面即 將介紹的locate時,會從數據庫中查找數據,而不是像find命令那樣,通 過遍歷硬盤來查找,效率自然會很高。

但是該數據庫文件並不是實時更新,默認情況下時一星期更新一次,因此,我們在用whereislocate 查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因為數據庫文件沒有被更新。

1命令格式:

whereis [-bmsu] [BMS 目錄名 -f ] 文件名

2命令功能:

whereis命令是定位可執行文件、源代碼文件、幫助文件在文件系統中的位置。這些文件的屬性應屬於原始代碼,二進制文件,或是幫助文件。whereis 程序還具有搜索源代碼、指定備用搜索路徑和搜索不尋常項的能力。

3命令參數:

-b 定位可執行文件。

-m 定位幫助文件。

-s 定位源代碼文件。

-u 搜索默認路徑下除可執行文件、源代碼文件、幫助文件以外的其它文件。

-B 指定搜索可執行文件的路徑。

-M 指定搜索幫助文件的路徑。

-S 指定搜索源代碼文件的路徑。

4使用實例:

實例1:將和**文件相關的文件都查找出來

命令:

whereis svn

輸出:

[root@localhost ~]# whereis tomcat

tomcat:

[root@localhost ~]# whereis svn

svn: /usr/bin/svn /usr/local/svn /usr/share/man/man1/svn.1.gz

說明:

tomcat沒安裝,找不出來,svn安裝找出了很多相關文件

實例2只將二進制文件 查找出來 

命令:

whereis -b svn

輸出: 

[root@localhost ~]# whereis -b svn

svn: /usr/bin/svn /usr/local/svn

[root@localhost ~]# whereis -m svn

svn: /usr/share/man/man1/svn.1.gz

[root@localhost ~]# whereis -s svn

svn:

[root@localhost ~]#

說明:

whereis -m svn查出說明文檔路徑,whereis -s svn source源文件

    1. locate 命令

locate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案。其方法是先建立一個包括系統內所有檔案名稱及路徑的數據庫,之后當尋找時就只需查詢這個數據庫,而不必實際深入檔案系統之中了。在一般的 distribution 之中,數據庫的建立都被放在 crontab 中自動執行。

1命令格式:

Locate [選擇參數] [樣式]

2命令功能:

locate 命令可以在搜尋數據庫時快速找到檔案,數據庫由updatedb程序來更新,updatedb是由cron daemon周期性建立的,locate命令 在搜尋數據庫時比由整個由硬盤資料來搜尋資料來得快,但較差勁的是locate所找到的檔案若是最近才建立或 剛更名的,可能會找不到,在內定值 中,updatedb每天會跑一次,可以由修改crontab來更新設定值。(etc/crontab)

locate 指定用在搜尋符合條件的檔案,它會去儲存檔案與目錄名稱的數據庫內,尋找合乎范本樣式條件的檔案或目錄錄,可以使用特殊字元(如”*” 或”?”等)來指 定范本樣式,如指定范本為kcpa*ner, locate會找出所有起始字串為kcpa且結尾為ner的檔案或目錄,如名稱為kcpartner若目錄 錄名稱為kcpa_ner則會列出該目錄下包括 子目錄在內的所有檔案。

locate 指令和find找尋檔案的功能類似,但locate是透過update程序將硬盤中的所有檔案和目錄資料先建立一個索引數據庫,在 執行loacte時直 接找該索引,查詢速度會較快,索引數據庫一般是由操作系統管理,但也可以直接下達update強迫系統立即修改索引數據庫。

3命令參數:

-e 將排除在尋找的范圍之外。

-1  如果 是 1.則啟動安全模式。在安全模式下,使用者不會看到權限無法看到 的檔案。這會始速度減慢,因為 locate 必須至實際的檔案系統中取得檔案的 權限資料。

-f 將特定的檔案系統排除在外,例如我們沒有到理要把 proc 檔案系統中的檔案 放在資料庫中。

-q  安靜模式,不會顯示任何錯誤訊息。

-n 至多顯示 n個輸出。

-r 使用正規運算式 做尋找的條件。

-o 指定資料庫存的名稱。

-d 指定資料庫的路徑

-h 顯示輔助訊息

-V 顯示程式的版本訊息

4使用實例:

實例1:查找和pwd相關的所有文件

命令:

locate pwd

輸出:

peida-VirtualBox ~ # locate pwd

/bin/pwd

/etc/.pwd.lock

/sbin/unix_chkpwd

/usr/bin/pwdx

/usr/include/pwd.h

/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.py

/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.pyc

/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.py

/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.pyc

/usr/lib/syslinux/pwd.c32

/usr/share/help/C/empathy/irc-join-pwd.page

/usr/share/help/ca/empathy/irc-join-pwd.page

/usr/share/help/cs/empathy/irc-join-pwd.page

/usr/share/help/de/empathy/irc-join-pwd.page

/usr/share/help/el/empathy/irc-join-pwd.page

實例2 搜索etc目錄下所有以sh開頭的文件 

命令:

locate /etc/sh

輸出:

peida-VirtualBox ~ # locate /etc/sh

/etc/shadowl

/etc/shadow-

/etc/shells

peida-VirtualBox ~ #

實例3:搜索etc目錄下,所有以m開頭的文件

命令:

locate /etc/m

輸出:

peida-VirtualBox ~ # locate /etc/m

/etc/magic

/etc/magic.mime

/etc/mailcap

/etc/mailcap.order

/etc/manpath.config

/etc/mate-settings-daemon

grep 命令

Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。

grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板后的所有字符串被看作文件名。搜索的結果被送到標准輸出,不影響原文件內容。

grep可用於shell腳本,因為grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。

1命令格式:

grep [option] pattern file

2命令功能:

用於過濾/搜索的特定字符。可使用正則表達式能多種命令配合使用,使用上十分靈活

3命令參數:

-a --text #不要忽略二進制的數據。

-A<顯示行數> --after-context=<顯示行數> #除了顯示符合范本樣式的那一列之外,並顯示該行之后的內容。

-b --byte-offset #在顯示符合樣式的那一行之前,標示出該行第一個字符的編號。

-B<顯示行數>   --before-context=<顯示行數>   #除了顯示符合樣式的那一行之外,並顯示該行之前的內容。   

-c --count #計算符合樣式的列數。

-C<顯示行數> --context=<顯示行數>-<顯示行數> #除了顯示符合樣式的那一行之外,並顯示該行之前后的內容。

-d <動作> --directories=<動作> #當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息並停止動作。

-e<范本樣式> --regexp=<范本樣式> #指定字符串做為查找文件內容的樣式。

-E --extended-regexp #將樣式為延伸的普通表示法來使用。

-f<規則文件> --file=<規則文件> #指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式為每行一個規則樣式。

-F --fixed-regexp #將樣式視為固定字符串的列表。

-G --basic-regexp #將樣式視為普通的表示法來使用。

-h --no-filename #在顯示符合樣式的那一行之前,不標示該行所屬的文件名稱。

-H --with-filename #在顯示符合樣式的那一行之前,表示該行所屬的文件名稱。

-i --ignore-case #忽略字符大小寫的差別。

-l --file-with-matches #列出文件內容符合指定的樣式的文件名稱。

-L --files-without-match #列出文件內容不符合指定的樣式的文件名稱。

-n --line-number #在顯示符合樣式的那一行之前,標示出該行的列數編號。

-q --quiet--silent #不顯示任何信息。

-r --recursive #此參數的效果和指定“-d recurse”參數相同。

-s --no-messages #不顯示錯誤信息。

-v --revert-match #顯示不包含匹配文本的所有行。

-V --version #顯示版本信息。

 

-x --line-regexp #只顯示全列符合的列。

-y #此參數的效果和指定“-i”參數相同。

 

4.規則表達式:

grep的規則表達式:

^ #錨定行的開始 如:'^grep'匹配所有以grep開頭的行。

$ #錨定行的結束 如:'grep$'匹配所有以grep結尾的行。

. #匹配一個非換行符的字符 如:'gr.p'匹配gr后接一個任意字符,然后是p

* #匹配零個或多個先前字符 如:'*grep'匹配所有一個或多個空格后緊跟grep的行。

.* #一起用代表任意字符。

[] #匹配一個指定范圍內的字符,如'[Gg]rep'匹配Grepgrep

[^] #匹配一個不在指定范圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-RT-Z的一個字母開頭,緊跟rep的行。

\(..\) #標記匹配字符,如'\(love\)'love被標記為1

\< #錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。

\> #錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。

x\{m\} #重復字符xm次,如:'0\{5\}'匹配包含5o的行。

x\{m,\}  #重復字符x,至少m次,如:'o\{5,\}'匹配至少有5o的行。

x\{m,n\}  #重復字符x,至少m次,不多於n次,如:'o\{5,10\}'匹配5--10o的行。

\w #匹配文字和數字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零個或多個文字或數字字符,然后是p

\W #\w的反置形式,匹配一個或多個非單詞字符,如點號句號等。

\b #單詞鎖定符,如: '\bgrep\b'只匹配grep

POSIX字符:

為 了在不同國家的字符編碼中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符 類,如[:alnum:][A-Za-z0-9]的另一個寫法。要把它們放到[]號內才能成為正則表達式,如[A- Za-z0-9][[:alnum:]]。在linux下的grepfgrep外,都支持POSIX的字符類。

[:alnum:] #文字數字字符

[:alpha:] #文字字符

[:digit:] #數字字符

[:graph:] #非空字符(非空格、控制字符)

[:lower:] #小寫字符

[:cntrl:] #控制字符

[:print:] #非空字符(包括空格)

[:punct:] #標點符號

[:space:] #所有空白字符(新行,空格,制表符)

[:upper:] #大寫字符

[:xdigit:] #十六進制數字(0-9a-fA-F

5使用實例:

實例1查找指定進程

命令:

ps -ef|grep svn

輸出:

[root@localhost ~]# ps -ef|grep svn

root 4943        0  Dec05 ?   00:00:00 svnserve -d -r /opt/svndata/grape/

root 16867 16838  0 19:53 pts/0    00:00:00 grep svn

[root@localhost ~]#

說明:

第一條記錄是查找出的進程;第二條結果是grep進程本身,並非真正要找的進程

實例2:查找指定進程個數

命令:

ps -ef|grep svn -c

ps -ef|grep -c svn

輸出:

[root@localhost ~]# ps -ef|grep svn -c

2

[root@localhost ~]# ps -ef|grep -c svn 

2

[root@localhost ~]#

說明:

實例3從文件中讀取關鍵詞進行搜索

命令:

cat test.txt | grep -f test2.txt

輸出:

[root@localhost test]# cat test.txt 

hnlinux

peida.cnblogs.com

ubuntu

ubuntu linux

redhat

Redhat

linuxmint

[root@localhost test]# cat test2.txt 

linux

Redhat

[root@localhost test]# cat test.txt | grep -f test2.txt

hnlinux

ubuntu linux

Redhat

linuxmint

[root@localhost test]#

說明:

輸出test.txt文件中含有從test2.txt文件中讀取出的關鍵詞的內容行

實例3從文件中讀取關鍵詞進行搜索 且顯示行號

命令:

cat test.txt | grep -nf test2.txt

輸出:

[root@localhost test]# cat test.txt 

hnlinux

peida.cnblogs.com

ubuntu

ubuntu linux

redhat

Redhat

linuxmint

[root@localhost test]# cat test2.txt 

linux

Redhat

[root@localhost test]# cat test.txt | grep -nf test2.txt

1:hnlinux

4:ubuntu linux

6:Redhat

7:linuxmint

[root@localhost test]#

說明:

輸出test.txt文件中含有從test2.txt文件中讀取出的關鍵詞的內容行,並顯示每一行的行號

實例5:從文件中查找關鍵詞

命令:

grep 'linux' test.txt

輸出:

[root@localhost test]# grep 'linux' test.txt 

hnlinux

ubuntu linux

linuxmintlp.

[root@localhost test]# grep -n 'linux' test.txt 

1:hnlinux

4:ubuntu linux

7:linuxmint

[root@localhost test]#

說明:

實例6:從多個文件中查找關鍵詞

命令:

grep 'linux' test.txt test2.txt

輸出:

[root@localhost test]# grep -n 'linux' test.txt test2.txt 

test.txt:1:hnlinux

test.txt:4:ubuntu linux

test.txt:7:linuxmint

test2.txt:1:linux

[root@localhost test]# grep 'linux' test.txt test2.txt 

test.txt:hnlinux

test.txt:ubuntu linux

test.txt:linuxmint

test2.txt:linux

[root@localhost test]#

說明:

多文件時,輸出查詢到的信息內容行時,會把文件的命名在行最前面輸出並且加上":"作為標示符

實例7grep不顯示本身進程

命令:

ps aux|grep \[s]sh

ps aux | grep ssh | grep -v "grep"

輸出:

[root@localhost test]# ps aux|grep ssh

root   2720  0.0  0.0  62656  1212 ?      Ss   Nov02   0:00 /usr/sbin/sshd

root  16834  0.0  0.0  88088  3288 ?      Ss   19:53   0:00 sshd: root@pts/0 

root  16901  0.0  0.0  61180   764 pts/0  S+   20:31   0:00 grep ssh

[root@localhost test]# ps aux|grep \[s]sh]

[root@localhost test]# ps aux|grep \[s]sh

root   2720  0.0  0.0  62656  1212 ?      Ss   Nov02   0:00ge /usr/sbin/sshd

root  16834  0.0  0.0  88088  3288 ?      Ss   19:53   0:00 sshd: root@pts/0 

[root@localhost test]# ps aux | grep ssh | grep -v "grep"

root   2720  0.0  0.0  62656  1212 ?      Ss   Nov02   0:00 /usr/sbin/sshd

root  16834  0.0  0.0  88088  3288 ?      Ss   19:53   0:00 sshd: root@pts/0

說明:

實例8:找出已u開頭的行內容

命令:

cat test.txt |grep ^u

輸出:

[root@localhost test]# cat test.txt |grep ^u

ubuntu

ubuntu linux

[root@localhost test]#

說明:

實例9:輸出非u開頭的行內容

命令:

cat test.txt |grep ^[^u]

輸出:

[root@localhost test]# cat test.txt |grep ^[^u]

hnlinux

peida.cnblogs.com

redhat

Redhat

linuxmint

[root@localhost test]#

說明:

實例10:輸出以hat結尾的行內容

命令:

cat test.txt |grep hat$

輸出:

[root@localhost test]# cat test.txt |grep hat$

redhat

Redhat

[root@localhost test]#

說明:

實例11

命令:

輸出:

[root@localhost test]# ifconfig eth0|grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"

          inet addr:192.168.120.204  Bcast:192.168.120.255  Mask:255.255.255.0

[root@localhost test]# ifconfig eth0|grep -E "([0-9]{1,3}\.){3}[0-9]"

          inet addr:192.168.120.204  Bcast:192.168.120.255  Mask:255.255.255.0

[root@localhost test]#

說明:

實例12:顯示包含ed或者at字符的內容行

命令:

cat test.txt |grep -E "ed|at"

輸出:

[root@localhost test]# cat test.txt |grep -E "peida|com"

peida.cnblogs.com

[root@localhost test]# cat test.txt |grep -E "ed|at"

redhat

Redhat

[root@localhost test]#

說明:

實例13:顯示當前目錄下面以.txt 結尾的文件中的所有包含每個字符串至少有7個連續小寫字符的字符串的行

命令:

grep '[a-z]\{7\}' *.txt

輸出:

[root@localhost test]# grep '[a-z]\{7\}' *.txt

test.txt:hnlinux

test.txt:peida.cnblogs.com

test.txt:linuxmint

[root@localhost test]#

說明:




復制、移動和刪除文件或文件夾

touch 創建文件

linuxtouch命令不常用,一般在使用make的時候可能會用到,用來修改文件時間戳,或者新建一個不存在的文件

1命令格式:

touch [選項]... 文件...

2命令參數:

-a --time=atime--time=access--time=use 只更改存取時間。

-c --no-create 不建立任何文檔。

-d 使用指定的日期時間,而非現在的時間。

-f 此參數將忽略不予處理,僅負責解決BSD版本touch指令的兼容性問題。

-m --time=mtime--time=modify 只更改變動時間。

-r 把指定文檔或目錄的日期時間,統統設成和參考文檔或目錄的日期時間相同。

-t 使用指定的日期時間,而非現在的時間。

3命令功能:

touch命令參數可更改文檔或目錄的日期時間,包括存取時間和更改時間。 

4使用范例:

實例一:創建不存在的文件

命令:

touch log2012.log log2013.log

輸出:

[root@localhost test]# touch log2012.log log2013.log

[root@localhost test]# ll

-rw-r--r-- 1 root root    0 10-28 16:01 log2012.log

-rw-r--r-- 1 root root    0 10-28 16:01 log2013.log

如果log2014.log不存在,則不創建文件

[root@localhost test]# touch -c log2014.log

[root@localhost test]# ll

-rw-r--r-- 1 root root    0 10-28 16:01 log2012.log

-rw-r--r-- 1 root root    0 10-28 16:01 log2013.log

實例二:更新log.log的時間和log2012.log時間戳相同

命令:

touch -r log.log log2012.log

輸出:

[root@localhost test]# ll

-rw-r--r-- 1 root root    0 10-28 16:01 log2012.log

-rw-r--r-- 1 root root    0 10-28 16:01 log2013.log

-rw-r--r-- 1 root root    0 10-28 14:48 log.log

[root@localhost test]# touch -r log.log log2012.log 

[root@localhost test]# ll

-rw-r--r-- 1 root root    0 10-28 14:48 log2012.log

-rw-r--r-- 1 root root    0 10-28 16:01 log2013.log

-rw-r--r-- 1 root root    0 10-28 14:48 log.log

實例三:設定文件的時間戳

命令:

touch -t 201211142234.50 log.log

輸出:

[root@localhost test]# ll

-rw-r--r-- 1 root root    0 10-28 14:48 log2012.log

-rw-r--r-- 1 root root    0 10-28 16:01 log2013.log

-rw-r--r-- 1 root root    0 10-28 14:48 log.log

[root@localhost test]# touch -t 201203122243.50 log.log

[root@localhost test]# ls --full-time log.log

-rw-rw-r-- 1 peter peter 0 2012-03-12 22:43:50.000000000 +0800 log.log

說明:

-t time 使用指定的時間值 time 作為指定文件相應時間戳記的新值.此處的 time規定為如下形式的十進制數:

[[CC]YY]MMDDhhmm[.SS]

這 里,CC為年數中的前兩位,即”世紀數”;YY為年數的后兩位,即某世紀中的年數.如果不給出CC的值,則touch 將把年數CCYY限定在 1969--2068之內.MM為月數,DD為天將把年數CCYY限定在1969--2068之內.MM為月數,DD為天數,hh 為小時數(幾 點)mm為分鍾數,SS為秒數.此處秒的設定范圍是0--61,這樣可以處理閏秒.這些數字組成的時間是環境變量TZ指定的時區中的一個時 間.由於系 統的限制,早於197011日的時間是錯誤的。


Mkdir命令:

格式:mkdir [-mp] 目錄

 

功能:建立新目錄

常用選項說明:

-p  直接建立多個遞歸目錄

-m  設置文件的權限,直接設置,不需要管默認權限

【例】: [root@dsetl etc]# cd /tmp

[root@dsetl tmp]# mkdir lp建立目錄lp

[root@dsetl tmp]# mkdir -p test1/test2/test3 --直接建立多個遞歸目錄

實例3創建權限為777的目錄

命令:

mkdir -m 777 test3

輸出:

[root@localhost test]# mkdir -m 777 test3

[root@localhost test]# ll

總計 12drwxr-xr-x 2 root root 4096 10-25 17:42 test1

drwxr-xr-x 3 root root 4096 10-25 17:44 test2

drwxrwxrwx 2 root root 4096 10-25 17:46 test3

[root@localhost test]#

說明:

test3的權限為rwxrwxrwx

實例4:創建新目錄都顯示信息

命令:

mkdir -v test4

輸出:

[root@localhost test]# mkdir -v test4

mkdir: 已創建目錄 test4

[root@localhost test]# mkdir -vp test5/test5-1

mkdir: 已創建目錄 test5

mkdir: 已創建目錄 test5/test5-1”

[root@localhost test]#

實例五:一個命令創建項目的目錄結構

參考:http://www.ibm.com/developerworks/cn/aix/library/au-badunixhabits.html

命令:

mkdir -vp scf/{lib/,bin/,doc/{info,product},logs/{info,product},service/deploy/{info,product}}

輸出:

[root@localhost test]#mkdir -vp scf/{lib/,bin/,doc/{info,product},logs/{info,product},service/deploy/{info,product}}



mkdir: 已創建目錄 scf

mkdir: 已創建目錄 scf/lib

mkdir: 已創建目錄 scf/bin

mkdir: 已創建目錄 scf/doc

mkdir: 已創建目錄 scf/doc/info

mkdir: 已創建目錄 scf/doc/product

mkdir: 已創建目錄 scf/logs

mkdir: 已創建目錄 scf/logs/info

mkdir: 已創建目錄 scf/logs/product

mkdir: 已創建目錄 scf/service

mkdir: 已創建目錄 scf/service/deploy

mkdir: 已創建目錄 scf/service/deploy/info

mkdir: 已創建目錄 scf/service/deploy/product

[root@localhost test]# tree scf/

scf/

|-- bin

|-- doc

|   |-- info

|   `-- product

|-- lib

|-- logs

|   |-- info

|   `-- product

`-- service

      `-- deploy

        |-- info

         `-- product

12 directories, 0 files

[root@localhost test]#

peter@ubuntu:~/lp$ mkdir -vp skp2/doc/{info,product}





rmdir命令:

格式:rmdir [-p] 目錄

 

功能:刪除目錄

常用選項說明:-p  與上層空目錄也一並刪除

注意:空目錄的含義為不能有其他目錄與文件

[root@dsetl test2]# rmdir test3 –只刪除test3

[root@dsetl test1]# rmdir -p test1/test2/test3 –刪除目錄及其子目錄


4命令實例:

實例一:rmdir 不能刪除非空目錄

命令:

rmdir doc

輸出:

[root@localhost scf]# tree

.

|-- bin

|-- doc

|   |-- info

|   `-- product

|-- lib

|-- logs

|   |-- info

|   `-- product

`-- service

    `-- deploy

        |-- info

        `-- product

 

12 directories, 0 files

[root@localhost scf]# rmdir doc

rmdir: doc: 目錄非空

[root@localhost scf]# rmdir doc/info

[root@localhost scf]# rmdir doc/product

[root@localhost scf]# tree

.

|-- bin

|-- doc

|-- lib

|-- logs

|   |-- info

|   `-- product

`-- service

    `-- deploy

        |-- info

        `-- product

 

10 directories, 0 files

 

說明:

rmdir 目錄名 命令不能直接刪除非空目錄

 

實例2rmdir -p 當子目錄被刪除后使它也成為空目錄的話,則順便一並刪除 

命令:

rmdir -p logs

輸出:

[root@localhost scf]# tree

.

|-- bin

|-- doc

|-- lib

|-- logs

|   `-- product

`-- service

    `-- deploy

        |-- info

        `-- product

 

10 directories, 0 files

[root@localhost scf]# rmdir -p logs

rmdir: logs: 目錄非空

[root@localhost scf]# tree

.

|-- bin

|-- doc

|-- lib

|-- logs

|   `-- product

`-- service

    `-- deploy

        |-- info

        `-- product

 

9 directories, 0 files

[root@localhost scf]# rmdir -p logs/product

[root@localhost scf]# tree

.

|-- bin

|-- doc

|-- lib

`-- service

`-- deploy

        |-- info

        `-- product

 

7 directories, 0 files


cp 命令

格式:cp  [選項]  源目錄或文件  目標目錄或文件

功能:將給出的文件或目錄復制到另一個文件或目錄中

常用選項說明:

-a:將文件的所有屬性復制

-f  強制覆蓋同名文件

-rR  按遞歸方式,保留原目錄結構復制文件

-i 詢問是否復制

【例】:home目錄下面的. .bashrc 文件 復制到/tmp下,並重新命名為bashrc

復制文件:

[root@dsetl home]# cd /

[root@dsetl /]# ls

ATM bin boot cgroup dev etc home inputfile lib lib64 lost+found media misc mnt net opt proc root sbin selinux srv sys tmp u01 usr var

[root@dsetl /]# cd tmp 

[root@dsetl tmp]# cp ~/.bashrc bashrc

[root@dsetl tmp]# cp -i ~/.bashrc bashrc --復制時候詢問是否復制

cp: overwrite `bashrc'? n

【例】:/var/log/wtmp復制到/tmp

復制目錄:

[root@dsetl tmp]# cp /var/log/wtmp . <==想要復制到當前目錄,最后的 .不能忘記

 [root@dsetl tmp]# ls -l wtmp

-rw-r--r-- 1 root root 233088 Feb 13 10:19 wtmp --不加任何參數的情況下,文件的用戶組會改變,連屬性權限也改變了,文件的創建時間也改變了

[root@dsetl tmp]# ls -al /var/log/wtmp

-rw-rw-r--. 1 root utmp 233088 Feb 13 09:42 /var/log/wtmp  --源目錄文件的組為utmp

[root@dsetl tmp]# cp -a /var/llsog/wtmp wtmp_2 --連同所有屬性一起復制

[root@dsetl tmp]# ls -l wtmp_2

-rw-rw-r--. 1 root utmp 233088 Feb 13 09:42 wtmp_2 和源文件的屬性一致

mv命令

2命令功能:

mv命令中第二個參數類型的不同(是目標文件還是目標目錄),mv命令將文件重命名或將其移至一個新的目錄中。當第二個參數類型是文件時,mv命令完成文 件重命名,此時,源文件只能有一個(也可以是源目錄名),它將所給的源文件或目錄重命名為給定的目標文件名。當第二個參數是已存在的目錄名稱時,源文件或 目錄參數可以有多個,mv命令將各參數指定的源文件均移至目標目錄中。在跨文件系統移動文件時,mv先拷貝,再將原有文件刪除,而鏈至該文件的鏈接也將丟 失。

格式:mv  [選項]  源目錄或文件  目標目錄或文件

功能:移動或重命名文件或目錄

常用選項說明:

3命令參數:

-b :若需覆蓋文件,則覆蓋前先行備份。

-f force 強制的意思,如果目標文件已經存在,不會詢問而直接覆蓋;

-i :若目標文件 (destination) 已經存在時,就會詢問是否覆蓋!

-u :若目標文件已經存在,且 source 比較新,才會更新(update)

-t  : --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定mv的目標目錄,該選項適用於移動多個源文件到一個目錄的情況,此時目標目錄在前,源文件在后。

【例】:復制文件,建立一個目錄,將文件移動到目錄中

 [root@dsetl etc]# cd /tmp

[root@dsetl tmp]# cp ~/. bashrc

Mkdir lp

[root@dsetl tmp]# mv bashrc lp

[root@dsetl tmp]# cd lp

[root@dsetl lp]# ls

bashrc testmv

【例】:testmv目錄名命名為test

[root@dsetl lp]# mv testmv test

[root@dsetl lp]# ls

bashrc test

【例】:復制文件bashrc1bashrc2並全部移動到 /tmp/lp

[root@dsetl tmp]# cp ~/.bashrc bashrc1

[root@dsetl tmp]# cp ~/.bashrc bashrc2

[root@dsetl tmp]# mv bashrc1 bashrc2 lp --同時移動兩個文件到目錄lp

 實例三:將文件log1.txt,log2.txt,log3.txt移動到目錄test3中。 

命令:

mv log1.txt log2.txt log3.txt test3

mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt 

輸出:

[root@localhost test]# ll

總計 28

-rw-r--r-- 1 root root    8 10-28 06:15 log1.txt

-rw-r--r-- 1 root root   12 10-28 06:15 log2.txt

-rw-r--r-- 1 root root   13 10-28 06:16 log3.txt

drwxrwxrwx 2 root root 4096 10-28 06:09 test3

[root@localhost test]# mv log1.txt log2.txt log3.txt test3

[root@localhost test]# ll

總計 16drwxrwxrwx 2 root root 4096 10-28 06:18 test3

[root@localhost test]# cd test3/

[root@localhost test3]# ll

總計 16

-rw-r--r-- 1 root root  8 10-28 06:15 log1.txt

-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt

-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt

-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt

[root@localhost test3]#

[root@localhost test3]# ll

總計 20

-rw-r--r-- 1 root root    8 10-28 06:15 log1.txt

-rw-r--r-- 1 root root   12 10-28 06:15 log2.txt

-rw-r--r-- 1 root root   13 10-28 06:16 log3.txt

drwxr-xr-x 2 root root 4096 10-28 06:21 logs

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

[root@localhost test3]# mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt 

[root@localhost test3]# cd ..

[root@localhost test]# cd test4/

[root@localhost test4]# ll

總計 12

-rw-r--r-- 1 root root  8 10-28 06:15 log1.txt

-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt

-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt

[root@localhost test4]#

說明:

mv log1.txt log2.txt log3.txt test3命令將log1.txt log2.txtlog3.txt三個文件移到 test3目錄中去,mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt 命令又將三個文件移動到test4目錄中去

實例四:將文件file1改名為file2,如果file2已經存在,則詢問是否覆蓋

命令:

mv -i log1.txt log2.txt

輸出:

[root@localhost test4]# ll

總計 12

-rw-r--r-- 1 root root  8 10-28 06:15 log1.txt

-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt

-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt

[root@localhost test4]# cat log1.txt 

odfdfs

[root@localhost test4]# cat log2.txt 

ererwerwer

[root@localhost test4]# mv -i log1.txt log2.txt 

mv:是否覆蓋“log2.txt”? y

[root@localhost test4]# cat log2.txt 

odfdfs

[root@localhost test4]#

實例五:將文件file1改名為file2,即使file2存在,也是直接覆蓋掉。

命令:

mv -f log3.txt log2.txt

輸出:

[root@localhost test4]# ll

總計 8

-rw-r--r-- 1 root root  8 10-28 06:15 log2.txt

-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt

[root@localhost test4]# cat log2.txt 

odfdfs

[root@localhost test4]# cat log3

cat: log3: 沒有那個文件或目錄

[root@localhost test4]# ll

總計 8

-rw-r--r-- 1 root root  8 10-28 06:15 log2.txt

-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt

[root@localhost test4]# cat log2.txt 

odfdfs

[root@localhost test4]# cat log3.txt 

dfosdfsdfdss

[root@localhost test4]# mv -f log3.txt log2.txt 

[root@localhost test4]# cat log2.txt 

dfosdfsdfdss

[root@localhost test4]# ll

總計 4

-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt

[root@localhost test4]#

說明

log3.txt的內容直接覆蓋了log2.txt內容,-f 這是個危險的選項,使用的時候一定要保持頭腦清晰,一般情況下最好不用加上它。

實例六:目錄的移動

命令:

mv dir1 dir2 

輸出:

[root@localhost test4]# ll

-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt

[root@localhost test4]# ll

-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt

[root@localhost test4]# cd ..

[root@localhost test]# ll

drwxr-xr-x 6 root root 4096 10-27 01:58 scf

drwxrwxrwx 3 root root 4096 10-28 06:24 test3

drwxr-xr-x 2 root root 4096 10-28 06:48 test4

drwxr-xr-x 3 root root 4096 10-25 17:56 test5

[root@localhost test]# cd test3

[root@localhost test3]# ll

drwxr-xr-x 2 root root 4096 10-28 06:21 logs

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

[root@localhost test3]# cd ..

[root@localhost test]# mv test4 test3

[root@localhost test]# ll

drwxr-xr-x 6 root root 4096 10-27 01:58 scf

drwxrwxrwx 4 root root 4096 10-28 06:54 test3

drwxr-xr-x 3 root root 4096 10-25 17:56 test5

[root@localhost test]# cd test3/

[root@localhost test3]# ll

drwxr-xr-x 2 root root 4096 10-28 06:21 logs

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

drwxr-xr-x 2 root root 4096 10-28 06:48 test4

[root@localhost test3]#

說明:

如果目錄dir2不存在,將目錄dir1改名為dir2;否則,將dir1移動到dir2中。

實例7:移動當前文件夾下的所有文件到上一級目錄

命令:

mv * ../

輸出:

[root@localhost test4]# ll

-rw-r--r-- 1 root root 25 10-28 07:02 log1.txt

-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt

[root@localhost test4]# mv * ../

[root@localhost test4]# ll

[root@localhost test4]# cd ..

[root@localhost test3]# ll

-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt

-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt

drwxr-xr-x 2 root root 4096 10-28 06:21 logs

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

drwxr-xr-x 2 root root 4096 10-28 07:02 test4

實例八:把當前目錄的一個子目錄里的文件移動到另一個子目錄里

命令:

mv test3/*.txt test5

輸出:

[root@localhost test]# ll

drwxr-xr-x 6 root root 4096 10-27 01:58 scf

drwxrwxrwx 4 root root 4096 10-28 07:02 test3

drwxr-xr-x 3 root root 4096 10-25 17:56 test5

[root@localhost test]# cd test3

[root@localhost test3]# ll

-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt

-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt

drwxr-xr-x 2 root root 4096 10-28 06:21 logs

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

drwxr-xr-x 2 root root 4096 10-28 07:02 test4

[root@localhost test3]# cd ..

[root@localhost test]# mv test3/*.txt test5

[root@localhost test]# cd test5

[root@localhost test5]# ll

-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt

-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1

[root@localhost test5]# cd ..

[root@localhost test]# cd test3/

[root@localhost test3]# ll

drwxr-xr-x 2 root root 4096 10-28 06:21 logs

drwxr-xr-x 2 root root 4096 10-28 07:02 test4

[root@localhost test3]#

實例九:文件被覆蓋前做簡單備份,前面加參數-b

命令:

mv log1.txt -b log2.txt

輸出:

[root@localhost test5]# ll

-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt

-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1

[root@localhost test5]# mv log1.txt -b log2.txt

mv:是否覆蓋“log2.txt”? Y

[root@localhost test5]# ll

-rw-r--r-- 1 root root   25 10-28 07:02 log2.txt

-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt~

-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt

drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1

[root@localhost test5]#

說明:

-b 不接受參數,mv會去讀取環境變量VERSION_CONTROL來作為備份策略

--backup該選項指定如果目標文件存在時的動作,共有四種備份策略:

1.CONTROL=noneoff : 不備份。

2.CONTROL=numberedt:數字編號的備份

3.CONTROL=existingnil:如果存在以數字編號的備份,則繼續編號備份m+1...n

執行mv操作前已存在以數字編號的文件log2.txt.~1~,那么再次執行將產生log2.txt~2~,以次類推。如果之前沒有以數字編號的文件,則使用下面講到的簡單備份。

4.CONTROL=simplenever:使用簡單備份:在被覆蓋前進行了簡單備份,簡單備份只能有一份,再次被覆蓋時,簡單備份也會被覆蓋。



rm 命令

昨天學習了創建文件和目錄的命令mkdir ,今天學習一下linux中刪除文件和目錄的命令: rm命令。rm是常用的命令,該命令的功能為刪除一個目錄中的一個或多個文件或目錄,它也可以將某個目錄及其下的所有文件及子目錄均刪除。對於鏈接文件,只是刪除了鏈接,原有文件均保持不變。

rm是一個危險的命令,使用的時候要特別當心,尤其對於新手,否則整個系統就會毀在這個命令(比如在/(根目錄)下執行rm * -rf)。所以,我們在執行rm之前最好先確認一下在哪個目錄,到底要刪除什么東西,操作時保持高度清醒的頭腦。

格式:rm  [選項]  文件夾或目錄

功能:刪除文件夾或目錄

常用選項說明:

-f  強制刪除文件,不出現確認提示

-rR  按遞歸方式刪除目錄,默認只刪除文件

-i 刪除前進行詢問

【例】:刪除bashrc

[root@dsetl tmp]# cd lp

[root@dsetl lp]# ls

bashrc bashrc1 bashrc2 test

[root@dsetl lp]# rm -i bashrc

rm: remove regular file `bashrc'? y

[root@dsetl lp]# ls

bashrc1 bashrc2 test

【例】:刪除一個不為空的目錄test


[root@dsetl lp]# mkdir -p test1/test2

[root@dsetl lp]# ls

bashrc1 bashrc2 test test1

[root@dsetl lp]# rmdir test1

rmdir: failed to remove `test1': Directory not empty

[root@dsetl lp]# rm -rf test

[root@dsetl lp]# ls

bashrc1 bashrc2 test1

[root@dsetl lp]#

 

實例六:刪除以 -f 開頭的文件

命令:

rm -- -f

輸出:

[root@localhost test]# touch -- -f

[root@localhost test]# ls -- -f

-f[root@localhost test]# rm -- -f

rm:是否刪除 一般空文件 “-f”? y

[root@localhost test]# ls -- -f

ls: -f沒有那個文件或目錄

[root@localhost test]#

也可以使用下面的操作步驟:

[root@localhost test]# touch ./-f

[root@localhost test]# ls ./-f

./-f[root@localhost test]# rm ./-f

rm:是否刪除 一般空文件 “./-f”? y

[root@localhost test]#

實例七:自定義回收站功能

命令:

myrm(){ D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok"; }

輸出:

[root@localhost test]# myrm(){ D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok"; }

[root@localhost test]# alias rm='myrm'

[root@localhost test]# touch 1.log 2.log 3.log

[root@localhost test]# ll

總計 16

-rw-r--r-- 1 root root    0 10-26 15:08 1.log

-rw-r--r-- 1 root root    0 10-26 15:08 2.log

-rw-r--r-- 1 root root    0 10-26 15:08 3.log

drwxr-xr-x 7 root root 4096 10-25 18:07 scf

drwxrwxrwx 2 root root 4096 10-25 17:46 test3

drwxr-xr-x 2 root root 4096 10-25 17:56 test4

drwxr-xr-x 3 root root 4096 10-25 17:56 test5

[root@localhost test]# rm [123].log

moved to /tmp/20121026150901 ok

[root@localhost test]# ll

總計 16drwxr-xr-x 7 root root 4096 10-25 18:07 scf

drwxrwxrwx 2 root root 4096 10-25 17:46 test3

drwxr-xr-x 2 root root 4096 10-25 17:56 test4

drwxr-xr-x 3 root root 4096 10-25 17:56 test5

[root@localhost test]# ls /tmp/20121026150901/

1.log  2.log  3.log

[root@localhost test]#

說明

上面的操作過程模擬了回收站的效果,即刪除文件的時候只是把文件放到一個臨時目錄中,這樣在需要的時候還可以恢復過來。

    1. diff 命令

diff 命 令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中打印每一個行的改動。最新版 本的diff還支持二進制文件。diff程序的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程序,可以根據diff的輸出將 a.c的文件內容更新為b.cdiffsvncvsgit等版本控制工具不可或缺的一部分。

1命令格式:

diff[參數][文件1或目錄1][文件2或目錄2]

2命令功能:

diff 命令能比較單個文件或者目錄內容。如果指定比較的是文件,則只有當輸入為文本文件時才有效。以逐行的方式,比較文本文件的異同處。如果指定比較的是目錄的 的時候,diff 命令會比較兩個目錄下名字相同的文本文件。列出不同的二進制文件、公共子目錄和只在一個目錄出現的文件。

3命令參數:

- 指定要顯示多少行的文本。此參數必須與-c-u參數一並使用。

-a--text diff預設只會逐行比較文本文件。

-b--ignore-space-change 不檢查空格字符的不同。

-B--ignore-blank-lines 不檢查空白行。

-c 顯示全部內文,並標出不同之處。

-C--context 與執行"-c-"指令相同。

-d--minimal 使用不同的演算法,以較小的單位來做比較。

-Difdef 此參數的輸出格式可用於前置處理器巨集。

-e--ed 此參數的輸出格式可用於edscript文件。

-f-forward-ed 輸出的格式類似edscript文件,但按照原來文件的順序來顯示不同處。

-H--speed-large-files 比較大文件時,可加快速度。

-l--ignore-matching-lines 若兩個文件在某幾行有所不同,而這幾行同時都包含了選項中指定的字符或字符串,則不顯示這兩個文件的差異。

-i--ignore-case 不檢查大小寫的不同。

-l--paginate 將結果交由pr程序來分頁。

-n--rcs 將比較結果以RCS的格式來顯示。

-N--new-file 在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。

-p 若比較的文件為C語言的程序碼文件時,顯示差異所在的函數名稱。

-P--unidirectional-new-file -N類似,但只有當第二個目錄包含了一個第一個目錄所沒有的文件時,才會將這個文件與空白的文件做比較。

-q--brief 僅顯示有無差異,不顯示詳細的信息。

-r--recursive 比較子目錄中的文件。

-s--report-identical-files 若沒有發現任何差異,仍然顯示信息。

-S--starting-file 在比較目錄時,從指定的文件開始比較。

-t--expand-tabs 在輸出時,將tab字符展開。

-T--initial-tab 在每行前面加上tab字符以便對齊。

-u,-U--unified= 以合並的方式來顯示文件內容的不同。

-v--version 顯示版本信息。

-w--ignore-all-space 忽略全部的空格字符。

-W--width 在使用-y參數時,指定欄寬。

-x--exclude 不比較選項中所指定的文件或目錄。

-X--exclude-from 您可以將文件或目錄類型存成文本文件,然后在=中指定此文本文件。

-y--side-by-side 以並列的方式顯示文件的異同之處。

--help 顯示幫助。

--left-column 在使用-y參數時,若兩個文件某一行內容相同,則僅在左側的欄位顯示該行內容。

--suppress-common-lines 在使用-y參數時,僅顯示不同之處。

4使用實例:

實例1:比較兩個文件

命令:

輸出:

[root@localhost test3]# diff log2014.log log2013.log 

3c3

< 2014-03

---

> 2013-03

8c8

< 2013-07

---

> 2013-08

11,12d10

< 2013-11

< 2013-12

說明:

上面的“3c3和“8c8表示log2014.loglog20143log文件在3行和第8行內容有所不同;"11,12d10"表示第一個文件比第二個文件多了第1112行。

diff normal 顯示格式有三種提示:

a - add

c - change

d - delete

實例2:並排格式輸出

命令:

diff log2013.log log2014.log -y -W 50

輸出:

[root@localhost test3]# diff log2014.log log2013.log  -y -W 50

2013-01                 2013-01

2013-02                 2013-02

2014-03               | 2013-03

2013-04                 2013-04

2013-05                 2013-05

2013-06                 2013-06

2013-07                 2013-07

2013-07               | 2013-08

2013-09                 2013-09

2013-10                 2013-10

2013-11               <

2013-12               <

[root@localhost test3]# diff log2013.log log2014.log  -y -W 50

2013-01                 2013-01

2013-02                 2013-02

2013-03               | 2014-03

2013-04                 2013-04

2013-05                 2013-05

2013-06                 2013-06

2013-07                 2013-07

2013-08               | 2013-07

2013-09                 2013-09

2013-10                 2013-10

                      > 2013-11

                      > 2013-12

說明:

|”表示前后2個文件內容有不同

<表示后面文件比前面文件少了1行內容

>表示后面文件比前面文件多了1行內容

實例3:上下文輸出格式

命令:

diff log2013.log log2014.log -c

輸出:

[root@localhost test3]# diff log2013.log log2014.log  -c

*** log2013.log 2012-12-07 16:36:26.000000000 +0800

--- log2014.log 2012-12-07 18:01:54.000000000 +0800

***************

*** 1,10 ****

  2013-01

  2013-02

! 2013-03

  2013-04

  2013-05

  2013-06

  2013-07

! 2013-08

  2013-09

  2013-10

--- 1,12 ----

  2013-01

  2013-02

! 2014-03

  2013-04

  2013-05

  2013-06

  2013-07

! 2013-07

  2013-09

  2013-10

+ 2013-11

+ 2013-12[root@localhost test3]# diff log2014.log log2013.log  -c

*** log2014.log 2012-12-07 18:01:54.000000000 +0800

--- log2013.log 2012-12-07 16:36:26.000000000 +0800

***************

*** 1,12 ****

  2013-01

  2013-02

! 2014-03

  2013-04

  2013-05

  2013-06

  2013-07

! 2013-07

  2013-09

  2013-10

- 2013-11

- 2013-12

--- 1,10 ----

  2013-01

  2013-02

! 2013-03

  2013-04

  2013-05

  2013-06

  2013-07

! 2013-08

  2013-09

  2013-10[root@localhost test3]#

說明:

這種方式在開頭兩行作了比較文件的說明,這里有三中特殊字符:

+” 比較的文件的后者比前着多一行

比較的文件的后者比前着少一行

!” 比較的文件兩者有差別的行

實例4:統一格式輸出

命令:

diff log2014.log log2013.log -u

輸出:

[root@localhost test3]# diff log2014.log log2013.log  -u

--- log2014.log 2012-12-07 18:01:54.000000000 +0800

+++ log2013.log 2012-12-07 16:36:26.000000000 +0800

@@ -1,12 +1,10 @@

 2013-01

 2013-02

-2014-03

+2013-03

 2013-04

 2013-05

 2013-06

 2013-07

-2013-07

+2013-08

 2013-09

 2013-10

-2013-11

-2013-12

說明:

它的第一部分,也是文件的基本信息:

--- log2014.log 2012-12-07 18:01:54.000000000 +0800

+++ log2013.log 2012-12-07 16:36:26.000000000 +0800

"---"表示變動前的文件,"+++"表示變動后的文件。

第二部分,變動的位置用兩個@作為起首和結束。

@@ -1,12 +1,10 @@

前面的"-1,12"分成三個部分:減號表示第一個文件(即log2014.log),"1"表示第1行,"12"表示連續12行。合在一起,就表示下面是第一個文件從第1行開始的連續12行。同樣的,"+1,10"表示變動后,成為第二個文件從第1行開始的連續10行。

實例5:比較文件夾不同

命令:

diff  test3 test6

輸出:

[root@localhost test]# diff test3 test6

Only in test6: linklog.log

Only in test6: log2012.log

diff test3/log2013.log test6/log2013.log

1,10c1,3

< 2013-01

< 2013-02

< 2013-03

< 2013-04

< 2013-05

< 2013-06

< 2013-07

< 2013-08

< 2013-09

< 2013-10

---

> hostnamebaidu=baidu.com

> hostnamesina=sina.com

> hostnames=true

diff test3/log2014.log test6/log2014.log

1,12d0

< 2013-01

< 2013-02

< 2014-03

< 2013-04

< 2013-05

< 2013-06

< 2013-07

< 2013-07

< 2013-09

< 2013-10

< 2013-11

< 2013-12

Only in test6: log2015.log

Only in test6: log2016.log

Only in test6: log2017.log

[root@localhost test]#

說明:

實例6:比較兩個文件不同,並生產補丁

命令:

diff -ruN log2013.log log2014.log >patch.log

輸出:

[root@localhost test3]# diff -ruN log2013.log log2014.log >patch.log

[root@localhost test3]# ll

總計 12

-rw-r--r-- 2 root root  80 12-07 16:36 log2013.log

-rw-r--r-- 1 root root  96 12-07 18:01 log2014.log

-rw-r--r-- 1 root root 248 12-07 21:33 patch.log

[root@localhost test3]# cat patc.log

cat: patc.log: 沒有那個文件或目錄

[root@localhost test3]# cat patch.log 

--- log2013.log 2012-12-07 16:36:26.000000000 +0800

+++ log2014.log 2012-12-07 18:01:54.000000000 +0800

@@ -1,10 +1,12 @@

 2013-01

 2013-02

-2013-03

+2014-03

 2013-04

 2013-05

 2013-06

 2013-07

-2013-08

+2013-07

 2013-09

 2013-10

+2013-11

+2013-12[root@localhost test3]#

說明:

實例7打補丁

命令:

輸出:

[root@localhost test3]# cat log2013.log

2013-01

2013-02

2013-03

2013-04

2013-05

2013-06

2013-07

2013-08

2013-09

2013-10[root@localhost test3]# patch log2013.log patch.log 

patching file log2013.log

[root@localhost test3]# 

[root@localhost test3]# cat log2013.log 

2013-01

2013-02

2014-03

2013-04

2013-05

2013-06

2013-07

2013-07

2013-09

2013-10

2013-11

2013-12[root@localhost test3]#

說明:

  1. 時間命令:

    1. date命令

linux環境中,不管是編程還是其他維護,時間是必不可少的,也經常會用到時間的運算,熟練運用date命令來表示自己想要表示的時間,肯定可以給自己的工作帶來諸多方便。

1命令格式:

  date [參數]... [+格式]

2命令功能:

date 可以用來顯示或設定系統的日期與時間。

3命令參數:

必要參數:

%H 小時(00-23來表示)。 

%I 小時(01-12來表示)。 

%K 小時(0-23來表示)。 

%l 小時(0-12來表示)。 

%M 分鍾(00-59來表示)。 

%P AMPM。 

%r 時間(含時分秒,小時以12小時AM/PM來表示)。 

%s 總秒數。起算時間為1970-01-01 00:00:00 UTC。 

%S (以本地的慣用法來表示)。 

%T 時間(含時分秒,小時以24小時制來表示)。 

%X 時間(以本地的慣用法來表示)。 

%Z 市區。 

%a 星期的縮寫。 

%A 星期的完整名稱。 

%b 月份英文名的縮寫。 

%B 月份的完整英文名稱。 

%c 日期與時間。只輸入date指令也會顯示同樣的結果。 

%d 日期(01-31來表示)。 

%D 日期(含年月日)。 

%j 該年中的第幾天。 

%m 月份(01-12來表示)。 

%U 該年中的周數。 

%w 該周的天數,0代表周日,1代表周一,異詞類推。 

%x 日期(以本地的慣用法來表示)。 

%y 年份(00-99來表示)。 

%Y 年份(以四位數來表示)。 

%n 在顯示時,插入新的一行。 

%t 在顯示時,插入tab。 

MM 月份(必要

DD 日期(必要

hh 小時(必要

mm 分鍾(必要)

ss (選擇性

選擇參數:

-d<字符串 顯示字符串所指的日期與時間。字符串前后必須加上雙引號。 

-s<字符串 根據字符串來設置日期與時間。字符串前后必須加上雙引號。 

-u  顯示GMT。 

--help  在線幫助。 

--version  顯示版本信息 

4使用說明:

1.在顯示方面,使用者可以設定欲顯示的格式,格式設定為一個加號后接數個標記,其中可用的標記列表如下: % : 打印出 %

%n : 下一行

%t : 跳格

%H : 小時(00..23)

%I : 小時(01..12)

%k : 小時(0..23)

%l : 小時(1..12)

%M : 分鍾(00..59)

%p : 顯示本地 AM PM

%r : 直接顯示時間 (12 小時制,格式為 hh:mm:ss [AP]M)

%s : 1970 1 1 00:00:00 UTC 到目前為止的秒數

%S : (00..61)

%T : 直接顯示時間 (24 小時制)

%X : 相當於 %H:%M:%S

%Z : 顯示時區 %a : 星期幾 (Sun..Sat)

%A : 星期幾 (Sunday..Saturday)

%b : 月份 (Jan..Dec)

%B : 月份 (January..December)

%c : 直接顯示日期與時間

%d : (01..31)

%D : 直接顯示日期 (mm/dd/yy)

%h : %b

%j : 一年中的第幾天 (001..366)

%m : 月份 (01..12)

%U : 一年中的第幾周 (00..53) (Sunday 為一周的第一天的情形)

%w : 一周中的第幾天 (0..6)

%W : 一年中的第幾周 (00..53) (Monday 為一周的第一天的情形)

%x : 直接顯示日期 (mm/dd/yy)

%y : 年份的最后兩位數字 (00.99)

%Y : 完整年份 (0000..9999)

2.在設定時間方面:

date -s //設置當前時間,只有root權限才能設置,其他只能查看。

date -s 20080523 //設置成20080523,這樣會把具體時間設置成空00:00:00

date -s 01:01:01 //設置具體時間,不會對日期做更改

date -s “01:01:01 2008-05-23″ //這樣可以設置全部時間

date -s “01:01:01 20080523″ //這樣可以設置全部時間

date -s “2008-05-23 01:01:01″ //這樣可以設置全部時間

date -s “20080523 01:01:01″ //這樣可以設置全部時間

3.加減:

date +%Y%m%d //顯示前天年月日

date +%Y%m%d --date="+1 day" //顯示前一天的日期

date +%Y%m%d --date="-1 day" //顯示后一天的日期

date +%Y%m%d --date="-1 month" //顯示上一月的日期

date +%Y%m%d --date="+1 month" //顯示下一月的日期

date +%Y%m%d --date="-1 year" //顯示前一年的日期

date +%Y%m%d --date="+1 year" //顯示下一年的日期

5使用實例:

實例1顯示當前時間

命令:

date

date '+%c'

date '+%D'

date '+%x'

date '+%T'

date '+%X'

輸出:

[root@localhost ~]# date

2012年 12月 08日 星期六 08:31:35 CST

[root@localhost ~]# date '+%c'

20121208日 星期六 083444

[root@localhost ~]# date '+%D'

12/08/12

[root@localhost ~]# date '+%x'

20121208

[root@localhost ~]# date '+%T'

08:35:36

[root@localhost ~]# date '+%X'

083554

[root@localhost ~]#

說明:

實例2顯示日期和設定時間

命令:

date --date 08:42:00

輸出:

[root@localhost ~]# date '+%c'

20121208日 星期六 084137

[root@localhost ~]# date --date 08:42:00

2012年 12月 08日 星期六 08:42:00 CST

[root@localhost ~]# date '+%c' --date 08:45:00

20121208日 星期六 084500

[root@localhost ~]#

說明:

實例3date -d參數使用

命令:

輸出:

[root@localhost ~]# date -d "nov 22"

2012年 11月 22日 星期四 00:00:00 CST

[root@localhost ~]# date -d '2 weeks'

2012年 12月 22日 星期六 08:50:21 CST

[root@localhost ~]# date -d 'next monday'

2012年 12月 10日 星期一 00:00:00 CST

[root@localhost ~]#  date -d next-day +%Y%m%d

20121209[root@localhost ~]# date -d tomorrow +%Y%m%d

20121209[root@localhost ~]# date -d last-day +%Y%m%d

20121207[root@localhost ~]# date -d yesterday +%Y%m%d

20121207[root@localhost ~]# date -d last-month +%Y%m

201211[root@localhost ~]# date -d next-month +%Y%m

201301[root@localhost ~]# date -d '30 days ago' 

2012年 11月 08日 星期四 08:51:37 CST

[root@localhost ~]# date -d '-100 days' 

2012年 08月 30日 星期四 08:52:03 CST

[root@localhost ~]#  date -d 'dec 14 -2 weeks'

2012年 11月 30日 星期五 00:00:00 CST

[root@localhost ~]# date -d '50 days'

2013年 01月 27日 星期日 08:52:27 CST

說明:

date 命 令的另一個擴展是 -d 選項,該選項非常有用。使用這個功能強大的選項,通過將日期作為引號括起來的參數提供,您可以快速地查明一個特定的日期。 -d 選項還可以告訴您,相對於當前日期若干天的究竟是哪一天,從現在開始的若干天或若干星期以后,或者以前(過去)。通過將這個相對偏移使用引號括起 來,作為 -d 選項的參數,就可以完成這項任務。

具體說明如下:

date -d "nov 22" 今年的 11 22 日是星期三

date -d '2 weeks' 2周后的日期

date -d 'next monday' (下周一的日期)

date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d

date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d

date -d last-month +%Y%m(上個月是幾月)

date -d next-month +%Y%m(下個月是幾月)

使用 ago 指令,您可以得到過去的日期:

date -d '30 days ago' 30天前的日期)

使用負數以得到相反的日期:

date -d 'dec 14 -2 weeks' (相對:dec 14這個日期的兩周前的日期)

date -d '-100 days' (100天以前的日期)

date -d '50 days'(50天后的日期)

實例4顯示月份和日數

命令:

date '+%B %d'

輸出:

[root@localhost ~]# date  '+%B %d' 

十二月 08[root@localhost ~]#

說明:

實例5顯示時間后跳行,再顯示目前日期 

命令:

date '+%T%n%D'

輸出:

[root@localhost ~]# date '+%T%n%D'

09:00:30

12/08/12[root@localhost ~]#

說明:

    1. cal 命令

cal命令可以用來顯示公歷(陽歷)日歷。公歷是現在國際通用的歷法,又稱格列歷,通稱陽歷。“陽歷”又名“太陽歷”,系以地球繞行太陽一周為一年,為西方各國所通用,故又名“西歷”。

1命令格式:

cal [參數][月份][年份]

2命令功能:

用於查看日歷等時間信息,如只有一個參數,則表示年份(1-9999),如有兩個參數,則表示月份和年份

3命令參數:

-1 顯示一個月的月歷

-3 顯示系統前一個月,當前月,下一個月的月歷

-s 顯示星期天為一個星期的第一天,默認的格式

-m 顯示星期一為一個星期的第一天
-j
顯示在當年中的第幾天(一年日期按天算,從11號算起,默認顯示當前月在一年中的天數)
-y
顯示當前年份的日歷

4使用實例:

實例1顯示當前月份日歷

命令:

cal

輸出:

[root@localhost ~]# cal

   十二月 2012     

日 一 二 三 四 五 六

                   1

 2  3  4  5  6  7  8

 9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30 31[root@localhost ~]#

實例2:顯示指定月份的日歷

命令:

cal 9 2012

輸出:

[root@localhost ~]# cal 9 2012

     九月 2012      

日 一 二 三 四 五 六

                   1

 2  3  4  5  6  7  8

 9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30

實例3:顯示2013年日歷

命令:

cal -y 2013

cal 2013

輸出:



實例4顯示自11日的天數

命令:

cal -j

輸出:

[root@localhost ~]# cal -j

        十二月 2012        

  日   一   二   三   四   五   六

                        336

337 338 339 340 341 342 343

344 345 346 347 348 349 350

351 352 353 354 355 356 357

358 359 360 361 362 363 364

365 366[root@localhost ~]#

實例5星期一顯示在第一列

命令:

cal -m

輸出:

[root@localhost ~]# cal -m

    十二月 2012     

一 二 三 四 五 六 日

                1  2

 3  4  5  6  7  8  9

10 11 12 13 14 15 16

17 18 19 20 21 22 23

24 25 26 27 28 29 30

31[root@localhost ~]#

  1. 文件屬性:

-rwx -r- -r-- 1 bin root 4096 Feb 12 09:20 lp.txt

屬性 連接 擁有者 用戶組 文件大小 修改日期 文件


第一組:-rwx擁有者的屬性

第二組:-r-所屬用戶組的屬性

第三組: -r-其他用戶組

  1. Chgrp 命令:(change group

功能:改變文件所屬用戶組

格式 chgrp [-R] 文件或者目錄(dirname/filename)

常用選項說明:[-R]:遞歸持續更改,即連同子目錄下面的所有文件、目錄都更新成這個用戶組

3命令參數:

必要參數:

-c 當發生改變時輸出調試信息

-f 不顯示錯誤信息

-R 處理指定目錄以及其子目錄下的所有文件

-v 運行時顯示詳細的處理信息

--dereference 作用於符號鏈接的指向,而不是符號鏈接本身

--no-dereference 作用於符號鏈接本身

選擇參數:

--reference=<文件或者目錄>

--help 顯示幫助信息

--version 顯示版本信息


【例】Sudo chgrp root install.log --文件改為root所有

ls –l

4使用實例:

實例1改變文件的群組屬性 

命令:l

chgrp -v bin log2012.log

輸出:

[root@localhost test]# ll

---xrw-r-- 1 root root 302108 11-13 06:03 log2012.log

[root@localhost test]# chgrp -v bin log2012.log

log2012.log” 的所屬組已更改為 bin

[root@localhost test]# ll

---xrw-r-- 1 root bin  302108 11-13 06:03 log2012.log

說明:

log2012.log文件由root群組改為bin群組

實例2根據指定文件改變文件的群組屬性 

命令:

chgrp --reference=log2012.log log2013.log

輸出:

[root@localhost test]# ll

---xrw-r-- 1 root bin  302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

[root@localhost test]#  chgrp --reference=log2012.log log2013.log 

[root@localhost test]# ll

---xrw-r-- 1 root bin  302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root bin      61 11-13 06:03 log2013.log

說明:

改變文件log2013.log 的群組屬性,使得文件log2013.log的群組屬性和參考文件log2012.log的群組屬性相同

實例3:改變指定目錄以及其子目錄下的所有文件的群組屬性 

命令:

輸出:

[root@localhost test]# ll

drwxr-xr-x 2 root root   4096 11-30 08:39 test6

[root@localhost test]# cd test6

[root@localhost test6]# ll

---xr--r-- 1 root root 302108 11-30 08:39 linklog.log

---xr--r-- 1 root root 302108 11-30 08:39 log2012.log

-rw-r--r-- 1 root root     61 11-30 08:39 log2013.log

-rw-r--r-- 1 root root      0 11-30 08:39 log2014.log

-rw-r--r-- 1 root root      0 11-30 08:39 log2015.log

-rw-r--r-- 1 root root      0 11-30 08:39 log2016.log

-rw-r--r-- 1 root root      0 11-30 08:39 log2017.log

[root@localhost test6]# cd ..

[root@localhost test]# chgrp -R bin test6

[root@localhost test]# cd test6

[root@localhost test6]# ll

---xr--r-- 1 root bin 302108 11-30 08:39 linklog.log

---xr--r-- 1 root bin 302108 11-30 08:39 log2012.log

-rw-r--r-- 1 root bin     61 11-30 08:39 log2013.log

-rw-r--r-- 1 root bin      0 11-30 08:39 log2014.log

-rw-r--r-- 1 root bin      0 11-30 08:39 log2015.log

-rw-r--r-- 1 root bin      0 11-30 08:39 log2016.log

-rw-r--r-- 1 root bin      0 11-30 08:39 log2017.log

[root@localhost test6]# cd ..

[root@localhost test]# ll

drwxr-xr-x 2 root bin    4096 11-30 08:39 test6

[root@localhost test]#

說明:

改變指定目錄以及其子目錄下的所有文件的群組屬性

實例4:通過群組識別碼改變文件群組屬性

命令:

chgrp -R 100 test6

輸出:

[root@localhost test]# chgrp -R 100 test6

[root@localhost test]# ll

drwxr-xr-x 2 root users   4096 11-30 08:39 test6

[root@localhost test]# cd test6

[root@localhost test6]# ll

---xr--r-- 1 root users 302108 11-30 08:39 linklog.log

---xr--r-- 1 root users 302108 11-30 08:39 log2012.log

-rw-r--r-- 1 root users     61 11-30 08:39 log2013.log

-rw-r--r-- 1 root users      0 11-30 08:39 log2014.log

-rw-r--r-- 1 root users      0 11-30 08:39 log2015.log

-rw-r--r-- 1 root users      0 11-30 08:39 log2016.log

-rw-r--r-- 1 root users      0 11-30 08:39 log2017.log

[root@localhost test6]#

說明:

通過群組識別碼改變文件群組屬性,100users群組的識別碼,具體群組和群組識別碼可以去/etc/group文件中查看

  1. Chown命令:(change own

功能:改變文件目錄擁有者

常用選項說明:改變9個屬性

格式 chown [-R] 賬號名稱:文件或者目錄(dirname/filename)

chown [-R] 賬號名稱:用戶組名稱:文件或者目錄(dirname/filename)

【例】-rw-r--r-- 1 root root 0 Feb 12 09:20 lp.txt --擁有者為root

[root@dsetl test1]# chown bin lp.txt

[root@dsetl test1]# ll

-rw-r--r-- 1 bin root 0 Feb 12 09:20 lp.txt 擁有者為bin


用途:當使用cp時,把/etc/ssh目錄下面的moduli文件復制到/lp目錄下的時候,復制給users這個用戶。之前moduli這個文件為root所擁有,現在要改為users所擁有。

Cd /etc/ssh

Ls -al

Sudo cp moduli /lp

Sudo chown users moduli --moduli文件改為users所擁有


  1. Chmod命令:(change own

功能:改變文件的屬性

常用選項說明:改變9個屬性

格式 chmod [-R] xyz 文件或者目錄(dirname/filename)

權限范圍:
u
:目錄或者文件的當前的用戶
g
:目錄或者文件的當前的群組
o
:除了目錄或者文件的當前用戶或群組之外的用戶或者群組
a
:所有的用戶及群組

權限代號:
r
:讀權限,用數字4表示
w
:寫權限,用數字2表示
x
:執行權限,用數字1表示
-
:刪除權限,用數字0表示
s
:特殊權限 

該命令有兩種用法。一種是包含字母和操作符表達式的文字設定法;另一種是包含數字的數字設定法。
1
. 文字設定法:
chmod
who] [+ | - | =] [mode] 文件名
2
. 數字設定法
我們必須首先了解用數字表示的屬性的含義:0表示沒有權限,1表示可執行權限,2表示可寫權限,4表示可讀權限,然后將其相加。所以數字屬性的格式應為3個從07的八進制數,其順序是(u)(g)(o)。
例如,如果想讓某個文件的屬主有“讀/寫”二種權限,需要把4(可讀)+2(可寫)=6(讀/寫)

3個為一組,user/group/ Others,3個屬性(r/w/x)累加例如當屬性【-rwxrwx---】則是:

Owner = rwx = 4 + 2+1=7

Group= rwx = 4 + 2+1=7

Others = --- 0+0+0=0

【例】 [root@dsetl tmp]# mkdir lp

[root@dsetl tmp]# cd lp

[root@dsetl lp]# touch lp.txt

[root@dsetl test1]# chown bin lp.txt

[root@dsetl lp]# ll

total 0

-rw-r--r-- 1 root root 0 Feb 12 09:20 lp.txt

[root@dsetl lp]# mkdir test1

[root@dsetl lp]# ls

lp.txt test1

[root@dsetl lp]# mv lp.txt test1

[root@dsetl lp]# ls

test1

[root@dsetl lp]# cd test1

[root@dsetl test1]# ls

lp.txt

[root@dsetl test1]# ll

-rw-r--r-- 1 bin root 0 Feb 12 09:20 lp.txt

chmod 770 lp.txt –-改變文件的屬性為 -rwxrwx---

-rwxrwx--- 1 bin root 0 Feb 12 09:20 lp.txt

4. 使用實例:
實例1增加文件所有用戶組可執行權限

命令:

chmod a+x log2012.log相當於 [root@dsetl ~]# chmod ugo+x lp

輸出:

[root@localhost test]# ls -al log2012.log 

-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

[root@localhost test]# chmod a+x log2012.log 

[root@localhost test]# ls -al log2012.log 

-rwxr-xr-x 1 root root 302108 11-13 06:03 log2012.log

[root@localhost test]#

說明:
即設定文件log2012.log的屬性為:文件屬主(u) 增加執行權限與文件屬主同組用戶(g) 增加執行權限其他用戶(o) 增加執行權限

2同時修改不同用戶權限

命令:

chmod ug+w,o-x log2012.log

輸出:

[root@localhost test]# ls -al log2012.log 

-rwxr-xr-x 1 root root 302108 11-13 06:03 log2012.log

[root@localhost test]# chmod ug+w,o-x log2012.log 

[root@localhost test]# ls -al log2012.log 

-rwxrwxr-- 1 root root 302108 11-13 06:03 log2012.log

說明:
即設定文件text的屬性為:文件屬主(u) 增加寫權限;與文件屬主同組用戶(g) 增加寫權限;其他用戶(o) 刪除執行權限

實例3:刪除文件權限

命令:

chmod a-x log2012.log

輸出:

[root@localhost test]# ls -al log2012.log 

-rwxrwxr-- 1 root root 302108 11-13 06:03 log2012.log

[root@localhost test]# chmod a-x log2012.log 

[root@localhost test]# ls -al log2012.log 

-rw-rw-r-- 1 root root 302108 11-13 06:03 log2012.log

說明:
刪除所有用戶的可執行權限 

實例4使用“=”設置權限 

命令:

chmod u=x log2012.log

輸出:

[root@localhost test]# ls -al log2012.log 

-rw-rw-r-- 1 root root 302108 11-13 06:03 log2012.log

[root@localhost test]# chmod u=x log2012.log 

[root@localhost test]# ls -al log2012.log 

---xrw-r-- 1 root root 302108 11-13 06:03 log2012.log

說明:

撤銷原來所有的權限,然后使擁有者具有可讀權限 

實例5對一個目錄及其子目錄所有文件添加權限 

命令:

chmod -R u+x test4

輸出:

[root@localhost test]# cd test4

[root@localhost test4]# ls -al

總計 312drwxrwxr-x 2 root root   4096 11-13 05:50 .

drwxr-xr-x 5 root root   4096 11-22 06:58 ..

-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log

-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log

-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log

[root@localhost test4]# cd ..

[root@localhost test]# chmod -R u+x test4

[root@localhost test]# cd test4

[root@localhost test4]# ls -al

總計 312drwxrwxr-x 2 root root   4096 11-13 05:50 .

drwxr-xr-x 5 root root   4096 11-22 06:58 ..

-rwxr--r-- 1 root root 302108 11-12 22:54 log2012.log

-rwxr--r-- 1 root root     61 11-12 22:54 log2013.log

-rwxr--r-- 1 root root      0 11-12 22:54 log2014.log

說明:

遞歸地給test4目錄下所有文件和子目錄的屬主分配權限 

其他一些實例:

1

命令:

chmod 751 file

說明:

file的屬主分配讀、寫、執行(7)的權限,給file的所在組分配讀、執行(5)的權限,給其他用戶分配執行(1)的權限

2.

命令:

chmod u=rwx,g=rx,o=x file

說明:

上例的另一種形式

3.

命令

chmod =r file

說明:

為所有用戶分配讀權限

3.

命令:

chmod 444 file

說明: 

同上例

4.

命令:

chmod a-wx,a+r file

說明:

同上例





  1. 1.4.4 chmod命令的其他例子

  2. 以下是一些c h m o d命令絕對模式的例子:

  3. 命 令 結 果 含義

  4. chmod 666 rw- rw- rw- 賦予所有用戶讀和寫的權限

  5. chmod 644 rw- r-- r- - 賦予所有文件屬主讀和寫的權限,所有其他用戶讀權限

  6. chmod 744 rwx r-- r- - 賦予文件屬主讀、寫和執行的權限,所有其他用戶讀的權限

  7. chmod 664 rw- rw- r- - 賦予文件屬主和同組用戶讀和寫的權限,其他用戶讀權限

  8. chmod 700 rwx --- --- 賦予文件屬主讀、寫和執行的權限

  9. chmod 444 r-- r-- r- - 賦予所有用戶讀權限

  10. 性能分析命令:

    1. kill命令

Linux 中的kill命令用來終止指定的進程(terminate a process)的運行,是Linux下進程管理的常用命令。通常,終止一個前台進程可以 使用Ctrl+C鍵,但是,對於一個后台進程就須用kill命令來終止,我們就需要先使用ps/pidof/pstree/top等工具獲取進程PID, 然后使用kill命令來殺掉該進程。kill命令是通過向進程發送指定的信號來結束相應進程的。在默認情況下,采用編號為15TERM信號。TERM信 號將終止所有不能捕獲該信號的進程。對於那些可以捕獲該信號的進程就要用編號為9kill信號,強行“殺掉”該進程。

1命令格式:

kill[參數][進程號]

2命令功能:

發 送指定的信號到相應進程。不指定型號將發送SIGTERM15)終止指定進程。如果任無法終止該程序可用“-KILL” 參數,其發送的信號為 SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的 進程。

3命令參數:

-l 信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱

-a 當處理當前進程時,不限制命令名和進程號的對應關系

-p 指定kill 命令只打印相關進程的進程號,而不發送任何信號

-s 指定發送信號

-u 指定用戶

注意:

1kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發出終止信號(15),這個信號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用kill向進程發送特定的信號。例如:



kill -2 123

它的效果等同於在前台運行PID123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9信號。

2kill可以帶有進程ID號作為參數。當用kill向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有權限撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。

3、可以向多個進程發信號或終止它們。

4、當kill成功地發送了信號后,shell會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下Enter鍵使shell的命令提示符再次出現時,才會顯示出來。

5、 應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用kill信號 (9),因為進程不能首先捕獲它。要撤銷所有的后台作業,可以輸入kill 0。因為有些在后台運行的命令會啟動多個進程,跟蹤並找到所有要殺掉的進程的 PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啟動的進程,是個有效的方法。

4使用實例:

實例1列出所有信號名稱

命令:

kill -l

輸出:

[root@localhost test6]# kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL

 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE

 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2

13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT

17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU

25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH

29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN

35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4

39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6

59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

說明:

只有第9種信號(SIGKILL)才可以無條件終止進程,其他信號進程都有權利忽略。 下面是常用的信號:

HUP 1 終端斷線

INT 2 中斷(同 Ctrl + C

QUIT 3 退出(同 Ctrl + \

TERM 15 終止

KILL 9 強制終止

CONT 18 繼續(與STOP相反, fg/bg命令)

STOP 19 暫停(同 Ctrl + Z

實例2:得到指定信號的數值

命令:

輸出:

[root@localhost test6]# kill -l KILL

9[root@localhost test6]# kill -l SIGKILL

9[root@localhost test6]# kill -l TERM

15[root@localhost test6]# kill -l SIGTERM

15[root@localhost test6]#

說明:

實例3:先用ps查找進程,然后用kill殺掉

命令:

kill 3268

輸出:

[root@localhost test6]# ps -ef|grep vim 

root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log

root      3370  2822  0 16:21 pts/0    00:00:00 grep vim

[root@localhost test6]# kill 3268 

[root@localhost test6]# kill 3268 

-bash: kill: (3268) - 沒有那個進程

[root@localhost test6]#

說明:

實例4徹底殺死進程

命令:

kill –9 3268

輸出:

[root@localhost test6]# ps -ef|grep vim 

root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log

root      3370  2822  0 16:21 pts/0    00:00:00 grep vim

[root@localhost test6]# kill –9 3268 

[root@localhost test6]# kill 3268 

-bash: kill: (3268) - 沒有那個進程

[root@localhost test6]#

說明:

實例5殺死指定用戶所有進程

命令:

kill -9 $(ps -ef | grep peidalinux)

kill -u peidalinux

輸出:

[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux) 

[root@localhost ~]# kill -u peidalinux

說明:

方法一,過濾出hnlinux用戶進程並殺死

實例6init進程是不可殺的

命令:

kill -9 1

輸出:

[root@localhost ~]# ps -ef|grep init

root         1     0  0 Nov02 ?        00:00:00 init [3]                  

root     17563 17534  0 17:37 pts/1    00:00:00 grep init

[root@localhost ~]# kill -9 1

[root@localhost ~]# kill -HUP 1

[root@localhost ~]# ps -ef|grep init

root         1     0  0 Nov02 ?        00:00:00 init [3]                  

root     17565 17534  0 17:38 pts/1    00:00:00 grep init

[root@localhost ~]# kill -KILL 1

[root@localhost ~]# ps -ef|grep init

root         1     0  0 Nov02 ?        00:00:00 init [3]                  

root     17567 17534  0 17:38 pts/1    00:00:00 grep init

[root@localhost ~]#

說明:

init Linux系統操作中不可缺少的程序之一。所謂的init進程,它是一個由內核啟動的用戶級進程。內核自行啟動(已經被載入內存,開始運行,並已初始化 所有的設備驅動程序和數據結構等)之后,就通過啟動一個用戶級程序init的方式,完成引導進程。所以,init始終是第一個進程(其進程編號始終為 1)。 其它所有進程都是init進程的子孫。init進程是不可殺的!

    1. killall命令

Linux 系統中的killall命令用於殺死指定名字的進程(kill processes by name)。我們可以使用kill命令殺死指定進程PID的進 程,如果要找到我們需要殺死的進程,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall把這兩個過程合二為一,是一個很好用的命 令。

1命令格式:

killall[參數][進程名]

2命令功能:

用來結束同名的的所有進程

3命令參數:

-Z 只殺死擁有scontext 的進程

-e 要求匹配進程名稱

-I 忽略小寫

-g 殺死進程組而不是進程

-i 交互模式,殺死進程前先詢問用戶

-l 列出所有的已知信號名稱

-q 不輸出警告信息

-s 發送指定的信號

-v 報告信號是否成功發送

-w 等待進程死亡

--help 顯示幫助信息

--version 顯示版本顯示

4使用實例:

實例1殺死所有同名進程

命令:

killall vi

輸出:

[root@localhost ~]# ps -ef|grep vi

root     17581 17398  0 17:51 pts/0    00:00:00 vi test.txt

root     17611 17582  0 17:51 pts/1    00:00:00 grep vi

[root@localhost ~]# ps -ef|grep vi

root     17581 17398  0 17:51 pts/0    00:00:00 vi test.txt

root     17640 17612  0 17:51 pts/2    00:00:00 vi test.log

root     17642 17582  0 17:51 pts/1    00:00:00 grep vi

[root@localhost ~]# killall vi

[root@localhost ~]# ps -ef|grep vi

root     17645 17582  0 17:52 pts/1    00:00:00 grep vi

說明:

實例2向進程發送指定信號

命令:

后台運行程序vi &

殺死 vi進程killall -TERM vi或者 killall -KILL vi

輸出:

[root@localhost ~]# vi & 

[1] 17646[root@localhost ~]# killall -TERM vi

[1]+  Stopped                 vi

[root@localhost ~]# vi & 

[2] 17648[root@localhost ~]# ps -ef|grep vi

root     17646 17582  0 17:54 pts/1    00:00:00 vi

root     17648 17582  0 17:54 pts/1    00:00:00 vi

root     17650 17582  0 17:55 pts/1    00:00:00 grep vi

[2]+  Stopped                 vi

[root@localhost ~]# killall -TERM vi

[root@localhost ~]# ps -ef|grep vi

root     17646 17582  0 17:54 pts/1    00:00:00 vi

root     17648 17582  0 17:54 pts/1    00:00:00 vi

root     17653 17582  0 17:55 pts/1    00:00:00 grep vi

[root@localhost ~]# killall -KILL vi

[1]-  已殺死               vi

[2]+  已殺死               vi

[root@localhost ~]# ps -ef|grep vi

root     17656 17582  0 17:56 pts/1    00:00:00 grep vi

[root@localhost ~]#

說明:

實例3:把所有的登錄后的shell給殺掉

命令:

killall -9 bash

輸出:

[root@localhost ~]# w

 18:01:03 up 41 days, 18:53,  3 users,  load average: 0.00, 0.00, 0.00USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    10.2.0.68        14:58    9:52   0.10s  0.10s -bash

root     pts/1    10.2.0.68        17:51    0.00s  0.02s  0.00s w

root     pts/2    10.2.0.68        17:51    9:24   0.01s  0.01s -bash

[root@localhost ~]# killall -9 bash

[root@localhost ~]# w

 18:01:48 up 41 days, 18:54,  1 user,  load average: 0.07, 0.02, 0.00USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    10.2.0.68        18:01    0.00s  0.01s  0.00s w

[root@localhost ~]#

說明:

運行命令:killall -9 bash 后,所有bash都會被卡掉了,所以當前所有連接丟失了。需要重新連接並登錄。

    1. top命令

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。下面詳細介紹它的使用方法。top是 一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前台執行該命令,它將獨占前台,直到用戶終止該程序為止.比較准確的說,top命令提供 了實時的對系統處理器的狀態監視.它將顯示系統中CPU最“敏感”的任務列表.該命令可以按CPU使用.內存使用和執行時間對任務進行排序;而且該命令的 很多特性都可以通過交互式命令或者在個人定制文件中進行設定.

1命令格式:

top [參數]

2命令功能:

顯示當前系統正在執行的進程的相關信息,包括進程ID、內存占用率、CPU占用率等

3命令參數:

-b 批處理

-c 顯示完整的治命令

-I 忽略失效過程

-s 保密模式

-S 累積模式

-i<時間> 設置間隔時間

-u<用戶名> 指定用戶名

-p<進程號> 指定進程

-n<次數> 循環顯示的次數

4使用實例:

實例1:顯示進程信息

命令:

top

輸出:

[root@TG1704 log]# top

top - 14:06:23 up 70 days, 16:44,  2 users,  load average: 1.25, 1.32, 1.35

Tasks: 206 total,   1 running, 205 sleeping,   0 stopped,   0 zombie

Cpu(s):  5.9%us,  3.4%sy,  0.0%ni, 90.4%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st

Mem:  32949016k total, 14411180k used, 18537836k free,   169884k buffers

Swap: 32764556k total,        0k used, 32764556k free,  3612636k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                

28894 root      22   0 1501m 405m  10m S 52.2  1.3   2534:16 java                                                                   

18249 root      18   0 3201m 1.9g  11m S 35.9  6.0 569:39.41 java                                                                   

 2808 root      25   0 3333m 1.0g  11m S 24.3  3.1 526:51.85 java                                                                   

25668 root      23   0 3180m 704m  11m S 14.0  2.2 360:44.53 java                                                                   

  574 root      25   0 3168m 611m  10m S 12.6  1.9 556:59.63 java                                                                   

 1599 root      20   0 3237m 1.9g  11m S 12.3  6.2 262:01.14 java                                                                   

 1008 root      21   0 3147m 842m  10m S  0.3  2.6   4:31.08 java                                                                   

13823 root      23   0 3031m 2.1g  10m S  0.3  6.8 176:57.34 java                                                                   

28218 root      15   0 12760 1168  808 R  0.3  0.0   0:01.43 top                                                                    

29062 root      20   0 1241m 227m  10m S  0.3  0.7   2:07.32 java                                                                   

    1 root      15   0 10368  684  572 S  0.0  0.0   1:30.85 init                                                                   

    2 root      RT  -5     0    0    0 S  0.0  0.0   0:01.01 migration/0                                                            

    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0                                                            

    4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0                                                             

    5 root      RT  -5     0    0    0 S  0.0  0.0   0:00.80 migration/1                                                            

    6 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1                                                            

    7 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/1                                                             

    8 root      RT  -5     0    0    0 S  0.0  0.0   0:20.59 migration/2                                                            

    9 root      34  19     0    0    0 S  0.0  0.0   0:00.09 ksoftirqd/2                                                            

   10 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/2                                                             

   11 root      RT  -5     0    0    0 S  0.0  0.0   0:23.66 migration/3                                                            

   12 root      34  19     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/3                                                            

   13 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/3                                                             

   14 root      RT  -5     0    0    0 S  0.0  0.0   0:20.29 migration/4                                                            

   15 root      34  19     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/4                                                            

   16 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/4                                                             

   17 root      RT  -5     0    0    0 S  0.0  0.0   0:23.07 migration/5                                                            

   18 root      34  19     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/5                                                            

   19 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/5                                                             

   20 root      RT  -5     0    0    0 S  0.0  0.0   0:17.16 migration/6                                                            

   21 root      34  19     0    0    0 S  0.0  0.0   0:00.05 ksoftirqd/6                                                            

   22 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/6                                                             

   23 root      RT  -5     0    0    0 S  0.0  0.0   0:58.28 migration/7

說明:

統計信息區

前五行是當前系統情況整體的統計信息下面我們看每一行信息的具體意義。

第一行,任務隊列信息,同 uptime 命令的執行結果,具體參數說明情況如下:

14:06:23 — 當前系統時間

up 70 days, 16:44 — 系統已經運行了7016小時44分鍾(在這期間系統沒有重啟過的吆!)

2 users — 當前有2個用戶登錄系統

load average: 1.15, 1.42, 1.44 — load average后面的三個數分別是1分鍾、5分鍾、15分鍾的負載情況。

load average數據是每隔5秒鍾檢查一次活躍的進程數,然后按特定算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。

第二行,Tasks — 任務(進程),具體信息說明如下:

系統現在共有206個進程,其中處於運行中的有1個,205個在休眠(sleep),stoped狀態的有0個,zombie狀態(僵屍)的有0個。

第三行,cpu狀態信息,具體屬性說明如下:

5.9%us — 用戶空間占用CPU的百分比。

3.4% sy — 內核空間占用CPU的百分比。

0.0% ni — 改變過優先級的進程占用CPU的百分比

90.4% id — 空閑CPU百分比

0.0% wa — IO等待占用CPU的百分比

0.0% hi — 硬中斷(Hardware IRQ)占用CPU的百分比

0.2% si — 軟中斷(Software Interrupts)占用CPU的百分比

備注:在這里CPU的使用比率和windows概念不同,需要理解linux系統用戶空間和內核空間的相關知識!

第四行,內存狀態,具體信息如下:

32949016k total — 物理內存總量(32GB

14411180k used — 使用中的內存總量(14GB

18537836k free — 空閑內存總量(18GB

169884k buffers — 緩存的內存量 (169M

第五行,swap交換分區信息,具體信息說明如下:

32764556k total — 交換區總量(32GB

0k used — 使用的交換區總量(0K

32764556k free — 空閑交換區總量(32GB

3612636k cached — 緩沖的交換區總量(3.6GB

備注:

第 四行中使用中的內存總量(used)指的是現在系統內核控制的內存數,空閑內存總量(free)是內核還未納入其管控范圍的數量。納入內核管理的內存不見 得都在使用中,還包括過去使用過的現在可以被重復利用的內存,內核並不把這些可被重新使用的內存交還到free中去,因此在linuxfree內存會越 來越少,但不用為此擔心。

如果出於習慣去計算可用內存數,這里有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached,按這個公式此台服務器的可用內存:18537836k +169884k +3612636k = 22GB左右。

對於內存監控,在top里我們要時刻監控第五行swap交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行內存和swap的數據交換,這是真正的內存不夠用了。

第六行,空行。

第七行以下:各進程(任務)的狀態監控,項目列信息說明如下:

PID — 進程id

USER — 進程所有者

PR — 進程優先級

NI — nice值。負值表示高優先級,正值表示低優先級

VIRT — 進程使用的虛擬內存總量,單位kbVIRT=SWAP+RES

RES — 進程使用的、未被換出的物理內存大小,單位kbRES=CODE+DATA

SHR — 共享內存大小,單位kb

S — 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵屍進程

%CPU — 上次更新到現在的CPU時間占用百分比

%MEM — 進程使用的物理內存百分比

TIME+ — 進程使用的CPU時間總計,單位1/100

COMMAND — 進程名稱(命令名/命令行)

其他使用技巧:

1.U多核CPU監控

top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況:

 

觀察上圖,服務器有16個邏輯CPU,實際上是4個物理CPU。再按數字鍵1,就會返回到top基本視圖界面。

2.高亮顯示當前運行進程

敲擊鍵盤“b”(打開/關閉加亮效果),top的視圖變化如下:

     

我們發現進程id2570的“top”進程被加亮了,top進程就是視圖第二行顯示的唯一的運行態(runing)的那個進程,可以通過敲擊“y”鍵關閉或打開運行態進程的加亮效果。

3.進程字段排序

默認進入top時,各進程是按照CPU的占用量來排序的,在下圖中進程ID28894java進程排在第一(cpu占用142%),進程ID574java進程排在第二(cpu占用16%)。

      

敲擊鍵盤“x”(打開/關閉排序列的加亮效果),top的視圖變化如下:

       

可以看到,top默認的排序列是“%CPU”

4. 通過”shift + >”或”shift + <”可以向右或左改變排序列

下圖是按一次”shift + >”的效果圖,視圖現在已經按照%MEM來排序。

         

實例2:顯示 完整命令

命令:

top -c

輸出:

      

說明:

實例3:以批處理模式顯示程序信息

命令:

top -b

輸出:

說明:

實例4以累積模式顯示程序信息

命令:

top -S

輸出:

說明:

實例5設置信息更新次數

命令:

  top -n 2

輸出:

說明:

表示更新兩次后終止更新顯示

實例6:設置信息更新時間

命令:

top -d 3

輸出:

說明:

表示更新周期為3

實例7:顯示指定的進程信息

命令:

top -p 574

輸出:


說明:

     5.top交互命令

top 命令執行過程中可以使用的一些交互命令。這些命令都是單字母的,如果在命令行中使用了s 選項, 其中一些命令可能會被屏蔽。

h 顯示幫助畫面,給出一些簡短的命令總結說明

k 終止一個進程。

i 忽略閑置和僵死進程。這是一個開關式命令。

q 退出程序

r 重新安排一個進程的優先級別

S 切換到累計模式

s 改變兩次刷新之間的延遲時間(單位為s),如果有小數,就換算成m s。輸入0值則系統將不斷刷新,默認值是5 s

f或者F 從當前顯示中添加或者刪除項目

o或者O 改變顯示項目的順序

l 切換顯示平均負載和啟動時間信息

m 切換顯示內存信息

t 切換顯示進程和CPU狀態信息

c 切換顯示命令名稱和完整命令行

M 根據駐留內存大小進行排序

P 根據CPU使用百分比大小進行排序

T 根據時間/累計時間進行排序

將當前設置寫入~/.toprc文件中  

    1. free 命令

free命令可以顯示Linux系統中空閑的、已用的物理內存及swap內存,及被內核使用的buffer。在Linux系統監控的工具中,free命令是最經常使用的命令之一。

1命令格式:

free [參數]

2命令功能:

free 命令顯示系統使用和空閑的內存情況,包括物理內存、交互區內存(swap)和內核緩沖區內存。共享內存將被忽略

3命令參數:

-b Byte為單位顯示內存使用情況。

-k KB為單位顯示內存使用情況。

-m MB為單位顯示內存使用情況。

-g GB為單位顯示內存使用情況。

-o 不顯示緩沖區調節列。

-s<間隔秒數> 持續觀察內存使用狀況。

-t 顯示內存總和列。

-V 顯示版本信息。

4使用實例:

實例1:顯示內存使用情況

命令:

free

free -g

free -m

輸出:

[root@SF1150 service]# free

             total       used       free     shared    buffers     cached

Mem:      32940112   30841684    2098428          0    4545340   11363424

-/+ buffers/cache:   14932920   18007192

Swap:     32764556    1944984   30819572

[root@SF1150 service]# free -g

             total       used       free     shared    buffers     cached

Mem:            31         29          2          0          4         10

-/+ buffers/cache:         14         17

Swap:           31          1         29

[root@SF1150 service]# free -m

             total       used       free     shared    buffers     cached

Mem:         32168      30119       2048          0       4438      11097

-/+ buffers/cache:      14583      17584

Swap:        31996       1899      30097

說明:

下面是對這些數值的解釋:

total:總計物理內存的大小。

used:已使用多大。

free:可用有多少。

Shared:多個進程共享的內存總額。

Buffers/cached:磁盤緩存的大小。

第三行(-/+ buffers/cached):

used:已使用多大。

free:可用有多少。

第四行是交換分區SWAP的,也就是我們通常所說的虛擬內存。

區 別:第二行(mem)used/free與第三行(-/+ buffers/cache) used/free的區別。 這兩個的區別在於使用的角度來 看,第一行是從OS的角度來看,因為對於OSbuffers/cached 都是屬於被使用,所以他的可用內存是2098428KB,已用內存是 30841684KB,其中包括,內核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.

第三行所指的是從應用程序角度來看,對於應用程序來說,buffers/cached 是等於可用的,因為buffer/cached是為了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。

所以從應用程序的角度來說,可用內存=系統free memory+buffers+cached

如本機情況的可用內存為:

18007156=2098428KB+4545340KB+11363424KB

接下來解釋什么時候內存會被交換,以及按什么方交換。 

當可用內存少於額定值的時候,就會開會進行交換.如何看額定值:

命令:

cat /proc/meminfo

輸出:

[root@SF1150 service]# cat /proc/meminfo

MemTotal:     32940112 kB

MemFree:       2096700 kB

Buffers:       4545340 kB

Cached:       11364056 kB

SwapCached:    1896080 kB

Active:       22739776 kB

Inactive:      7427836 kB

HighTotal:           0 kB

HighFree:            0 kB

LowTotal:     32940112 kB

LowFree:       2096700 kB

SwapTotal:    32764556 kB

SwapFree:     30819572 kB

Dirty:             164 kB

Writeback:           0 kB

AnonPages:    14153592 kB

Mapped:          20748 kB

Slab:           590232 kB

PageTables:      34200 kB

NFS_Unstable:        0 kB

Bounce:              0 kB

CommitLimit:  49234612 kB

Committed_AS: 23247544 kB

VmallocTotal: 34359738367 kB

VmallocUsed:    278840 kB

VmallocChunk: 34359459371 kB

HugePages_Total:     0HugePages_Free:      0HugePages_Rsvd:      0Hugepagesize:     2048 kB

交換將通過三個途徑來減少系統中使用的物理頁面的個數:

1.減少緩沖與頁面cache的大小,

2.將系統V類型的內存頁面交換出去,

3.換出或者丟棄頁面。(Application 占用的內存頁,也就是物理內存不足)。

事實上,少量地使用swap是不是影響到系統性能的。

bufferscached都是緩存,兩者有什么區別呢?

為 了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還采取了兩種 主要Cache方式:Buffer CachePage Cache。前者針對磁盤塊的讀寫,后者針對文件inode的讀寫。這些Cache有效縮短 了 I/O系統調用(比如read,write,getdents)的時間。

磁盤的操作有邏輯級(文件系統)和物理級(磁盤塊),這兩種Cache就是分別緩存邏輯和物理級數據的。

Page cache 實際上是針對文件系統的,是文件的緩存,在文件層面上的數據會緩存到page cache。文件的邏輯層需要映射到實際的物理磁盤,這種映射關系由文件系 統來完成。當page cache的數據需要刷新時,page cache中的數據交給buffer cache,因為Buffer Cache就是緩存 磁盤塊的。但是這種處理在2.6版本的內核之后就變的很簡單了,沒有真正意義上的cache操作。

Buffer cache是針對磁盤塊的緩存,也就是在沒有文件系統的情況下,直接對磁盤進行操作的數據會緩存到buffer cache中,例如,文件系統的元數據都會緩存到buffer cache中。

簡單說來,page cache用來緩存文件數據,buffer cache用來緩存磁盤數據。在有文件系統的情況下,對文件操作,那么數據會緩存到page cache,如果直接采用dd等工具對磁盤進行讀寫,那么數據會緩存到buffer cache

所以我們看linux,只要不用swap的交換空間,就不用擔心自己的內存太少.如果常常swap用很多,可能你就要考慮加物理內存了.這也是linux看內存是否夠用的標准.

如果是應用服務器的話,一般只看第二行,+buffers/cache,即對應用程序來說free的內存太少了,也是該考慮優化程序或加內存了。

實例2:以總和的形式顯示內存的使用信息

命令:

 free -t

輸出:

[root@SF1150 service]#  free -t 

             total       used       free     shared    buffers     cached

Mem:      32940112   30845024    2095088          0    4545340   11364324

-/+ buffers/cache:   14935360   18004752Swap:     32764556    1944984   30819572Total:    65704668   32790008   32914660[root@SF1150 service]#

說明:

實例3:周期性的查詢內存使用信息

命令:

free -s 10

輸出:

[root@SF1150 service]#  free -s 10

             total       used       free     shared    buffers     cached

Mem:      32940112   30844528    2095584          0    4545340   11364380

-/+ buffers/cache:   14934808   18005304Swap:     32764556    1944984   30819572

             total       used       free     shared    buffers     cached

Mem:      32940112   30843932    2096180          0    4545340   11364388

-/+ buffers/cache:   14934204   18005908Swap:     32764556    1944984   30819572

說明:

10s 執行一次命令

    1. vmstat命令

vmstat Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監控。他是對系統的整體 情況進行統計,不足之處是無法對某個進程進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方式。因為 vmstat 本身就是低開銷工具,在非常高負荷的服務器上,你需要查看並監控系統的健康情況,在控制窗口還是能夠使用vmstat 輸出結果。在學習vmstat命令前,我們先了解一下Linux系統中關於物理內存和虛擬內存相關信息。

物理內存和虛擬內存區別:

我們知道,直接從物理內存讀寫數據要比從硬盤讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。

物理內存就是系統硬件提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁盤空間虛擬出的一塊邏輯內存,用作虛擬內存的磁盤空間被稱為交換空間(Swap Space)。

作為物理內存的擴展,linux會在物理內存不足時,使用交換分區的虛擬內存,更詳細的說,就是內核會將暫時不用的內存塊信息寫到交換空間,這樣以來,物理內存得到了釋放,這塊內存就可以用於其它目的,當需要用到原始的內容時,這些信息會被重新從交換空間讀入物理內存。

linux的內存管理采取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。

要深入了解linux內存運行機制,需要知道下面提到的幾個方面:

首先,Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑物理內存,即使並沒有什么事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間。

其 次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬內存,linux內核根據”最近最經常使用“算法,僅僅將一些不經常使用的頁面 文件交換到虛擬內存,有時我們會看到這么一個現象:linux物理內存還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個占用很大內存的 進程運行時,需要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但后來這個占用很多內存資源的進程結束並釋放了很多內存時,剛才被 交換出去的頁面文件並不會自動的交換進物理內存,除非有這個必要,那么此刻系統物理內存就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象 了。關於這點,不用擔心什么,只要知道是怎么一回事就可以了。

最 后,交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有 足夠空間來存儲這些交換頁面,最終會導致linux出現假死機、服務異常等問題,linux雖然可以在一段時間內自行恢復,但是恢復后的系統已經基本不可 用了。

因此,合理規划和設計linux內存的使用,是非常重要的。

虛擬內存原理:

在 系統中運行的每個進程都需要使用到內存,但不是每個進程都需要每時每刻使用系統分配的內存空間。當系統運行所需內存超過實際的物理內存,內核會釋放某些進 程所占用但未使用的部分或所有物理內存,將這部分資料存儲在磁盤上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。

Linux內存管理中,主要是通過“調頁Paging”和“交換Swapping”來完成上述的內存調度。調頁算法是將內存中最近不常使用的頁面換到磁盤上,把活動頁面保留在內存中供進程使用。交換技術是將整個進程,而不是部分頁面,全部交換到磁盤上。

分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內存的過程被稱作Page-In。當內核需要一個分頁時,但發現此分頁不在物理內存中(因為已經被Page-Out),此時就發生了分頁錯誤(Page Fault)。

當 系統內核發現可運行內存變少時,就會通過Page-Out來釋放一部分物理內存。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的 發生,直到當內核管理分頁的時間超過運行程式的時間時,系統效能會急劇下降。這時的系統已經運行非常慢或進入暫停狀態,這種狀態亦被稱作 thrashing(顛簸)

 

1.命令格式:

vmstat [-a] [-n] [-S unit] [delay [ count]]

vmstat [-s] [-n] [-S unit]

vmstat [-m] [-n] [delay [ count]]

vmstat [-d] [-n] [delay [ count]]

vmstat [-p disk partition] [-n] [delay [ count]]

vmstat [-f]

vmstat [-V]

2.命令功能:

用來顯示虛擬內存的信息

3.命令參數:

-a:顯示活躍和非活躍內存

-f:顯示從系統啟動至今的fork數量 。

-m:顯示slabinfo

-n:只在開始時顯示一次各字段名稱。

-s:顯示內存相關統計信息及多種系統活動數量。

delay:刷新時間間隔。如果不指定,只顯示一條結果。

count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。

-d:顯示磁盤相關統計信息。

-p:顯示指定磁盤分區統計信息

-S:使用指定單位顯示。參數有 k K m M ,分別代表1000102410000001048576字節(byte)。默認單位為K1024 bytes

-V:顯示vmstat版本信息。

4.使用實例:

實例1顯示虛擬內存使用情況

命令:

vmstat

輸出:


[root@localhost ~]# vmstat 5 6
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   
in   cs us sy id wa st
 0  0      0 3029876 199616 690980    0    0     0     2    3    2  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0    41 1009   39  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0     3 1004   36  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0     4 1004   36  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0     6 1003   33  0  0 100  0  0


 0  0      0 3029752 199616 690980    0    0     0     5 1003   33  0  0 100  0  0 

說明:

字段說明:

Procs(進程):

r: 運行隊列中進程數量

b: 等待IO的進程數量

Memory(內存):

swpd: 使用虛擬內存大小

free: 可用內存大小

buff: 用作緩沖的內存大小

cache: 用作緩存的內存大小

Swap

si: 每秒從交換區寫到內存的大小

so: 每秒寫入交換區的內存大小

IO:(現在的Linux版本塊的大小為1024bytes

bi: 每秒讀取的塊數

bo: 每秒寫入的塊數

系統:

in: 每秒中斷數,包括時鍾中斷。

cs: 每秒上下文切換數。

CPU(以百分比表示):

us: 用戶進程執行時間(user time)

sy: 系統進程執行時間(system time)

id: 空閑時間(包括IO等待時間),中央處理器的空閑時間 。以百分比表示。

wa: 等待IO時間

備注: 如 果 r經常大於 4 ,且id經常少於40,表示cpu的負荷很重。如果pipo 長期不等於0,表示內存不足。如果disk 經常不等於0, 且 在 b中的隊列 大於3, 表示 io性能不好。Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,能夠針對不同的應用和硬件環境調 整,優化出滿足當前應用需要的最佳性能。因此企業在維護Linux系統、進行系統調優時,了解系統性能分析工具是至關重要的。

命令:

vmstat 5 5

表示在5秒時間內進行5次采樣。將得到一個數據匯總他能夠反映真正的系統情況。

實例2:顯示活躍和非活躍內存

命令:

vmstat -a 2 5

輸出:


[root@localhost ~]# vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free  inact active   si   so    bi    bo   
in   cs us sy id wa st
 0  0      0 3029752 387728 513008    0    0     0     2    3    2  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0     0 1005   34  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0    22 1004   36  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0     0 1004   33  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0     0 1003   32  0  0 100  0  0


[root@localhost ~] 

說明:

使用-a選項顯示活躍和非活躍內存時,所顯示的內容除增加inactactive外,其他顯示內容與例子1相同。

字段說明:

Memory(內存):

inact: 非活躍內存大小(當使用-a選項時顯示)

active: 活躍的內存大小(當使用-a選項時顯示)

實例3:查看系統已經fork了多少次

命令:

vmstat -f

輸出:

[root@SCF1129 ~]# vmstat -f

     12744849 forks

[root@SCF1129 ~]#

說明:

這個數據是從/proc/stat中的processes字段里取得的

實例4查看內存使用的詳細信息

命令:

vmstat -s

輸出:


[root@localhost ~]# vmstat -s
      4043760  total memory
      1013884  used memory
       513012  active memory
       387728  inactive memory
      3029876  free memory
       199616  buffer memory
       690980  swap cache
      6096656  total swap
            0  used swap
      6096656  free swap
        83587 non-nice user cpu ticks
          132 nice user cpu ticks
       278599 system cpu ticks
    913344692 idle cpu ticks
       814550 IO-wait cpu ticks
        10547 IRQ cpu ticks
        21261 softirq cpu ticks
            0 stolen cpu ticks
       310215 pages paged 
in
     14254652 pages paged out
            0 pages swapped 
in
            0 pages swapped out
    288374745 interrupts
    146680577 CPU context switches
   1351868832 boot time
       367291 forks 


說明:

這些信息的分別來自於/proc/meminfo,/proc/stat/proc/vmstat

實例5:查看磁盤的讀/

命令:

vmstat -d

輸出:

 


[root@localhost ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
ram0       0      0       0       0      0      0       0       0      0      0
ram1       0      0       0       0      0      0       0       0      0      0
ram2       0      0       0       0      0      0       0       0      0      0
ram3       0      0       0       0      0      0       0       0      0      0
ram4       0      0       0       0      0      0       0       0      0      0
ram5       0      0       0       0      0      0       0       0      0      0
ram6       0      0       0       0      0      0       0       0      0      0
ram7       0      0       0       0      0      0       0       0      0      0
ram8       0      0       0       0      0      0       0       0      0      0
ram9       0      0       0       0      0      0       0       0      0      0
ram10      0      0       0       0      0      0       0       0      0      0
ram11      0      0       0       0      0      0       0       0      0      0
ram12      0      0       0       0      0      0       0       0      0      0
ram13      0      0       0       0      0      0       0       0      0      0
ram14      0      0       0       0      0      0       0       0      0      0
ram15      0      0       0       0      0      0       0       0      0      0
sda    33381   6455  615407   63224 2068111 1495416 28508288 15990289      0  10491
hdc        0      0       0       0      0      0       0       0      0      0
fd0        0      0       0       0      0      0       0       0      0      0
md0        0      0       0       0      0      0       0       0      0      0
[root@localhost ~]


 

說明:

這些信息主要來自於/proc/diskstats.

merged:表示一次來自於合並的寫/讀請求,一般系統會把多個連接/鄰近的讀/寫請求合並到一起來操作.

實例6:查看/dev/sda1磁盤的讀/

命令:

輸出:

[root@SCF1129 ~]# df

文件系統                 1K-塊      已用      可用 已用掛載點

/dev/sda3            1119336548  27642068 1034835500   3% /tmpfs                 32978376         0  32978376   0% /dev/shm

/dev/sda1              1032088     59604    920056   7% /boot

[root@SCF1129 ~]# vmstat -p /dev/sda1

sda1          reads   read sectors  writes    requested writes

               18607    4249978          6         48[root@SCF1129 ~]# vmstat -p /dev/sda3

sda3          reads   read sectors  writes    requested writes

              429350   35176268   28998789  980301488[root@SCF1129 ~]#

說明:

這些信息主要來自於/proc/diskstats

reads:來自於這個分區的讀的次數。

read sectors:來自於這個分區的讀扇區的次數。

writes:來自於這個分區的寫的次數。

requested writes:來自於這個分區的寫請求次數。

實例7:查看系統的slab信息

命令:

vmstat -m

輸出:


[root@localhost ~]# vmstat -m
Cache                       Num  Total   Size  Pages
ip_conntrack_expect           0      0    136     28
ip_conntrack                  3     13    304     13
ip_fib_alias                 11     59     64     59
ip_fib_hash                  11     59     64     59
AF_VMCI                       0      0    960      4
bio_map_info                100    105   1064      7
dm_mpath                      0      0   1064      7
jbd_4k                        0      0   4096      1
dm_uevent                     0      0   2608      3
dm_tio                        0      0     24    144
dm_io                         0      0     48     77
scsi_cmd_cache               10     10    384     10
sgpool-128                   32     32   4096      1
sgpool-64                    32     32   2048      2
sgpool-32                    32     32   1024      4
sgpool-16                    32     32    512      8
sgpool-8                     45     45    256     15
scsi_io_context               0      0    112     34
ext3_inode_cache          51080  51105    760      5
ext3_xattr                   36     88     88     44
journal_handle               18    144     24    144
journal_head                 56     80     96     40
revoke_table                  4    202     16    202
revoke_record                 0      0     32    112
uhci_urb_priv                 0      0     56     67
UNIX                         13     33    704     11
flow_cache                    0      0    128     30
msi_cache                    33     59     64     59
cfq_ioc_pool                 14     90    128     30
cfq_pool                     12     90    216     18
crq_pool                     16     96     80     48
deadline_drq                  0      0     80     48
as_arq                        0      0     96     40
mqueue_inode_cache            1      4    896      4
isofs_inode_cache             0      0    608      6
hugetlbfs_inode_cache         1      7    576      7
Cache                       Num  Total   Size  Pages
ext2_inode_cache              0      0    720      5
ext2_xattr                    0      0     88     44
dnotify_cache                 0      0     40     92
dquot                         0      0    256     15
eventpoll_pwq                 3     53     72     53
eventpoll_epi                 3     20    192     20
inotify_event_cache           0      0     40     92
inotify_watch_cache           1     53     72     53
kioctx                        0      0    320     12
kiocb                         0      0    256     15
fasync_cache                  0      0     24    144
shmem_inode_cache           254    290    768      5
posix_timers_cache            0      0    128     30
uid_cache                     0      0    128     30
ip_mrt_cache                  0      0    128     30
tcp_bind_bucket               3    112     32    112
inet_peer_cache               0      0    128     30
secpath_cache                 0      0     64     59
xfrm_dst_cache                0      0    384     10
ip_dst_cache                  5     10    384     10
arp_cache                     1     15    256     15
RAW                           3      5    768      5
UDP                           5     10    768      5
tw_sock_TCP                   0      0    192     20
request_sock_TCP              0      0    128     30
TCP                           4      5   1600      5
blkdev_ioc                   14    118     64     59
blkdev_queue                 20     30   1576      5
blkdev_requests              13     42    272     14
biovec-256                    7      7   4096      1
biovec-128                    7      8   2048      2
biovec-64                     7      8   1024      4
biovec-16                     7     15    256     15
biovec-4                      7     59     64     59
biovec-1                     23    202     16    202
bio                         270    270    128     30
utrace_engine_cache           0      0     64     59
Cache                       Num  Total   Size  Pages
utrace_cache                  0      0     64     59
sock_inode_cache             33     48    640      6
skbuff_fclone_cache           7      7    512      7
skbuff_head_cache           319    390    256     15
file_lock_cache               1     22    176     22
Acpi-Operand               4136   4248     64     59
Acpi-ParseExt                 0      0     64     59
Acpi-Parse                    0      0     40     92
Acpi-State                    0      0     80     48
Acpi-Namespace             2871   2912     32    112
delayacct_cache              81    295     64     59
taskstats_cache               4     53     72     53
proc_inode_cache           1427   1440    592      6
sigqueue                      0      0    160     24
radix_tree_node           13166  13188    536      7
bdev_cache                   23     24    832      4
sysfs_dir_cache            5370   5412     88     44
mnt_cache                    26     30    256     15
inode_cache                2009   2009    560      7
dentry_cache              60952  61020    216     18
filp                        479   1305    256     15
names_cache                   3      3   4096      1
avc_node                     14     53     72     53
selinux_inode_security      994   1200     80     48
key_jar                       2     20    192     20
idr_layer_cache              74     77    528      7
buffer_head              164045 164800     96     40
mm_struct                    51     56    896      4
vm_area_struct             1142   1958    176     22
fs_cache                     35    177     64     59
files_cache                  36     55    768      5
signal_cache                 72    162    832      9
sighand_cache                68     84   2112      3
task_struct                  76     80   1888      2
anon_vma                    458    864     24    144
pid                          83    295     64     59
shared_policy_node            0      0     48     77
Cache                       Num  Total   Size  Pages
numa_policy                  37    144     24    144
size-131072(DMA)              0      0 131072      1
size-131072                   0      0 131072      1
size-65536(DMA)               0      0  65536      1
size-65536                    1      1  65536      1
size-32768(DMA)               0      0  32768      1
size-32768                    2      2  32768      1
size-16384(DMA)               0      0  16384      1
size-16384                    5      5  16384      1
size-8192(DMA)                0      0   8192      1
size-8192                     7      7   8192      1
size-4096(DMA)                0      0   4096      1
size-4096                   110    111   4096      1
size-2048(DMA)                0      0   2048      2
size-2048                   602    602   2048      2
size-1024(DMA)                0      0   1024      4
size-1024                   344    352   1024      4
size-512(DMA)                 0      0    512      8
size-512                    433    480    512      8
size-256(DMA)                 0      0    256     15
size-256                   1139   1155    256     15
size-128(DMA)                 0      0    128     30
size-64(DMA)                  0      0     64     59
size-64                    5639   5782     64     59
size-32(DMA)                  0      0     32    112
size-128                    801    930    128     30
size-32                    3005   3024     32    112
kmem_cache                  137    137   2688      1


這組信息來自於/proc/slabinfo

slab:由於內核會有許多小對象,這些對象構造銷毀十分頻繁,比如i-nodedentry,這些對象如果每次構建的時候就向內存要一個頁(4kb),而其實只有幾個字節,這樣就會非常浪費,為了解決這個問題,就引入了一種新的機制來處理在同一個頁框中如何分配小存儲區,而slab可以對小對象進行分配,這樣就不用為每一個對象分配頁框,從而節省了空間,內核對一些小對象創建析構很頻繁,slab對這些小對象進行緩沖,可以重復利用,減少內存分配次數。


    1. iostat命令

Linux系統中的 iostat I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況,同時也會 匯報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。iostat屬 於sysstat軟件包。可以用yum install sysstat 直接安裝。

1命令格式:

iostat[參數][時間][次數]

2命令功能:

  通過iostat方便查看CPU、網卡、tty設備、磁盤、CD-ROM 等等設備的活動情況,負載信息

3命令參數:

-C 顯示CPU使用情況

-d 顯示磁盤使用情況

-k KB 為單位顯示

-m M 為單位顯示

-N 顯示磁盤陣列(LVM) 信息

-n 顯示NFS 使用情況

-p[磁盤] 顯示磁盤和分區的情況

-t 顯示終端和CPU的信息

-x 顯示詳細信息

-V 顯示版本信息

4使用實例:

實例1:顯示所有設備負載情況

命令:

iostat

輸出:


[root@CT1186 ~]# iostat
Linux 2.6.18-128.el5 (CT1186)   2012
1228

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.30    0.02    5.07    0.17    0.00   86.44

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              22.73        43.70       487.42  674035705 7517941952
sda1              0.00         0.00         0.00       2658        536
sda2              0.11         3.74         3.51   57721595   54202216
sda3              0.98         0.61        17.51    9454172  270023368
sda4              0.00         0.00         0.00          6          0
sda5              6.95         0.12       108.73    1924834 1677123536
sda6              2.20         0.18        31.22    2837260  481488056
sda7             12.48        39.04       326.45  602094508 5035104240


說明:

cpu屬性值說明:

%userCPU處在用戶模式下的時間百分比。

%niceCPU處在帶NICE值的用戶模式下的時間百分比。

%systemCPU處在系統模式下的時間百分比。

%iowaitCPU等待輸入輸出完成時間的百分比。

%steal:管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。

%idleCPU空閑時間百分比。

備注:如 果%iowait的值過高,表示硬盤存在I/O瓶頸,%idle值高,表示CPU較空閑,如果%idle值高但系統響應慢時,有可能是CPU等待分配內 存,此時應加大內存容量。%idle值如果持續低於10,那么系統的CPU處理能力相對較低,表明系統中最需要解決的資源是CPU

disk屬性值說明:

rrqm/s: 每秒進行 merge 的讀操作數目。即 rmerge/s

wrqm/s: 每秒進行 merge 的寫操作數目。即 wmerge/s

r/s: 每秒完成的讀 I/O 設備次數。即 rio/s

w/s: 每秒完成的寫 I/O 設備次數。即 wio/s

rsec/s: 每秒讀扇區數。即 rsect/s

wsec/s: 每秒寫扇區數。即 wsect/s

rkB/s: 每秒讀K字節數。是 rsect/s 的一半,因為每扇區大小為512字節。

wkB/s: 每秒寫K字節數。是 wsect/s 的一半。

avgrq-sz: 平均每次設備I/O操作的數據大小 (扇區)

avgqu-sz: 平均I/O隊列長度。

await: 平均每次設備I/O操作的等待時間 (毫秒)

svctm: 平均每次設備I/O操作的服務時間 (毫秒)

%util: 一秒中有百分之多少的時間用於 I/O 操作,即被io消耗的cpu百分比

備注:如 果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。如果 svctm 比較接近 await,說 明 I/O 幾乎沒有等待時間;如果 await 遠大於 svctm,說明I/O 隊列太長,io響應太慢,則需要進行必要優化。如果avgqu-sz 比較大,也表示有當量io在等待。

實例2:定時顯示所有信息

命令:

iostat 2 3

輸出:


[root@CT1186 ~]# iostat 2 3
Linux 2.6.18-128.el5 (CT1186)   2012
1228

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.30    0.02    5.07    0.17    0.00   86.44

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              22.73        43.70       487.42  674035705 7517947296
sda1              0.00         0.00         0.00       2658        536
sda2              0.11         3.74         3.51   57721595   54202216
sda3              0.98         0.61        17.51    9454172  270023608
sda4              0.00         0.00         0.00          6          0
sda5              6.95         0.12       108.73    1924834 1677125640
sda6              2.20         0.18        31.22    2837260  481488152
sda7             12.48        39.04       326.44  602094508 5035107144

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.88    0.00    7.94    0.19    0.00   83.00

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               6.00         0.00       124.00          0        248
sda1              0.00         0.00         0.00          0          0
sda2              0.00         0.00         0.00          0          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              0.00         0.00         0.00          0          0
sda6              0.00         0.00         0.00          0          0
sda7              6.00         0.00       124.00          0        248

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9.12    0.00    7.81    0.00    0.00   83.07

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               4.00         0.00        84.00          0        168
sda1              0.00         0.00         0.00          0          0
sda2              0.00         0.00         0.00          0          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              0.00         0.00         0.00          0          0
sda6              4.00         0.00        84.00          0        168
sda7              0.00         0.00         0.00          0          0 


說明:

每隔 2秒刷新顯示,且顯示3

實例3顯示指定磁盤信息

命令:

iostat -d sda1

輸出:

[root@CT1186 ~]# iostat -d sda1
Linux 2.6.18-128.el5 (CT1186)   2012
1228

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda1              0.00         0.00         0.00       2658        536

說明:

實例4:顯示ttyCpu信息

命令:

iostat -t

輸出:


[root@CT1186 ~]# iostat -t
Linux 2.6.18-128.el5 (CT1186)   2012
1228

Time: 14
5835
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.30    0.02    5.07    0.17    0.00   86.44

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              22.73        43.70       487.41  674035705 7517957864
sda1              0.00         0.00         0.00       2658        536
sda2              0.11         3.74         3.51   57721595   54202216
sda3              0.98         0.61        17.51    9454172  270024344
sda4              0.00         0.00         0.00          6          0
sda5              6.95         0.12       108.73    1924834 1677128808
sda6              2.20         0.18        31.22    2837260  481488712
sda7             12.48        39.04       326.44  602094508 5035113248 


說明:

實例5:以M為單位顯示所有信息

命令:

iostat -m

輸出:


[root@CT1186 ~]# iostat -m
Linux 2.6.18-128.el5 (CT1186)   2012
1228

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.30    0.02    5.07    0.17    0.00   86.44

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda              22.72         0.02         0.24     329119    3670881
sda1              0.00         0.00         0.00          1          0
sda2              0.11         0.00         0.00      28184      26465
sda3              0.98         0.00         0.01       4616     131848
sda4              0.00         0.00         0.00          0          0
sda5              6.95         0.00         0.05        939     818911
sda6              2.20         0.00         0.02       1385     235102
sda7             12.48         0.02         0.16     293991    2458553 


說明:

實例6:查看TPS和吞吐量信息

命令:

iostat -d -k 1 1

輸出:


[root@CT1186 ~]# iostat -d -k 1 1
Linux 2.6.18-128.el5 (CT1186)   2012
1228

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              22.72        21.85       243.71  337017916 3758984340
sda1              0.00         0.00         0.00       1329        268
sda2              0.11         1.87         1.76   28860797   27101108
sda3              0.98         0.31         8.75    4727086  135012508
sda4              0.00         0.00         0.00          3          0
sda5              6.95         0.06        54.37     962481  838566148
sda6              2.20         0.09        15.61    1418630  240744712
sda7             12.48        19.52       163.22  301047254 2517559596 


說明:

tps: 該設備每秒的傳輸次數 (Indicate the number of transfers per second that were issued to the device.)。 “一次傳輸”意思是“一次I/O請求”。多個邏輯請求可能會被合並為“一次I/O請求”。“一次傳輸”請求的大小是未知的。

kB_read/s:每秒從設備(drive expressed)讀取的數據量;

kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;

kB_read:讀取的總數據量;kB_wrtn:寫入的總數量數據量;

這些單位都為Kilobytes

上面的例子中,我們可以看到磁盤sda以及它的各個分區的統計數據,當時統計的磁盤總TPS22.73,下面是各個分區的TPS。(因為是瞬間值,所以總TPS並不嚴格等於各個分區TPS的總和)

實例7:查看設備使用率(%util)、響應時間(await

命令:

iostat -d -x -k 1 1

輸出:


[root@CT1186 ~]# iostat -d -x -k 1 1
Linux 2.6.18-128.el5 (CT1186)   2012
1228

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.44    38.59  0.40 22.32    21.85   243.71    23.37     0.04    1.78   4.20   9.54
sda1              0.00     0.00  0.00  0.00     0.00     0.00    18.90     0.00    8.26   6.46   0.00
sda2              0.36     0.43  0.11  0.01     1.87     1.76    63.57     0.01   63.75   1.94   0.02
sda3              0.00     1.24  0.04  0.95     0.31     8.75    18.42     0.04   39.77   8.73   0.86
sda4              0.00     0.00  0.00  0.00     0.00     0.00     2.00     0.00   19.67  19.67   0.00
sda5              0.00     6.65  0.00  6.94     0.06    54.37    15.67     0.26   36.81   4.48   3.11
sda6              0.00     1.71  0.01  2.19     0.09    15.61    14.29     0.03   12.40   5.84   1.28
sda7              0.08    28.56  0.25 12.24    19.52   163.22    29.28     0.27   21.46   5.00   6.25 


說明:

rrqm/s: 每秒進行 merge 的讀操作數目.delta(rmerge)/s

wrqm/s: 每秒進行 merge 的寫操作數目.delta(wmerge)/s

r/s: 每秒完成的讀 I/O 設備次數.delta(rio)/s

w/s: 每秒完成的寫 I/O 設備次數.delta(wio)/s

rsec/s: 每秒讀扇區數.delta(rsect)/s

wsec/s: 每秒寫扇區數.delta(wsect)/s

rkB/s: 每秒讀K字節數.rsect/s 的一半,因為每扇區大小為512字節.(需要計算)

wkB/s: 每秒寫K字節數.wsect/s 的一半.(需要計算)

avgrq-sz:平均每次設備I/O操作的數據大小 (扇區).delta(rsect+wsect)/delta(rio+wio)

avgqu-sz:平均I/O隊列長度.delta(aveq)/s/1000 (因為aveq的單位為毫秒).

await: 平均每次設備I/O操作的等待時間 (毫秒).delta(ruse+wuse)/delta(rio+wio)

svctm: 平均每次設備I/O操作的服務時間 (毫秒).delta(use)/delta(rio+wio)

%util: 一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的,即 delta(use)/s/1000 (因為use的單位為毫秒)

如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。

idle小於70% IO壓力就較大了,一般讀取速度有較多的wait

同時可以結合vmstat 查看查看b參數(等待資源的進程數)wa參數(IO等待所占用的CPU時間的百分比,高過30%IO壓力高)

另外 await 的參數也要多和 svctm 來參考。差的過高就一定有 IO 的問題。

avgqu-sz 也是個做 IO 調優時需要注意的地方,這個就是直接每次操作的數據的大小,如果次數多,但數據拿的小的話,其實 IO 也會很小。如果數據拿的大,才IO 的數據會高。也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是講,讀定速度是這個來決定的。

svctm 一般要小於 await (因為同時等待的請求的等待時間被重復計算了)svctm 的大小一般和磁盤性能有關,CPU/內存的負荷也會對其有影響,請求過多也會間接導致 svctm 的增加。await 的大小一般取決於服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;如果 await 遠大於 svctm,說明 I/O 隊列太長,應用得到的響應時間變慢,如果響應時間超過了用戶可以容許的范圍,這時可以考慮更換更快的磁盤,調整內核 elevator 算法,優化應用,或者升級 CPU

隊列長度(avgqu-sz)也可作為衡量系統 I/O 負荷的指標,但由於 avgqu-sz 是按照單位時間的平均值,所以不能反映瞬間的 I/O 洪水。

形象的比喻
r/s+w/s
類似於交款人的總數
平均隊列長度(avgqu-sz)類似於單位時間里平均排隊人的個數
平均服務時間(svctm)類似於收銀員的收款速度
平均等待時間(await)類似於平均每人的等待時間
平均I/O數據(avgrq-sz)類似於平均每人所買的東西多少
I/O
操作率 (%util)類似於收款台前有人排隊的時間比例

設備IO操作:IO(io)/s = r/s() +w/s() =1.46 + 25.28=26.74
平均每次設備I/O操作只需要0.36毫秒完成,現在卻需要10.57毫秒完成,因為發出的請求太多(每秒26.74),假如請求時同時發出的,可以這樣計算平均等待時間:
平均等待時間=單個I/O服務器時間*(1+2+...+請求總數-1)/請求總數
每秒發出的I/0請求很多,但是平均隊列就4,表示這些請求比較均勻,大部分處理還是比較及時

實例8:查看cpu狀態

命令:

iostat -c 1 3

輸出:


[root@CT1186 ~]#  iostat -c 1 3
Linux 2.6.18-128.el5 (CT1186)   2012
1228

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.30    0.02    5.07    0.17    0.00   86.44

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.64    0.00    5.38    0.00    0.00   85.98

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.62    0.00    5.12    0.50    0.00   86.75


   說明:

    1. watch命令

watch是一個非常實用的命令,基本所有的Linux發行版都帶有這個小工具,如同名字一樣,watch可以幫你監測一個命令的運行結果,省得你一遍遍的手動運行。在Linux下,watch是周期性的執行下個程序,並全屏顯示執行結果。你可以拿他來監測你想要的一切命令的結果變化,比如 tail 一個 log 文件,ls 監測某個文件的大小變化,看你的想象力了

1命令格式:

watch[參數][命令]

2命令功能:

可以將命令的輸出結果輸出到標准輸出設備,多用於周期性執行命令/定時執行命令

3命令參數:

-n--interval  watch缺省每2秒運行一下程序可以用-n-interval來指定間隔的時間

-d--differences  -d--differences 選項watch 會高亮顯示變化的區域 而-d=cumulative選項會把變動過的地方(不管最近的那次有沒有變動)都高亮顯示出來

-t -no-title  會關閉watch命令在頂部的時間間隔,命令當前時間的輸出

  -h, --help 查看幫助文檔

4使用實例:

實例1

命令:每隔一秒高亮顯示網絡鏈接數的變化情況

watch -n 1 -d netstat -ant
說明:

其它操作:
切換終端: Ctrl+x
退出watchCtrl+g

實例2每隔一秒高亮顯示http鏈接數的變化情況

命令:

watch -n 1 -d 'pstree|grep http'

說明:

每隔一秒高亮顯示http鏈接數的變化情況。 后面接的命令若帶有管道符,需要加''將命令區域歸整。

實例3:實時查看模擬攻擊客戶機建立起來的連接數

命令:

watch 'netstat -an | grep:21 | \ grep<模擬攻擊客戶機的IP>| wc -l'

說明:

實例4監測當前目錄中 scf' 的文件的變化

命令:

watch -d 'ls -l|grep scf' 

實例510秒一次輸出系統的平均負載

命令:

watch -n 10 'cat /proc/loadavg'

    1. at命令

windows系統中,windows提供了計划任務這一功能,在控制面板 -> 性能與維護 -> 任務計划, 它的功能就是安排自動運行的任務。 通過'添加任務計划'的一步步引導,則可建立一個定時執行的任務。

linux系統中你可能已經發現了為什么系統常常會自動的進行一些任務?這些任務到底是誰在支配他們工作的?在linux系統如果你想要讓自己設計的備份 程序可以自動在某個時間點開始在系統底下運行,而不需要手動來啟動它,又該如何處置呢? 這些例行的工作可能又分為一次性定時工作與循環定時工作,在系統 內又是哪些服務在負責? 還有,如果你想要每年在老婆的生日前一天就發出一封信件提醒自己不要忘記,linux系統下該怎么做呢?

今天我們主要學習一下一次性定時計划任務的at命令的用法!

1命令格式:

at[參數][時間]

2命令功能:

在一個指定的時間執行一個指定任務,只能執行一次,且需要開啟atd進程(

ps -ef | grep atd查看, 開啟用/etc/init.d/atd start or restart; 開機即啟動則需要運行 chkconfig --level 2345 atd on)。

3命令參數:

-m 當指定的任務被完成之后,將給用戶發送郵件,即使沒有標准輸出

-I atq的別名

-d atrm的別名

-v 顯示任務將被執行的時間

-c 打印任務的內容到標准輸出

-V 顯示版本信息

-q<列隊> 使用指定的列隊

-f<文件> 從指定文件讀入任務而不是從標准輸入讀入

-t<時間參數> 以時間參數的形式提交要運行的任務

at 允許使用一套相當復雜的指定時間的方法。他能夠接受在當天的hh:mm(小時:分鍾)式的時間指定。假如該時間已過去,那么就放在第二天執行。當然也能夠 使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的 詞語來指定時間。用戶還能夠采用12小時計 時制,即在時間后面加上AM(上午)或PM(下午)來說明是上午還是下午。 也能夠指定命令執行的具體日期,指定格式為month day(月 日)或 mm/dd/yy(月//年)或dd.mm.yy(日..年)。指定的日期必須跟在指定時間的后面。 上面介紹的都是絕對計時法,其實還能夠使用相對 計時法,這對於安排不久就要執行的命令是很有好處的。指定格式為:now + count time-units now就是當前時間,time- units是時間單位,這里能夠是minutes(分鍾)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾 天,還是幾小時,等等。 更有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。

TIME:時間格式,這里可以定義出什么時候要進行 at 這項任務的時間,格式有:

HH:MM

ex> 04:00

在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此任務。

HH:MM YYYY-MM-DD

ex> 04:00 2009-03-17

強制規定在某年某月的某一天的特殊時刻進行該項任務

HH:MM[am|pm] [Month] [Date]

ex> 04pm March 17

也是一樣,強制在某年某月某日的某時刻進行該項任務

HH:MM[am|pm] + number [minutes|hours|days|weeks]

ex> now + 5 minutes

ex> 04pm + 3 days

就是說,在某個時間點再加幾個時間后才進行該項任務。

4使用實例:

實例1三天后的下午 5 點鍾執行 /bin/ls

命令:

at 5pm+3 days

輸出:

[root@localhost ~]# at 5pm+3 days

at> /bin/ls

at> <EOT>

job 7 at 2013-01-08 17:00

[root@localhost ~]#

說明:

實例2:明天17點鍾,輸出時間到指定文件內

命令:

at 17:20 tomorrow

輸出:

[root@localhost ~]# at 17:20 tomorrow

at> date >/root/2013.log         

at> <EOT>

job 8 at 2013-01-06 17:20

[root@localhost ~]#

說明:

實例3計划任務設定后,在沒有執行之前我們可以用atq命令來查看系統沒有執行工作任務

命令:

atq

輸出:

[root@localhost ~]# atq

8       2013-01-06 17:20 a root

7       2013-01-08 17:00 a root

[root@localhost ~]#

說明:

實例4刪除已經設置的任務

命令:

atrm 7

輸出:

[root@localhost ~]# atq

8       2013-01-06 17:20 a root

7       2013-01-08 17:00 a root

[root@localhost ~]# atrm 7

[root@localhost ~]# atq

8       2013-01-06 17:20 a root

[root@localhost ~]#

說明:

實例5:顯示已經設置的任務內容

命令:

at -c 8

輸出:

[root@localhost ~]# at -c 8

#!/bin/sh

# atrun uid=0 gid=0

# mail     root 0

umask 22此處省略n個字符

date >/root/2013.log

[root@localhost ~]#

說明:

實例6

命令:

輸出:

說明:

5atd 的啟動與 at 運行的方式:

5.1 atd 的啟動

要使用一次性計划任務時,我們的 Linux 系統上面必須要有負責這個計划任務的服務,那就是 atd 服務。 不過並非所有的 Linux distributions 都默認會把他打開的,所以,某些時刻我們需要手動將atd 服務激活才行。 激活的方法很簡單,就是這樣:

命令:

/etc/init.d/atd start 

/etc/init.d/atd restart 

輸出:

[root@localhost /]# /etc/init.d/atd start

[root@localhost /]# /etc/init.d/atd 

用法:/etc/init.d/atd {start|stop|restart|condrestart|status}

[root@localhost /]# /etc/init.d/atd stop

停止 atd[確定]

[root@localhost /]# ps -ef|grep atd

root     25062 24951  0 14:53 pts/0    00:00:00 grep atd

[root@localhost /]# /etc/init.d/atd start

[確定]td[確定]

[root@localhost /]# ps -ef|grep atd

root     25068     1  0 14:53 ?        00:00:00 /usr/sbin/atd

root     25071 24951  0 14:53 pts/0    00:00:00 grep atd

[root@localhost /]# /etc/init.d/atd restart

停止 atd[確定]

[確定]td[確定]

[root@localhost /]#

說明:

/etc/init.d/atd start沒有啟動的時候,直接啟動atd服務

/etc/init.d/atd restart服務已經啟動后,重啟 atd 服務

備注:配置一下啟動時就啟動這個服務,免得每次重新啟動都得再來一次

命令:

chkconfig atd on

輸出:

[root@localhost /]# chkconfig atd on

[root@localhost /]#

5.2 at 的運行方式

既然是計划任務,那么應該會有任務執行的方式,並且將這些任務排進行程表中。那么產生計划任務的方式是怎么進行的? 事實上,我們使用 at 這個命令來產生所要運行的計划任務,並將這個計划任務以文字檔的方式寫入 /var/spool/at/ 目錄內,該工作便能等待 atd 這個服務的取用與運行了。就這么簡單。

不過,並不是所有的人都可以進行 at 計划任務。為什么? 因為系統安全的原因。很多主機被所謂的攻擊破解后,最常發現的就是他們的系統當中多了很多的黑客程序, 這些程序非常可能運用一些計划任務來運行或搜集你的系統運行信息,並定時的發送給黑客。 所以,除非是你認可的帳號,否則先不要讓他們使用 at 命令。那怎么達到使用 at 的可控呢?

我們可以利用 /etc/at.allow /etc/at.deny 這兩個文件來進行 at 的使用限制。加上這兩個文件后, at 的工作情況是這樣的:

先找尋 /etc/at.allow 這個文件,寫在這個文件中的使用者才能使用 at ,沒有在這個文件中的使用者則不能使用 at (即使沒有寫在 at.deny 當中);

如果 /etc/at.allow 不存在,就尋找 /etc/at.deny 這個文件,若寫在這個 at.deny 的使用者則不能使用 at ,而沒有在這個 at.deny 文件中的使用者,就可以使用 at 命令了。

如果兩個文件都不存在,那么只有 root 可以使用 at 這個命令。

透過這個說明,我們知道 /etc/at.allow 是管理較為嚴格的方式,而 /etc/at.deny 則較為松散 (因為帳號沒有在該文件中,就能夠運行 at )。在一般的 distributions 當中,由於假 設系統上的所有用戶都是可信任的, 因此系統通常會保留一個空的 /etc/at.deny 文件,意思是允許所有人使用 at 命令的意思 (您可以自 行檢查一下該文件)。 不過,萬一你不希望有某些使用者使用 at 的話,將那個使用者的帳號寫入 /etc/at.deny 即可! 一個帳號寫一行。

    1. crontab命令

前 一天學習了 at 命令是針對僅運行一次的任務,循環運行的例行性計划任務,linux系統則是由 cron (crond) 這個系統服務來控制的。 Linux 系統上面原本就有非常多的計划性工作,因此這個系統服務是默認啟動的。另外, 由於使用者自己也可以設置計划任務,所以, Linux 系統 也提供了使用者控制計划任務的命令 :crontab 命令。

一、crond簡介

crond linux下用來周期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計划任務類似,當安裝完成操作系統后,默認會安裝此服務 工具,並且會自動啟動crond進程,crond進程每分鍾會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

Linux下的任務調度分為兩類,系統任務調度和用戶任務調度。

系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日志清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。

/etc/crontab文件包括下面幾行:

[root@localhost ~]# cat /etc/crontab 

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=""HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

[root@localhost ~]#

前 四行是用來配置crond任務運行的環境變量,第一行SHELL變量指定了系統要使用哪個shell,這里是bash,第二行PATH變量指定了系統執行 命令的路徑,第三行MAILTO變量指定了crond的任務執行信息將通過電子郵件發送給root用戶,如果MAILTO變量的值為空,則表示不發送任務 執行信息給用戶,第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。第六至九行表示的含義將在下個小節詳細講述。這里不在多說。

用戶任務調度:用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定制自己的計划任務。所有用戶定義的crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。

使用者權限文件:

文件:

/etc/cron.deny

說明:

該文件中所列用戶不允許使用crontab命令

文件:

/etc/cron.allow

說明:

該文件中所列用戶允許使用crontab命令

文件:

/var/spool/cron/

說明:

所有用戶crontab文件存放的目錄,以用戶名命名

crontab文件的含義:

用戶所建立的crontab文件中,每一行都代表一項任務,每行的每個字段代表一項設置,它的格式共分為六個字段,前五段是時間設定段,第六段是要執行的命令段,格式如下:

minute hour day month week command

其中:

minute: 表示分鍾,可以是從059之間的任何整數。

hour:表示小時,可以是從023之間的任何整數。

day:表示日期,可以是從131之間的任何整數。

month:表示月份,可以是從112之間的任何整數。

week:表示星期幾,可以是從07之間的任何整數,這里的07代表星期日。

command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。

 

在以上各個字段中,還可以使用以下特殊字符:

星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件后每月都執行該命令操作。

逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”

中杠(-):可以用整數之間的中杠表示一個整數范圍,例如“2-6”表示“2,3,4,5,6”

正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鍾執行一次。

二、crond服務

安裝crontab

yum install crontabs

服務操作說明:

/sbin/service crond start //啟動服務

/sbin/service crond stop //關閉服務

/sbin/service crond restart //重啟服務

/sbin/service crond reload //重新載入配置

查看crontab服務狀態:

service crond status

手動啟動crontab服務:

service crond start

查看crontab服務是否已設置為開機啟動,執行命令:

ntsysv

加入開機自動啟動:

chkconfig –level 35 crond on

三、crontab命令詳解

1命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2命令功能:

通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位可以是分鍾、小時、日、月、周及以上的任意組合。這個命令非常設合周期性的日志分析或數據備份等工作。

3命令參數:

-u user:用來設定某個用戶的crontab服務,例如,“-u ixdba”表示設定ixdba用戶的crontab服務,此參數一般有root用戶來運行。

filefile是命令文件的名字,表示將file做為crontab的任務列表文件並載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標准輸入(鍵盤)上鍵入的命令,並將它們載入crontab

-e:編輯某個用戶的crontab文件內容。如果不指定用戶,則表示編輯當前用戶的crontab文件。

-l:顯示某個用戶的crontab文件內容,如果不指定用戶,則表示顯示當前用戶的crontab文件內容。

-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認刪除當前用戶的crontab文件。

-i:在刪除用戶的crontab文件時給確認提示。

4常用方法:

1). 創建一個新的crontab文件

在 考慮向cron進程提交一個crontab文件之前,首先要做的一件事情就是設置環境變量EDITORcron進程根據它來確定使用哪個編輯器編輯 crontab文件。9 9 %UNIXLINUX用戶都使用vi,如果你也是這樣,那么你就編輯$ HOME目錄下的. profile文件,在其 中加入這樣一行:

EDITOR=vi; export EDITOR

然后保存並退出。不妨創建一個名為<user> cron的文件,其中<user>是用戶名,例如, davecron。在該文件中加入如下的內容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console

保存並退出。確信前面5個域用空格分隔。

在 上面的例子中,系統將每隔1 5分鍾向控制台輸出一次當前時間。如果系統崩潰或掛起,從最后所顯示的時間就可以一眼看出系統是什么時間停止工作的。在有些 系統中,用tty1來表示控制台,可以根據實際情況對上面的例子進行相應的修改。為了提交你剛剛創建的crontab文件,可以把這個新創建的文件作為 cron命令的參數:

$ crontab davecron

現在該文件已經提交給cron進程,它將每隔1 5分鍾運行一次。

同時,新創建文件的一個副本已經被放在/var/spool/cron目錄中,文件名就是用戶名(dave)

2). 列出crontab文件

為了列出crontab文件,可以用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你將會看到和上面類似的內容。可以使用這種方法在$ H O M E目錄中對crontab文件做一備份:

$ crontab -l > $HOME/mycron

這樣,一旦不小心誤刪了crontab文件,可以用上一節所講述的方法迅速恢復。

3). 編輯crontab文件

如果希望添加、刪除或編輯crontab文件中的條目,而E D I TO R環境變量又設置為v i,那么就可以用v i來編輯crontab文件,相應的命令為:

$ crontab -e

可以像使用v i編輯其他任何文件那樣修改crontab文件並退出。如果修改了某些條目或添加了新的條目,那么在保存該文件時, c r o n會對其進行必要的完整性檢查。如果其中的某個域出現了超出允許范圍的值,它會提示你。

我們在編輯crontab文件時,沒准會加入新的條目。例如,加入下面的一條:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;

現在保存並退出。最好在crontab文件的每一個條目之上加入一條注釋,這樣就可以知道它的功能、運行時間,更為重要的是,知道這是哪位用戶的作業。

現在讓我們使用前面講過的crontab -l命令列出它的全部信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;

4). 刪除crontab文件

要刪除crontab文件,可以用:

$ crontab -r

5). 恢復丟失的crontab文件

如果不小心誤刪了crontab文件,假設你在自己的$ H O M E目錄下還有一個備份,那么可以將其拷貝到/var/spool/cron/<username>,其中<username>是用戶名。如果由於權限問題無法完成拷貝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目錄中副本的文件名。

我建議你在自己的$ H O M E目錄中保存一個該文件的副本。我就有過類似的經歷,有數次誤刪了crontab文件(因為r鍵緊挨在e鍵的右邊)。這就是為什么有些系統文檔建議不要直接編輯crontab文件,而是編輯該文件的一個副本,然后重新提交新的文件。

有些crontab的變體有些怪異,所以在使用crontab命令時要格外小心。如果遺漏了任何選項,crontab可能會打開一個空文件,或者看起來像是個空文件。這時敲delete鍵退出,不要按<Ctrl-D>,否則你將丟失crontab文件。

5使用實例

實例1:每1分鍾執行一次command

命令:

* * * * * command

 

實例2:每小時的第3和第15分鍾執行

命令:

3,15 * * * * command

 

實例3:在上午8點到11點的第3和第15分鍾執行

命令:

3,15 8-11 * * * command

 

實例4:每隔兩天的上午8點到11點的第3和第15分鍾執行

命令:

3,15 8-11 */2 * * command

 

實例5:每個星期一的上午8點到11點的第3和第15分鍾執行

命令:

3,15 8-11 * * 1 command

 

實例6:每晚的21:30重啟smb

命令:

30 21 * * * /etc/init.d/smb restart

 

實例7:每月11022日的4 : 45重啟smb

命令:

45 4 1,10,22 * * /etc/init.d/smb restart

 

實例8:每周六、周日的1 : 10重啟smb

命令:

10 1 * * 6,0 /etc/init.d/smb restart

 

實例9:每天18 : 0023 : 00之間每隔30分鍾重啟smb

命令:

0,30 18-23 * * * /etc/init.d/smb restart

 

實例10:每星期六的晚上11 : 00 pm重啟smb

命令:

0 23 * * 6 /etc/init.d/smb restart

 

實例11:每一小時重啟smb

命令:

* */1 * * * /etc/init.d/smb restart

 

實例12:晚上11點到早上7點之間,每隔一小時重啟smb

命令:

* 23-7/1 * * * /etc/init.d/smb restart

 

實例13:每月的4號與每周一到周三的11點重啟smb

命令:

0 11 4 * mon-wed /etc/init.d/smb restart

 

實例14:一月一號的4點重啟smb

命令:

0 4 1 jan * /etc/init.d/smb restart

實例15:每小時執行/etc/cron.hourly目錄內的腳本

命令:

01 * * * * root run-parts /etc/cron.hourly

說明:

run-parts這個參數了,如果去掉這個參數的話,后面就可以寫要運行的某個腳本名,而不是目錄名了

四、使用注意事項

1. 注意環境變量問題

有時我們創建了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題,這種情況一般是由於在crontab文件中沒有配置環境變量引起的。

crontab文件中定義多個調度任務時,需要特別注意的一個問題就是環境變量的設置,因為我們手動執行某個任務時,是在當前shell環境下進行的,程 序當然能找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的,因此,就需要在crontab文件中指定任務運行所需的所有環境變量,這 樣,系統執行任務調度時就沒有問題了。

不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shelll腳本中提供所有必要的路徑和環境變量,除了一些自動設置的全局變量。所以注意如下3點:

1)腳本中涉及文件路徑時寫全局路徑;

2)腳本執行要用到java或其他環境變量時,通過source命令引入環境變量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)當手動執行腳本OK,但是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,並可以嘗試在crontab中直接引入環境變量解決問題。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

2. 注意清理系統用戶的郵件日志

每條任務調度執行完畢,系統都會將任務輸出信息通過電子郵件的形式發送給當前系統用戶,這樣日積月累,日志信息會非常大,可能會影響系統的正常運行,因此,將每條任務進行重定向處理非常重要。

例如,可以在crontab文件中設置如下形式,忽略日志輸出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

/dev/null 2>&1”表示先將標准輸出重定向到/dev/null,然后將標准錯誤重定向到標准輸出,由於標准輸出已經重定向到了/dev/null,因此標准錯誤也會重定向到/dev/null,這樣日志輸出問題就解決了。

3. 系統級任務調度與用戶級任務調度

系 統級任務調度主要完成系統的一些維護操作,用戶級任務調度主要完成用戶自定義的一些任務,可以將用戶級任務調度放到系統級任務調度來完成(不建議這么 做),但是反過來卻不行,root用戶的任務調度操作可以通過“crontab –uroot –e”來設置,也可以將調度任務直接寫入/etc /crontab文件,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab文件,即使在root用戶下創建一個 定時重啟系統的任務也是無效的。

4. 其他注意事項

新創建的cron job,不會馬上執行,至少要過2分鍾才執行。如果重啟cron則馬上執行。

crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者查看日志看某個job有沒有執行/報錯tail -f /var/log/cron

千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。

crontab%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%,如經常用的date ‘+%Y%m%d’crontab里是不會執行的,應該換成date ‘+\%Y\%m\%d’

  1. 網絡命令:

    1. SecureCRT來上傳和下載文件rz

SSH管理linux服務器時經常需要遠程與本地之間交互文件.而直接用SecureCRT自帶的上傳下載功能無疑是最方便的SecureCRT下的文件傳輸協議有ASCIIXmodemZmodem
文件傳輸協議
文件傳輸是數據交換的主要形式。在進行文件傳輸時,為使文件能被正確識別和傳送,我們需要在兩台計算機之間建立統一的傳輸協議。這個協議包括了文件的識別、傳送的起止時間、錯誤的判斷與糾正等內容。常見的傳輸協議有以下幾種:
ASCII
:這是最快的傳輸協議,但只能傳送文本文件。
Xmodem
:這種古老的傳輸協議速度較慢,但由於使用了CRC錯誤偵測方法,傳輸的准確率可高達99.6%
Ymodem
:這是Xmodem的改良版,使用了1024位區段傳送,速度比Xmodem要快
Zmodem
Zmodem采用了串流式(streaming)傳輸方式,傳輸速度較快,而且還具有自動改變區段大小和斷點續傳、快速錯誤偵測等功能。這是目前最流行的文件傳輸協議。
除以上幾種外,還有ImodemJmodemBimodemKermitLynx等協議,由於沒有多數廠商支持,這里就略去不講。

SecureCRT可以使用linux下的zmodem協議來快速的傳送文件,使用非常方便.具體步驟:

一.在使用SecureCRT上傳下載之前需要給服務器安裝lrzsz

1、從下面的地址下載 lrzsz-0.12.20.tar.gz

http://down1.chinaunix.net/distfiles/lrzsz-0.12.20.tar.gz

2、查看里面的INSTALL文檔了解安裝參數說明和細節

3、解壓文件

tar zxvf lrzsz-0.12.20.tar.gz

4、進入目錄

cd lrzsz-0.12.20

5./configure --prefix=/usr/local/lrzsz

6make

7make install

8、建立軟鏈接

#cd /usr/bin

#ln -s /usr/local/lrzsz/bin/lrz rz

#ln -s /usr/local/lrzsz/bin/lsz sz

9、測試

運行 rz 彈出SecureCRT上傳窗口,SecureCRT來上傳和下載文件。

二.設置SecureCRT上傳和下載的默認目錄就行

options->session options ->Terminal->Xmodem/Zmodem
在右欄directory設置上傳和下載的目錄

三.使用Zmodem從客戶端上傳文件到linux服務器

1.在用SecureCRT登陸linux終端.
2.
選中你要放置上傳文件的路徑,在目錄下然后輸入rz命令,SecureCRT會彈出文件選擇對話框,在查找范圍中找到你要上傳的文件,按Add按鈕。然后OK就可以把文件上傳到linux上了。
或者在Transfer->Zmodem Upoad list彈出文件選擇對話框,選好文件后按Add按鈕。然后OK窗口自動關閉。然后在linux下選中存放文件的目錄,輸入rz命令。liunx就把那個文件上傳到這個目錄下了。

四.使用Zmodem下載文件到客戶端:
sz filename
zmodem
接收可以自行啟動.下載的文件存放在你設定的默認下載目錄下.


rz
sz Linux/UnixWindows進行ZModem文件傳輸的命令行工具windows端需要支持ZModemtelnet/ssh客戶 端,SecureCRT就可以用SecureCRT登陸到Unix/Linux主機(telnetssh均可)O 運行命令rz,即是接收文 件,SecureCRT就會彈出文件選擇對話框,選好文件之后關閉對話框,文件就會上傳到當前目錄 O 運行命令sz file1 file2就是發文件 到windows上(保存的目錄是可以配置) 比ftp命令方便多了,而且服務器不用再開FTP服務了

    1. lsof命令

lsoflist open files) 是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以 如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在后台都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件 描述符為應用程序與基礎操作系統之間的交互提供了通用接口。因為應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工 具能夠查看這個列表對系統監測以及排錯將是很有幫助的。

1命令格式:

lsof [參數][文件]

2命令功能:

用於查看你進程打開的文件,打開文件的進程,進程打開的端口(TCPUDP)。找回/恢復刪除的文件。是十分方便的系統監視工具,因為 lsof 需要訪問核心內存和各種文件,所以需要root用戶執行。

lsof打開的文件可以是:

1.普通文件

2.目錄

3.網絡文件系統的文件

4.字符或設備文件

5.(函數)共享庫

6.管道,命名管道

7.符號鏈接

8.網絡文件(例如:NFS file、網絡socketunix域名socket

9.還有其它類型的文件,等等

3命令參數:

-a 列出打開文件存在的進程

-c<進程名> 列出指定進程所打開的文件

-g 列出GID號進程詳情

-d<文件號> 列出占用該文件號的進程

+d<目錄> 列出目錄下被打開的文件

+D<目錄> 遞歸列出目錄下被打開的文件

-n<目錄> 列出使用NFS的文件

-i<條件> 列出符合條件的進程。(46、協議、:端口、 @ip

-p<進程號> 列出指定進程號所打開的文件

-u 列出UID號進程詳情

-h 顯示幫助信息

-v 顯示版本信息

4使用實例:

實例1:無任何參數

命令:

lsof

輸出:

[root@localhost ~]# lsof


COMMAND      PID USER  FD       TYPE             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  txt       REG                8,2     43496    6121706 /sbin/init
init          1 root  mem       REG                8,2    143600    7823908 /lib64/ld-2.5.so
init          1 root  mem       REG                8,2   1722304    7823915 /lib64/libc-2.5.so
init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
init          1 root  mem       REG                8,2    247496    7823947 /lib64/libsepol.so.1
init          1 root   10u      FIFO               0,17                1233 /dev/initctl
migration     2 root  cwd        DIR                 8,2     4096          2 /

說明:

lsof輸出各列信息的意義如下:

COMMAND:進程的名稱

PID:進程標識符

PPID:父進程標識符(需要指定-R參數)

USER:進程所有者

PGID:進程所屬組

FD:文件描述符,應用程序通過文件描述符識別該文件。如cwdtxt

1cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改

2txt :該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序

3lnnlibrary references (AIX);

4erFD information error (see NAME column);

5jldjail directory (FreeBSD);

6ltxshared library text (code and data);

7mxx hex memory-mapped type number xx.

8m86DOS Merge mapped file;

9memmemory-mapped file;

10mmapmemory-mapped device;

11pdparent directory;

12rtdroot directory;

13trkernel trace file (OpenBSD);

14v86 VP/ix mapped file;

150:表示標准輸出

161:表示標准輸入

172:表示標准錯誤

一般在標准輸出、標准錯誤、標准輸入后還跟着文件狀態模式:rwu

1u:表示該文件被打開並處於讀取/寫入模式

2r:表示該文件被打開並處於只讀模式

3w:表示該文件被打開並處於

4)空格:表示該文件的狀態模式為unknow,且沒有鎖定

5-:表示該文件的狀態模式為unknow,且被鎖定

同時在文件狀態模式后面,還跟着相關的鎖

1Nfor a Solaris NFS lock of unknown type;

2rfor read lock on part of the file;

3Rfor a read lock on the entire file;

4wfor a write lock on part of the file;(文件的部分寫鎖)

5Wfor a write lock on the entire file;(整個文件的寫鎖)

6ufor a read and write lock of any length;

7Ufor a lock of unknown type;

8xfor an SCO OpenServer Xenix lock on part of the file;

9Xfor an SCO OpenServer Xenix lock on the entire file;

10spaceif there is no lock.

TYPE:文件類型,如DIRREG等,常見的文件類型

1DIR:表示目錄

2CHR:表示字符類型

3BLK:塊設備類型

4UNIXUNIX 域套接字

5FIFO:先進先出 (FIFO) 隊列

6IPv4:網際協議 (IP) 套接字

DEVICE:指定磁盤的名稱

SIZE:文件的大小

NODE:索引節點(文件在磁盤上的標識)

NAME:打開文件的確切名稱

實例2查看誰正在使用某個文件,也就是說查找某個文件相關的進程

命令:

lsof /bin/bash

輸出:


[root@localhost ~]# lsof /bin/bash
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
bash    24159 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24909 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24941 root txt    REG    8,2 801528 5368780 /bin/bash
[root@localhost ~]


說明:

實例3遞歸查看某個目錄的文件信息

命令:

lsof test/test3

輸出:


[root@localhost ~]# cd /opt/soft/
[root@localhost soft]# lsof test/test3
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    24941 root  cwd    DIR    8,2 4096 2258872 test/test3
vi      24976 root  cwd    DIR    8,2 4096 2258872 test/test3
[root@localhost soft]


 

說明:

使用了+D,對應目錄下的所有子目錄和文件都會被列出

實例4:不使用+D選項,遍歷查看某個目錄的所有文件信息的方法

命令:

lsof |grep 'test/test3'

輸出:

[root@localhost soft]# lsof |grep 'test/test3'

bash      24941 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root    4u      REG                8,2    12288    2258882 /opt/soft/test/test3/.log2013.log.swp
[root@localhost soft]

說明:

實例5:列出某個用戶打開的文件信息

命令

lsof -u username

說明:

-u 選項,u其實是user的縮寫

實例6:列出某個程序進程所打開的文件信息

命令:

lsof -c mysql

說明:

-c 選項將會列出所有以mysql這個進程開頭的程序的文件,其實你也可以寫成 lsof | grep mysql, 但是第一種方法明顯比第二種方法要少打幾個字符了

實例7:列出多個進程多個打開的文件信息

命令:

lsof -c mysql -c apache

實例8:列出某個用戶以及某個進程所打開的文件信息

命令:

lsof -u test -c mysql

說明:

用戶與進程可相關,也可以不相關

實例9:列出除了某個用戶外的被打開的文件信息

命令:

lsof -u ^root

說明:

^這個符號在用戶名之前,將會把是root用戶打開的進程不讓顯示

實例10:通過某個進程號顯示該進行打開的文件

命令:

lsof -p 1

實例11:列出多個進程號對應的文件信息

命令:

lsof -p 1,2,3

實例12:列出除了某個進程號,其他進程號所打開的文件信息

命令:

lsof -p ^1

實例13:列出所有的網絡連接

命令:

lsof -i

實例14:列出所有tcp 網絡連接信息

命令:

lsof -i tcp

實例15:列出所有udp網絡連接信息

命令:

lsof -i udp

實例16:列出誰在使用某個端口

命令:

lsof -i :3306

實例17:列出誰在使用某個特定的udp端口

命令:

lsof -i udp:55

或者:特定的tcp端口

命令:

lsof -i tcp:80

實例18:列出某個用戶的所有活躍的網絡端口

命令:

lsof -a -u test -i

實例19:列出所有網絡文件系統

命令:

lsof -N

實例20:域名socket文件

命令:

lsof -u

實例21:某個用戶組所打開的文件信息

命令:

lsof -g 5555

實例22:根據文件描述列出對應的文件信息

命令:

lsof -d description(like 2)

例如:lsof -d txt

例如:lsof -d 1

例如:lsof -d 2

說明:

0表示標准輸入,1表示標准輸出,2表示標准錯誤,從而可知:所以大多數應用程序所打開的文件的 FD 都是從 3 開始

實例23:根據文件描述范圍列出文件信息

命令:

lsof -d 2-3

實例24:列出COMMAND列中包含字符串" sshd",且文件描符的類型為txt的文件信息

命令:

lsof -c sshd -a -d txt

輸出:


[root@localhost soft]# lsof -c sshd -a -d txt
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
sshd     2756 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24155 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24905 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24937 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
[root@localhost soft]

[root@localhost soft]


 

實例25:列出被進程號為1234的進程所打開的所有IPV4 network files

命令

lsof -i 4 -a -p 1234

實例26:列出目前連接主機peida.linux上端口為:202122255380相關的所有文件信息,且每隔3秒不斷的執行lsof指令

命令:

lsof -i @peida.linux:20,21,22,25,53,80 -r 3

    1. ifconfig命令

許多windows非常熟悉ipconfig命令行工具,它被用來獲取網絡接口配置信息並對此進行修改。Linux系統擁有一個類似的工具,也就是ifconfig(interfaces config)。通常需要以root身份登錄或使用sudo以便在Linux機器上使用ifconfig工具。依賴於ifconfig命令中使用一些選項屬性,ifconfig工具不僅可以被用來簡單地獲取網絡接口配置信息,還可以修改這些配置。

1命令格式:

ifconfig [網絡設備] [參數]

2命令功能:

ifconfig 命令用來查看和配置網絡設備。當網絡環境發生改變時可通過此命令對網絡進行相應的配置。

3命令參數:

up 啟動指定網絡設備/網卡。

down 關閉指定網絡設備/網卡。該參數可以有效地阻止通過指定接口的IP信息流,如果想永久地關閉一個接口,我們還需要從核心路由表中將該接口的路由信息全部刪除。

arp 設置指定網卡是否支持ARP協議。

-promisc 設置是否支持網卡的promiscuous模式,如果選擇此參數,網卡將接收網絡中發給它所有的數據包

-allmulti 設置是否支持多播模式,如果選擇此參數,網卡將接收網絡中所有的多播數據包

-a 顯示全部接口信息

-s 顯示摘要信息(類似於 netstat -i

add 給指定網卡配置IPv6地址

del 刪除指定網卡的IPv6地址

<硬件地址> 配置網卡最大的傳輸單元

mtu<字節數> 設置網卡的最大傳輸單元 (bytes)

netmask<子網掩碼> 設置網卡的子網掩碼。掩碼可以是有前綴0x32位十六進制數,也可以是用點分開的4個十進制數。如果不打算將網絡分成子網,可以不管這一選項;如果要使用子網,那么請記住,網絡中每一個系統必須有相同子網掩碼。

tunel 建立隧道

dstaddr 設定一個遠端地址,建立點對點通信

-broadcast<地址> 為指定網卡設置廣播協議

-pointtopoint<地址> 為網卡設置點對點通訊協議

multicast 為網卡設置組播標志

address 為網卡設置IPv4地址

txqueuelen<長度> 為網卡設置傳輸列隊的長度

4使用實例:

實例1:顯示網絡設備信息(激活狀態的

命令:

ifconfig

輸出:


[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:BF:26:20  
          inet addr:192.168.120.204  Bcast:192.168.120.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8700857 errors:0 dropped:0 overruns:0 frame:0
          TX packets:31533 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:596390239 (568.7 MiB)  TX bytes:2886956 (2.7 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2856 (2.7 KiB)  TX bytes:2856 (2.7 KiB)


 

說明:

eth0 表示第一塊網卡, 其中 HWaddr 表示網卡的物理地址,可以看到目前這個網卡的物理地址(MAC地址)是 00:50:56:BF:26:20

inet addr 用來表示網卡的IP地址,此網卡的 IP地址是 192.168.120.204,廣播地址, Bcast:192.168.120.255,掩碼地址Mask:255.255.255.0

lo 是 表示主機的回壞地址,這個一般是用來測試一個網絡程序,但又不想讓局域網或外網的用戶能夠查看,只能在此台主機上運行和查看所用的網絡接口。比如 把 HTTPD服務器的指定到回壞地址,在瀏覽器輸入 127.0.0.1 就能看到你所架WEB網站了。但只是您能看得到,局域網的其它主機或用戶無從 知道。

第一行:連接類型:Ethernet(以太網)HWaddr(硬件mac地址)

第二行:網卡的IP地址、子網、掩碼

第三行:UP(代表網卡開啟狀態)RUNNING(代表網卡的網線被接上)MULTICAST(支持組播)MTU:1500(最大傳輸單元):1500字節

第四、五行:接收、發送數據包情況統計

第七行:接收、發送數據字節數統計信息。

實例2:啟動關閉指定網卡

命令:

ifconfig eth0 up

ifconfig eth0 down

輸出:

說明:

ifconfig eth0 up 為啟動網卡eth0 ifconfig eth0 down 為關閉網卡eth0ssh登陸linux服務器操作要小心,關閉了就不能開啟了,除非你有多網卡。

實例3:為網卡配置和刪除IPv6地址

命令:

ifconfig eth0 add 33ffe:3240:800:1005::2/64

ifconfig eth0 del 33ffe:3240:800:1005::2/64

輸出:

說明:

ifconfig eth0 add 33ffe:3240:800:1005::2/64 為網卡eth0配置IPv6地址;

ifconfig eth0 add 33ffe:3240:800:1005::2/64 為網卡eth0刪除IPv6地址;

練習的時候,ssh登陸linux服務器操作要小心,關閉了就不能開啟了,除非你有多網卡。

實例4ifconfig修改MAC地址

命令:

ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE

輸出:


[root@localhost ~]# ifconfig eth0 down //關閉網卡
[root@localhost ~]# ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE //
修改MAC地址
[root@localhost ~]# ifconfig eth0 up //
啟動網卡
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:AA:BB:CC:DD:EE  
          inet addr:192.168.120.204  Bcast:192.168.120.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8700857 errors:0 dropped:0 overruns:0 frame:0
          TX packets:31533 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:596390239 (568.7 MiB)  TX bytes:2886956 (2.7 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2856 (2.7 KiB)  TX bytes:2856 (2.7 KiB)
[root@localhost ~]
# ifconfig eth0 hw ether 00:50:56:BF:26:20 //
關閉網卡並修改MAC地址 
[root@localhost ~]# ifconfig eth0 up //
啟動網卡
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:BF:26:20  
          inet addr:192.168.120.204  Bcast:192.168.120.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8700857 errors:0 dropped:0 overruns:0 frame:0
          TX packets:31533 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:596390239 (568.7 MiB)  TX bytes:2886956 (2.7 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2856 (2.7 KiB)  TX bytes:2856 (2.7 KiB)
 


說明:

 

實例5:配置IP地址

命令:

輸出:

[root@localhost ~]# ifconfig eth0 192.168.120.56 
[root@localhost ~]# ifconfig eth0 192.168.120.56 netmask 255.255.255.0 
[root@localhost ~]# ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255

 

說明:

ifconfig eth0 192.168.120.56

eth0網卡配置IP地:192.168.120.56

ifconfig eth0 192.168.120.56 netmask 255.255.255.0

eth0網卡配置IP地址:192.168.120.56 ,並加上子掩碼:255.255.255.0

ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255

/eth0網卡配置IP地址:192.168.120.56,加上子掩碼:255.255.255.0,加上個廣播地址: 192.168.120.255

 

實例6:啟用和關閉ARP協議

命令:

ifconfig eth0 arp

ifconfig eth0 -arp

輸出:

[root@localhost ~]# ifconfig eth0 arp 
[root@localhost ~]# ifconfig eth0 -arp

 

說明:

ifconfig eth0 arp 開啟網卡eth0 arp協議;

ifconfig eth0 -arp 關閉網卡eth0 arp協議;

 

實例7:設置最大傳輸單元

命令:

ifconfig eth0 mtu 1500

輸出:


[root@localhost ~]# ifconfig eth0 mtu 1480
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:BF:26:1F  
          inet addr:192.168.120.203  Bcast:192.168.120.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1480  Metric:1
          RX packets:8712395 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36631 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:597062089 (569.4 MiB)  TX bytes:2643973 (2.5 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:9973 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9973 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:518096 (505.9 KiB)  TX bytes:518096 (505.9 KiB)

[root@localhost ~]
# ifconfig eth0 mtu 1500
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:BF:26:1F  
          inet addr:192.168.120.203  Bcast:192.168.120.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8712548 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36685 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:597072333 (569.4 MiB)  TX bytes:2650581 (2.5 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:9973 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9973 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:518096 (505.9 KiB)  TX bytes:518096 (505.9 KiB)

[root@localhost ~]


 

說明:

設置能通過的最大數據包大小為 1500 bytes

 

備注:ifconfig命令配置的網卡信息,在網卡重啟后機器重啟后,配置就不存在。要想將上述的配置信息永遠的存的電腦里,那就要修改網卡的配置文件了。

    1. route命令

Linux系統的route 命令用於顯示和操作IP路由表(show / manipulate the IP routing table)。要實現兩個不同的子網之間的通信,需 要一台連接兩個網絡的路由器,或者同時位於兩個網絡的網關來實現。在Linux系統中,設置路由通常是為了解決以下問題:該Linux系統在一個局域網 中,局域網中有一個網關,能夠讓機器訪問Internet,那么就需要將這台機器的IP地址設置為Linux機器的默認路由。要注意的是,直接在命令行下 執行route命令來添加路由,不會永久保存,當網卡重啟或者機器重啟之后,該路由就失效了;可以在/etc/rc.local中添加route命令來保 證該路由設置永久有效。

1命令格式:

route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric]] [if Interface]] 

2命令功能:

Route命令是用於操作基於內核ip路由表,它的主要作用是創建一個靜態路由讓指定一個主機或者一個網絡通過一個網絡接口,如eth0。當使用"add"或者"del"參數時,路由表被修改,如果沒有參數,則顯示路由表當前的內容。

3命令參數:

-c 顯示更多信息

-n 不解析名字

-v 顯示詳細的處理信息

-F 顯示發送信息

-C 顯示路由緩存

-f 清除所有網關入口的路由表。

-p add 命令一起使用時使路由具有永久性。

 

add:添加一條新路由。

del:刪除一條路由。

-net:目標地址是一個網絡。

-host:目標地址是一個主機。

netmask:當添加一個網絡路由時,需要使用網絡掩碼。

gw:路由數據包通過網關。注意,你指定的網關必須能夠達到。

metric:設置路由跳數。

Command 指定您想運行的命令 (Add/Change/Delete/Print)

Destination 指定該路由的網絡目標。

mask Netmask 指定與網絡目標相關的網絡掩碼(也被稱作子網掩碼)。

Gateway 指定網絡目標定義的地址集和子網掩碼可以到達的前進或下一躍點 IP 地址。

metric Metric 為路由指定一個整數成本值標(從 1 9999),當在路由表(與轉發的數據包目標地址最匹配)的多個路由中進行選擇時可以使用。

if Interface 為可以訪問目標的接口指定接口索引。若要獲得一個接口列表和它們相應的接口索引,使用 route print 命令的顯示功能。可以使用十進制或十六進制值進行接口索引。

4使用實例:

實例1顯示當前路由

命令:

route

route -n

輸出:


[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
e192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
0.0.0.0         192.168.120.240 0.0.0.0         UG    0      0        0 eth0


 

說明:

第一行表示主機所在網絡的地址為192.168.120.0,若數據傳送目標是在本局域網內通信,則可直接通過eth0轉發數據包;

第四行表示數據傳送目的是訪問Internet,則由接口eth0,將數據包發送到網關192.168.120.240

其中Flags為路由標志,標記當前網絡節點的狀態。

Flags標志說明:

U Up表示此路由當前為啟動狀態

H Host,表示此網關為一主機

G Gateway,表示此網關為一路由器

R Reinstate Route,使用動態路由重新初始化的路由

D Dynamically,此路由是動態性地寫入

M Modified,此路由是由路由守護程序或導向器動態修改

! 表示此路由當前為關閉狀態

備注:

route -n (-n 表示不解析名字,列出速度會比route )

實例2:添加網關/設置網關

命令:

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

輸出:


[root@localhost ~]# route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
224.0.0.0       *               240.0.0.0       U     0      0        0 eth0
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0


[root@localhost ~] 

說明:

增加一條 到達244.0.0.0的路由

實例3:屏蔽一條路由

命令:

route add -net 224.0.0.0 netmask 240.0.0.0 reject

輸出:


[root@localhost ~]# route add -net 224.0.0.0 netmask 240.0.0.0 reject
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
224.0.0.0       -               240.0.0.0       !     0      -        0 -
224.0.0.0       *               240.0.0.0       U     0      0        0 eth0
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0


 

說明:

增加一條屏蔽的路由,目的地址為 224.x.x.x 將被拒絕

實例4:刪除路由記錄

命令:

route del -net 224.0.0.0 netmask 240.0.0.0

route del -net 224.0.0.0 netmask 240.0.0.0 reject

輸出:


[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
224.0.0.0       -               240.0.0.0       !     0      -        0 -
224.0.0.0       *               240.0.0.0       U     0      0        0 eth0
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]
# route del -net 224.0.0.0 netmask 240.0.0.0
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
224.0.0.0       -               240.0.0.0       !     0      -        0 -
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]
# route del -net 224.0.0.0 netmask 240.0.0.0 reject
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]


 

說明:

實例5:刪除和添加設置默認網關

命令:

route del default gw 192.168.120.240

route add default gw 192.168.120.240

輸出:


[root@localhost ~]# route del default gw 192.168.120.240
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
[root@localhost ~]
# route add default gw 192.168.120.240
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]


說明:

    1. ping命令

Linux系統的ping 命令是常用的網絡命令,它通常用來測試與目標主機的連通性,我們經常會說“ping一下某機器,看是不是開着”、不能打開網頁時會說“你先ping網關地 址192.168.1.1試試”。它通過發送ICMP ECHO_REQUEST數據包到網絡主機 (send ICMP ECHO_REQUEST to network hosts),並顯示響應情況,這樣我們就可以根據它輸出的信息來確定目標主機 是否可訪問(但這不是絕對的)。有些服務器為了防止通過ping探測到,通過防火牆設置了禁止ping或者在內核參數中禁止ping,這樣就不能通過 ping確定該主機是否還處於開啟狀態。

linux下的pingwindows下的ping稍有區別,linuxping不會自動終止,需要按ctrl+c終止或者用參數-c指定要求完成的回應次數。

1.命令格式:

ping [參數] [主機名或IP地址]

2.命令功能:

ping命令用於:確定網絡和各外部主機的狀態;跟蹤和隔離硬件和軟件問題;測 試、評估和管理網絡。如果主機正在運行並連在網上,它就對回送信號進行響應。每個回送信號請求包含一個網際協議(IP)和 ICMP 頭,后面緊跟一 個 tim 結構,以及來填寫這個信息包的足夠的字節。缺省情況是連續發送回送信號請求直到接收到中斷信號(Ctrl-C)。

ping 命 令每秒發送一個數據報並且為每個接收到的響應打印一行輸出。ping 命令計算信號往返時間和(信息)包丟失情況的統計信息,並且在完成之后顯示一個簡要 總結。ping 命令在程序超時或當接收到 SIGINT 信號時結束。Host 參數或者是一個有效的主機名或者是因特網地址。

3.命令參數:

-d 使用SocketSO_DEBUG功能。

-f 極限檢測。大量且快速地送網絡封包給一台機器,看它的回應。

-n 只輸出數值。

-q 不顯示任何傳送封包的信息,只顯示最后的結果。

-r 忽略普通的Routing Table,直接將數據包送到遠端主機上。通常是查看本機的網絡接口是否有問題。

-R 記錄路由過程。

-v 詳細顯示指令的執行過程。

<p>-c 數目:在發送指定數目的包后停止。

-i 秒數:設定間隔幾秒送一個網絡封包給一台機器,預設值是一秒送一次。

-I 網絡界面:使用指定的網絡界面送出數據包。

-l 前置載入:設置在送出要求信息之前,先行發出的數據包。

-p 范本樣式:設置填滿數據包的范本樣式。

-s 字節數:指定發送的數據字節數,預設值是56,加上8字節的ICMP頭,一共是64ICMP數據字節。

-t 存活數值:設置存活數值TTL的大小。

4.使用實例:

實例1ping的通的情況

命令:

ping 192.168.120.205

輸出:


[root@localhost ~]# ping 192.168.120.205
PING 192.168.120.205 (192.168.120.205) 56(84) bytes of data.
64 bytes from 192.168.120.205: icmp_seq=1 ttl=64 time=0.720 ms
64 bytes from 192.168.120.205: icmp_seq=2 ttl=64 time=0.181 ms
64 bytes from 192.168.120.205: icmp_seq=3 ttl=64 time=0.191 ms
64 bytes from 192.168.120.205: icmp_seq=4 ttl=64 time=0.188 ms
64 bytes from 192.168.120.205: icmp_seq=5 ttl=64 time=0.189 ms

--- 192.168.120.205 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.181/0.293/0.720/0.214 ms
[root@localhost ~]


說明:

實例2ping不通的情況

命令:

ping 192.168.120.202

輸出:


[root@localhost ~]# ping 192.168.120.202
PING 192.168.120.202 (192.168.120.202) 56(84) bytes of data.
From 192.168.120.204 icmp_seq=1 Destination Host Unreachable
From 192.168.120.204 icmp_seq=2 Destination Host Unreachable
From 192.168.120.204 icmp_seq=3 Destination Host Unreachable
From 192.168.120.204 icmp_seq=4 Destination Host Unreachable
From 192.168.120.204 icmp_seq=5 Destination Host Unreachable
From 192.168.120.204 icmp_seq=6 Destination Host Unreachable

--- 192.168.120.202 ping statistics ---
8 packets transmitted, 0 received, +6 errors, 100% packet loss, time 7005ms
, pipe 4
[root@localhost ~]
#


說明:

實例3ping網關

命令:

ping -b 192.168.120.1

輸出:


[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.120.0   *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG    0      0        0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG    0      0        0 eth0
default         192.168.120.240 0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]
# ping -b 192.168.120.1
PING 192.168.120.1 (192.168.120.1) 56(84) bytes of data.
64 bytes from 192.168.120.1: icmp_seq=1 ttl=255 time=2.02 ms
64 bytes from 192.168.120.1: icmp_seq=2 ttl=255 time=1.83 ms
64 bytes from 192.168.120.1: icmp_seq=3 ttl=255 time=1.68 ms
64 bytes from 192.168.120.1: icmp_seq=4 ttl=255 time=1.98 ms
64 bytes from 192.168.120.1: icmp_seq=5 ttl=255 time=1.88 ms

--- 192.168.120.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 1.682/1.880/2.020/0.129 ms


說明:

 

實例4ping指定次數

命令:

ping -c 10 192.168.120.206

輸出:


[root@localhost ~]# ping -c 10 192.168.120.206
PING 192.168.120.206 (192.168.120.206) 56(84) bytes of data.
64 bytes from 192.168.120.206: icmp_seq=1 ttl=64 time=1.25 ms
64 bytes from 192.168.120.206: icmp_seq=2 ttl=64 time=0.260 ms
64 bytes from 192.168.120.206: icmp_seq=3 ttl=64 time=0.242 ms
64 bytes from 192.168.120.206: icmp_seq=4 ttl=64 time=0.271 ms
64 bytes from 192.168.120.206: icmp_seq=5 ttl=64 time=0.274 ms
64 bytes from 192.168.120.206: icmp_seq=6 ttl=64 time=0.295 ms
64 bytes from 192.168.120.206: icmp_seq=7 ttl=64 time=0.269 ms
64 bytes from 192.168.120.206: icmp_seq=8 ttl=64 time=0.270 ms
64 bytes from 192.168.120.206: icmp_seq=9 ttl=64 time=0.253 ms
64 bytes from 192.168.120.206: icmp_seq=10 ttl=64 time=0.289 ms

--- 192.168.120.206 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9000ms
rtt min/avg/max/mdev = 0.242/0.367/1.251/0.295 ms
[root@localhost ~]


說明:

 

實例5:時間間隔和次數限制的ping

命令:

ping -c 10 -i 0.5 192.168.120.206

輸出:


[root@localhost ~]# ping -c 10 -i 0.5 192.168.120.206
PING 192.168.120.206 (192.168.120.206) 56(84) bytes of data.
64 bytes from 192.168.120.206: icmp_seq=1 ttl=64 time=1.24 ms
64 bytes from 192.168.120.206: icmp_seq=2 ttl=64 time=0.235 ms
64 bytes from 192.168.120.206: icmp_seq=3 ttl=64 time=0.244 ms
64 bytes from 192.168.120.206: icmp_seq=4 ttl=64 time=0.300 ms
64 bytes from 192.168.120.206: icmp_seq=5 ttl=64 time=0.255 ms
64 bytes from 192.168.120.206: icmp_seq=6 ttl=64 time=0.264 ms
64 bytes from 192.168.120.206: icmp_seq=7 ttl=64 time=0.263 ms
64 bytes from 192.168.120.206: icmp_seq=8 ttl=64 time=0.331 ms
64 bytes from 192.168.120.206: icmp_seq=9 ttl=64 time=0.247 ms
64 bytes from 192.168.120.206: icmp_seq=10 ttl=64 time=0.244 ms

--- 192.168.120.206 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 4499ms
rtt min/avg/max/mdev = 0.235/0.362/1.241/0.294 ms
[root@localhost ~]
# ping -c 10 -i 0.01 192.168.120.206
PING 192.168.120.206 (192.168.120.206) 56(84) bytes of data.
64 bytes from 192.168.120.206: icmp_seq=1 ttl=64 time=0.244 ms
64 bytes from 192.168.120.206: icmp_seq=2 ttl=64 time=0.195 ms
64 bytes from 192.168.120.206: icmp_seq=3 ttl=64 time=0.219 ms
64 bytes from 192.168.120.206: icmp_seq=4 ttl=64 time=0.204 ms
64 bytes from 192.168.120.206: icmp_seq=5 ttl=64 time=3.56 ms
64 bytes from 192.168.120.206: icmp_seq=6 ttl=64 time=1.93 ms
64 bytes from 192.168.120.206: icmp_seq=7 ttl=64 time=0.193 ms
64 bytes from 192.168.120.206: icmp_seq=8 ttl=64 time=0.193 ms
64 bytes from 192.168.120.206: icmp_seq=9 ttl=64 time=0.202 ms
64 bytes from 192.168.120.206: icmp_seq=10 ttl=64 time=0.211 ms

--- 192.168.120.206 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 90ms
rtt min/avg/max/mdev = 0.193/0.716/3.564/1.080 ms
[root@localhost ~]

說明:

實例6:通過域名ping公網上的站點

命令:

ping -c 5 www.58.com

輸出:


peida-VirtualBox ~ # ping -c 5 www.58.com
PING www.58.com (211.151.111.30) 56(84) bytes of data.
64 bytes from 211.151.111.30: icmp_req=1 ttl=49 time=14.7 ms
64 bytes from 211.151.111.30: icmp_req=2 ttl=49 time=16.4 ms
64 bytes from 211.151.111.30: icmp_req=3 ttl=49 time=15.2 ms
64 bytes from 211.151.111.30: icmp_req=4 ttl=49 time=14.6 ms
64 bytes from 211.151.111.30: icmp_req=5 ttl=49 time=19.9 ms

--- www.58.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 20101ms
rtt min/avg/max/mdev = 14.618/16.192/19.917/1.965 ms
peida-VirtualBox ~ 


說明:

 

實例7:多參數使用

命令:

ping -i 3 -s 1024 -t 255 192.168.120.206

輸出:


[root@localhost ~]# ping -i 3 -s 1024 -t 255 192.168.120.206
PING 192.168.120.206 (192.168.120.206) 1024(1052) bytes of data.
1032 bytes from 192.168.120.206: icmp_seq=1 ttl=64 time=1.99 ms
1032 bytes from 192.168.120.206: icmp_seq=2 ttl=64 time=0.694 ms
1032 bytes from 192.168.120.206: icmp_seq=3 ttl=64 time=0.300 ms
1032 bytes from 192.168.120.206: icmp_seq=4 ttl=64 time=0.481 ms
1032 bytes from 192.168.120.206: icmp_seq=5 ttl=64 time=0.415 ms
1032 bytes from 192.168.120.206: icmp_seq=6 ttl=64 time=0.600 ms
1032 bytes from 192.168.120.206: icmp_seq=7 ttl=64 time=0.411 ms
1032 bytes from 192.168.120.206: icmp_seq=8 ttl=64 time=0.281 ms
1032 bytes from 192.168.120.206: icmp_seq=9 ttl=64 time=0.318 ms
1032 bytes from 192.168.120.206: icmp_seq=10 ttl=64 time=0.362 ms
1032 bytes from 192.168.120.206: icmp_seq=11 ttl=64 time=0.408 ms
1032 bytes from 192.168.120.206: icmp_seq=12 ttl=64 time=0.445 ms
1032 bytes from 192.168.120.206: icmp_seq=13 ttl=64 time=0.397 ms
1032 bytes from 192.168.120.206: icmp_seq=14 ttl=64 time=0.406 ms
1032 bytes from 192.168.120.206: icmp_seq=15 ttl=64 time=0.458 ms

--- 192.168.120.206 ping statistics ---
15 packets transmitted, 15 received, 0% packet loss, time 41999ms
rtt min/avg/max/mdev = 0.281/0.531/1.993/0.404 ms
[root@localhost ~]

    1. traceroute命令

通過traceroute我們可以知道信息從你的計算機到互聯網另一端的主機是走的什么路徑。當然每次數據包由某一同樣的出發點(source)到達某一同樣的目的地(destination)走的路徑可能會不一樣,但基本上來說大部分時候所走的路由是相同的。linux系統中,我們稱之為traceroute,MS Windows中為tracerttraceroute通過發送小的數據包到目的設備直到其返回,來測量其需要多長時間。一條路徑上的每個設備traceroute要測3次。輸出結果中包括每次測試的時間(ms)和設備的名稱(如有的話)及其IP地址。

在大多數情況下,我們會在linux主機系統下,直接執行命令行:

traceroute hostname

而在Windows系統下是執行tracert的命令:

tracert hostname

1.命令格式:

traceroute[參數][主機]

2.命令功能:

traceroute指令讓你追蹤網絡數據包的路由途徑,預設數據包大小是40Bytes,用戶可另行設置。

具體參數格式:traceroute [-dFlnrvx] [-f<存活數值>][-g<網關>...][-i<網絡界面>][-m<存活數值>][-p< 通信端口>][-s<來源地址>][-t<服務類型>][-w<超時秒數>][主機名稱或IP地址][數據包 大小]

3.命令參數:

-d 使用Socket層級的排錯功能。

-f 設置第一個檢測數據包的存活數值TTL的大小。

-F 設置勿離斷位。

-g 設置來源路由網關,最多可設置8個。

-i 使用指定的網絡界面送出數據包。

-I 使用ICMP回應取代UDP資料信息。

-m 設置檢測數據包的最大存活數值TTL的大小。

-n 直接使用IP地址而非主機名稱。

-p 設置UDP傳輸協議的通信端口。

-r 忽略普通的Routing Table,直接將數據包送到遠端主機上。

-s 設置本地主機送出數據包的IP地址。

-t 設置檢測數據包的TOS數值。

-v 詳細顯示指令的執行過程。

-w 設置等待遠端主機回報的時間。

-x 開啟或關閉數據包的正確性檢驗。

4.使用實例:

實例1traceroute 用法簡單、最常用的用法

命令:

traceroute www.baidu.com 

輸出:


[root@localhost ~]# traceroute www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
 1  192.168.74.2 (192.168.74.2)  2.606 ms  2.771 ms  2.950 ms
 2  211.151.56.57 (211.151.56.57)  0.596 ms  0.598 ms  0.591 ms
 3  211.151.227.206 (211.151.227.206)  0.546 ms  0.544 ms  0.538 ms
 4  210.77.139.145 (210.77.139.145)  0.710 ms  0.748 ms  0.801 ms
 5  202.106.42.101 (202.106.42.101)  6.759 ms  6.945 ms  7.107 ms
 6  61.148.154.97 (61.148.154.97)  718.908 ms * bt-228-025.bta.net.cn (202.106.228.25)  5.177 ms
 7  124.65.58.213 (124.65.58.213)  4.343 ms  4.336 ms  4.367 ms
 8  202.106.35.190 (202.106.35.190)  1.795 ms 61.148.156.138 (61.148.156.138)  1.899 ms  1.951 ms
 9  * * *
30  * * *
[root@localhost ~]


說明:

記錄按序列號從1開始,每個紀錄就是一跳 ,每跳表示一個網關,我們看到每行有三個時間,單位是 ms,其實就是-q的默認參數。探測數據包向每個網關發送三個數據包后,網關響應后返回的時間;如果您用 traceroute -q 4 www.58.com ,表示向每個網關發送4個數據包。

有時我們traceroute 一台主機時,會看到有一些行是以星號表示的。出現這樣的情況,可能是防火牆封掉了ICMP的返回信息,所以我們得不到什么相關的數據包返回數據。

有時我們在某一網關處延時比較長,有可能是某台網關比較阻塞,也可能是物理設備本身的原因。當然如果某台DNS出現問題時,不能解析主機名、域名時,也會 有延時長的現象;您可以加-n 參數來避免DNS解析,以IP格式輸出數據。

如 果在局域網中的不同網段之間,我們可以通過traceroute 來排查問題所在,是主機的問題還是網關的問題。如果我們通過遠程來訪問某台服務器遇到問 題時,我們用到traceroute 追蹤數據包所經過的網關,提交IDC服務商,也有助於解決問題;但目前看來在國內解決這樣的問題是比較困難的,就是 我們發現問題所在,IDC服務商也不可能幫助我們解決。

 

實例2跳數設置

命令:

traceroute -m 10 www.baidu.com

輸出:


[root@localhost ~]# traceroute -m 10 www.baidu.com
traceroute to www.baidu.com (61.135.169.105), 10 hops max, 40 byte packets
 1  192.168.74.2 (192.168.74.2)  1.534 ms  1.775 ms  1.961 ms
 2  211.151.56.1 (211.151.56.1)  0.508 ms  0.514 ms  0.507 ms
 3  211.151.227.206 (211.151.227.206)  0.571 ms  0.558 ms  0.550 ms
 4  210.77.139.145 (210.77.139.145)  0.708 ms  0.729 ms  0.785 ms
 5  202.106.42.101 (202.106.42.101)  7.978 ms  8.155 ms  8.311 ms
 6  bt-228-037.bta.net.cn (202.106.228.37)  772.460 ms bt-228-025.bta.net.cn (202.106.228.25)  2.152 ms 61.148.154.97 (61.148.154.97)  772.107 ms
 7  124.65.58.221 (124.65.58.221)  4.875 ms 61.148.146.29 (61.148.146.29)  2.124 ms 124.65.58.221 (124.65.58.221)  4.854 ms
 8  123.126.6.198 (123.126.6.198)  2.944 ms 61.148.156.6 (61.148.156.6)  3.505 ms 123.126.6.198 (123.126.6.198)  2.885 ms
 9  * * *
10  * * *
[root@localhost ~]
#


說明:

 

實例3:顯示IP地址,不查主機名

命令:

traceroute -n www.baidu.com

輸出:


[root@localhost ~]# traceroute -n www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
 1  211.151.74.2  5.430 ms  5.636 ms  5.802 ms
 2  211.151.56.57  0.627 ms  0.625 ms  0.617 ms
 3  211.151.227.206  0.575 ms  0.584 ms  0.576 ms
 4  210.77.139.145  0.703 ms  0.754 ms  0.806 ms
 5  202.106.42.101  23.683 ms  23.869 ms  23.998 ms
 6  202.106.228.37  247.101 ms * *
 7  61.148.146.29  5.256 ms 124.65.58.213  4.386 ms  4.373 ms
 8  202.106.35.190  1.610 ms 61.148.156.138  1.786 ms 61.148.3.34  2.089 ms
 9  * * *
30  * * *
[root@localhost ~]
# traceroute www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
 1  211.151.74.2 (211.151.74.2)  4.671 ms  4.865 ms  5.055 ms
 2  211.151.56.57 (211.151.56.57)  0.619 ms  0.618 ms  0.612 ms
 3  211.151.227.206 (211.151.227.206)  0.620 ms  0.642 ms  0.636 ms
 4  210.77.139.145 (210.77.139.145)  0.720 ms  0.772 ms  0.816 ms
 5  202.106.42.101 (202.106.42.101)  7.667 ms  7.910 ms  8.012 ms
 6  bt-228-025.bta.net.cn (202.106.228.25)  2.965 ms  2.440 ms 61.148.154.97 (61.148.154.97)  431.337 ms
 7  124.65.58.213 (124.65.58.213)  5.134 ms  5.124 ms  5.044 ms
 8  202.106.35.190 (202.106.35.190)  1.917 ms  2.052 ms  2.059 ms
 9  * * *
30  * * *
[root@localhost ~]


說明:

 

實例4:探測包使用的基本UDP端口設置6888

命令:

traceroute -p 6888 www.baidu.com

輸出:


[root@localhost ~]# traceroute -p 6888 www.baidu.com
traceroute to www.baidu.com (220.181.111.147), 30 hops max, 40 byte packets
 1  211.151.74.2 (211.151.74.2)  4.927 ms  5.121 ms  5.298 ms
 2  211.151.56.1 (211.151.56.1)  0.500 ms  0.499 ms  0.509 ms
 3  211.151.224.90 (211.151.224.90)  0.637 ms  0.631 ms  0.641 ms
 4  * * *
 5  220.181.70.98 (220.181.70.98)  5.050 ms  5.313 ms  5.596 ms
 6  220.181.17.94 (220.181.17.94)  1.665 ms !X * *
[root@localhost ~]


說明:

 

實例5:把探測包的個數設置為值4

命令:

traceroute -q 4 www.baidu.com

輸出:


[root@localhost ~]# traceroute -q 4 www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
 1  211.151.74.2 (211.151.74.2)  40.633 ms  40.819 ms  41.004 ms  41.188 ms
 2  211.151.56.57 (211.151.56.57)  0.637 ms  0.633 ms  0.627 ms  0.619 ms
 3  211.151.227.206 (211.151.227.206)  0.505 ms  0.580 ms  0.571 ms  0.569 ms
 4  210.77.139.145 (210.77.139.145)  0.753 ms  0.800 ms  0.853 ms  0.904 ms
 5  202.106.42.101 (202.106.42.101)  7.449 ms  7.543 ms  7.738 ms  7.893 ms
 6  61.148.154.97 (61.148.154.97)  316.817 ms bt-228-025.bta.net.cn (202.106.228.25)  3.695 ms  3.672 ms *
 7  124.65.58.213 (124.65.58.213)  3.056 ms  2.993 ms  2.960 ms 61.148.146.29 (61.148.146.29)  2.837 ms
 8  61.148.3.34 (61.148.3.34)  2.179 ms  2.295 ms  2.442 ms 202.106.35.190 (202.106.35.190)  7.136 ms
 9  * * * *
30  * * * *
[root@localhost ~]


說明:

 

實例6:繞過正常的路由表,直接發送到網絡相連的主機

命令:

 traceroute -r www.baidu.com

輸出:

[root@localhost ~]# traceroute -r www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
connect: 
網絡不可達
[root@localhost ~]
 

說明:

 

實例7把對外發探測包的等待響應時間設置為3

命令:

traceroute -w 3 www.baidu.com

輸出:


[root@localhost ~]# traceroute -w 3 www.baidu.com
traceroute to www.baidu.com (61.135.169.105), 30 hops max, 40 byte packets
 1  211.151.74.2 (211.151.74.2)  2.306 ms  2.469 ms  2.650 ms
 2  211.151.56.1 (211.151.56.1)  0.621 ms  0.613 ms  0.603 ms
 3  211.151.227.206 (211.151.227.206)  0.557 ms  0.560 ms  0.552 ms
 4  210.77.139.145 (210.77.139.145)  0.708 ms  0.761 ms  0.817 ms
 5  202.106.42.101 (202.106.42.101)  7.520 ms  7.774 ms  7.902 ms
 6  bt-228-025.bta.net.cn (202.106.228.25)  2.890 ms  2.369 ms 61.148.154.97 (61.148.154.97)  471.961 ms
 7  124.65.58.221 (124.65.58.221)  4.490 ms  4.483 ms  4.472 ms
 8  123.126.6.198 (123.126.6.198)  2.948 ms 61.148.156.6 (61.148.156.6)  7.688 ms  7.756 ms
 9  * * *
30  * * *
[root@localhost ~]


說明:

 

Traceroute的工作原理:

Traceroute最簡單的基本用法是:traceroute hostname

Traceroute 程序的設計是利用ICMPIP headerTTLTime To Live)欄位(field)。首先,traceroute送出一個TTL1 IP datagram(其實,每次送出的為340字節的包,包括源地址,目的地址和包發出的時間標簽)到目的地,當路徑上的第一個路由器 (router)收到這個datagram時,它將TTL1。此時,TTL變為0了,所以該路由器會將此datagram丟掉,並送回一個 「ICMP time exceeded」消息(包括發IP包的源地址,IP包的所有內容及路由器的IP地址),traceroute 收到這個消息后, 便知道這個路由器存在於這個路徑上,接着traceroute 再送出另一個TTL2 datagram,發現第2 個路由 器...... traceroute 每次將送出的datagramTTL 1來發現另一個路由器,這個重復的動作一直持續到某個 datagram 抵達目的地。當datagram到達目的地后,該主機並不會送回ICMP time exceeded消息,因為它已是目的地了,那么 traceroute如何得知目的地到達了呢?

Traceroute 在送出UDP datagrams到目的地時,它所選擇送達的port number 是一個一般應用程序都不會用的號碼(30000 以上),所以當此 UDP datagram 到達目的地后該主機會送回一個「ICMP port unreachable」的消息,而當traceroute 收到這個消 息時,便知道目的地已經到達了。所以traceroute Server端也是沒有所謂的Daemon 程式。

Traceroute提取發 ICMP TTL到期消息設備的IP地址並作域名解析。每次 ,Traceroute都打印出一系列數據,包括所經過的路由設備的域名及 IP地址,三個包每次來回所花時間。

 

windowstracert:

格式:

tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name

參數說明:

tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name

該 診斷實用程序通過向目的地發送具有不同生存時間 (TL) Internet 控制信息協議 (CMP) 回應報文,以確定至目的地的路由。路徑上的 每個路由器都要在轉發該 ICMP 回應報文之前將其 TTL 值至少減 1,因此 TTL 是有效的跳轉計數。當報文的 TTL 值減少到 0 時,路 由器向源系統發回 ICMP 超時信息。通過發送 TTL 1 的第一個回應報文並且在隨后的發送中每次將 TTL 值加 1,直到目標響應或達到最 大 TTL 值,Tracert 可以確定路由。通過檢查中間路由器發發回的 ICMP 超時 (ime Exceeded) 信息,可以確定路由器。注 意,有些路由器“安靜”地丟棄生存時間 (TLS) 過期的報文並且對 tracert 無效。

參數:

-d 指定不對計算機名解析地址。

-h maximum_hops 指定查找目標的跳轉的最大數目。

-jcomputer-list 指定在 computer-list 中松散源路由。

-w timeout 等待由 timeout 對每個應答指定的毫秒數。

target_name 目標計算機的名稱。

實例:


C:\Users\Administrator>tracert www.58.com

Tracing route to www.58.com [221.187.111.30]
over a maximum of 30 hops:

  1     1 ms     1 ms     1 ms  10.58.156.1
  2     1 ms    <1 ms    <1 ms  10.10.10.1
  3     1 ms     1 ms     1 ms  211.103.193.129
  4     2 ms     2 ms     2 ms  10.255.109.129
  5     1 ms     1 ms     3 ms  124.205.98.205
  6     2 ms     2 ms     2 ms  124.205.98.253
  7     2 ms     6 ms     1 ms  202.99.1.125
  8     5 ms     6 ms     5 ms  118.186.0.113
  9   207 ms     *        *     118.186.0.106
 10     8 ms     6 ms    11 ms  124.238.226.201
 11     6 ms     7 ms     6 ms  219.148.19.177
 12    12 ms    12 ms    16 ms  219.148.18.117
 13    14 ms    17 ms    16 ms  219.148.19.125
 14    13 ms    13 ms    12 ms  202.97.80.113
 15     *        *        *     Request timed out.
 16    12 ms    12 ms    17 ms  bj141-147-82.bjtelecom.net [219.141.147.82]
 17    13 ms    13 ms    12 ms  202.97.48.2
 18     *        *        *     Request timed out.
 19    14 ms    14 ms    12 ms  221.187.224.85
 20    15 ms    13 ms    12 ms  221.187.104.2
 21     *        *        *     Request timed out.
 22    15 ms    17 ms    18 ms  221.187.111.30

Trace complete.

    1. netstat命令

netstat命令用於顯示與IPTCPUDPICMP協議相關的統計數據,一般用於檢驗本機各端口的網絡連接情況。netstat是在內核中訪問網絡及相關信息的程序,它能提供TCP連接,TCPUDP監聽,進程內存管理的相關報告。

如果你的計算機有時候接收到的數據報導致出錯數據或故障,你不必感到奇怪,TCP/IP可以容許這些類型的錯誤,並能夠自動重發數據報。但如果累計的出錯情況數目占到所接收的IP數據報相當大的百分比,或者它的數目正迅速增加,那么你就應該使用netstat查一查為什么會出現這些情況了。

1命令格式:

netstat [-acCeFghilMnNoprstuvVwx][-A<網絡類型>][--ip]

2命令功能:

netstat用於顯示與IPTCPUDPICMP協議相關的統計數據,一般用於檢驗本機各端口的網絡連接情況。

3命令參數:

-a或–all 顯示所有連線中的Socket

-A<網絡類型>或–<網絡類型> 列出該網絡類型連線中的相關地址。

-c或–continuous 持續列出網絡狀態。

-C或–cache 顯示路由器配置的快取信息。

-e或–extend 顯示網絡其他相關信息。

-F或–fib 顯示FIB

-g或–groups 顯示多重廣播功能群組組員名單。

-h或–help 在線幫助。

-i或–interfaces 顯示網絡界面信息表單。

-l或–listening 顯示監控中的服務器的Socket

-M或–masquerade 顯示偽裝的網絡連線。

-n或–numeric 直接使用IP地址,而不通過域名服務器。

-N或–netlink或–symbolic 顯示網絡硬件外圍設備的符號連接名稱。

-o或–timers 顯示計時器。

-p或–programs 顯示正在使用Socket的程序識別碼和程序名稱。

-r或–route 顯示Routing Table

-s或–statistice 顯示網絡工作信息統計表。

-t或–tcp 顯示TCP傳輸協議的連線狀況。

-u或–udp 顯示UDP傳輸協議的連線狀況。

-v或–verbose 顯示指令執行過程。

-V或–version 顯示版本信息。

-w或–raw 顯示RAW傳輸協議的連線狀況。

-x或–unix 此參數的效果和指定”-A unix”參數相同。

ip或–inet 此參數的效果和指定”-A inet”參數相同。

4使用實例:

實例1:無參數使用

命令:

netstat

輸出:


[root@localhost ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0    268 192.168.120.204:ssh         10.2.0.68:62420             ESTABLISHED 
udp        0      0 192.168.120.204:4371        10.58.119.119:domain        ESTABLISHED 
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         DGRAM                    1491   @/org/kernel/udev/udevd
unix  4      [ ]         DGRAM                    7337   /dev/log
unix  2      [ ]         DGRAM                    708823 
unix  2      [ ]         DGRAM                    7539   
unix  3      [ ]         STREAM     CONNECTED     7287   
unix  3      [ ]         STREAM     CONNECTED     7286   
[root@localhost ~]
#


說明:

從整體上看,netstat的輸出結果可以分為兩個部分:

一個是Active Internet connections,稱為有源TCP連接,其中"Recv-Q""Send-Q"指的是接收隊列和發送隊列。這些數字一般都應該是0。如果不是則表示軟件包正在隊列中堆積。這種情況只能在非常少的情況見到。

另一個是Active UNIX domain sockets,稱為有源Unix域套接口(和網絡套接字一樣,但是只能用於本機通信,性能可以提高一倍)

Proto顯示連接使用的協議,RefCnt表示連接到本套接口上的進程號,Types顯示套接口的類型,State顯示套接口當前的狀態,Path表示連接到套接口的其它進程使用的路徑名。

套接口類型:

-t TCP

-u UDP

-raw RAW類型

--unix UNIX域類型

--ax25 AX25類型

--ipx ipx類型

--netrom netrom類型

狀態說明:

LISTEN:偵聽來自遠方的TCP端口的連接請求

SYN-SENT:再發送連接請求后等待匹配的連接請求(如果有大量這樣的狀態包,檢查是否中招了)

SYN-RECEIVED:再收到和發送一個連接請求后等待對方對連接請求的確認(如有大量此狀態,估計被flood攻擊了)

ESTABLISHED:代表一個打開的連接

FIN-WAIT-1:等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認

FIN-WAIT-2:從遠程TCP等待連接中斷請求

CLOSE-WAIT:等待從本地用戶發來的連接中斷請求

CLOSING:等待遠程TCP對連接中斷的確認

LAST-ACK:等待原來的發向遠程TCP的連接中斷請求的確認(不是什么好東西,此項出現,檢查是否被攻擊)

TIME-WAIT:等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認

CLOSED:沒有任何連接狀態

 

實例2:列出所有端口

命令:

netstat -a

輸出:


[root@localhost ~]# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 localhost:smux              *:*                         LISTEN      
tcp        0      0 *:svn                       *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0    284 192.168.120.204:ssh         10.2.0.68:62420             ESTABLISHED 
udp        0      0 localhost:syslog            *:*                                     
udp        0      0 *:snmp                      *:*                                     
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     708833 /tmp/ssh-yKnDB15725/agent.15725
unix  2      [ ACC ]     STREAM     LISTENING     7296   /var/run/audispd_events
unix  2      [ ]         DGRAM                    1491   @/org/kernel/udev/udevd
unix  4      [ ]         DGRAM                    7337   /dev/log
unix  2      [ ]         DGRAM                    708823 
unix  2      [ ]         DGRAM                    7539   
unix  3      [ ]         STREAM     CONNECTED     7287   
unix  3      [ ]         STREAM     CONNECTED     7286   
[root@localhost ~]


說明:

顯示一個所有的有效連接信息列表,包括已建立的連接(ESTABLISHED),也包括監聽連接請(LISTENING)的那些連接。

 

實例3:顯示當前UDP連接狀況

命令:

netstat -nu

輸出:


[root@andy ~]# netstat -nu
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
udp        0      0 ::ffff:192.168.12:53392     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:56723     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:56480     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:58154     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:44227     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:36954     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:53984     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:57703     ::ffff:192.168.9.120:10000  ESTABLISHED 
udp        0      0 ::ffff:192.168.12:53613     ::ffff:192.168.9.120:10000  ESTABLISHED 
[root@andy ~]


說明:

 

實例4:顯示UDP端口號的使用情況

命令:

netstat -apu

輸出:


[root@andy ~]# netstat -apu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
udp        0      0 *:57604                     *:*                                     28094/java          
udp        0      0 *:40583                     *:*                                     21220/java          
udp        0      0 *:45451                     *:*                                     14583/java          
udp        0      0 ::ffff:192.168.12:53392     ::ffff:192.168.9.120:ndmp   ESTABLISHED 19327/java          
udp        0      0 *:52370                     *:*                                     15841/java          
udp        0      0 ::ffff:192.168.12:56723     ::ffff:192.168.9.120:ndmp   ESTABLISHED 15841/java          
udp        0      0 *:44182                     *:*                                     31757/java          
udp        0      0 *:48155                     *:*                                     5476/java           
udp        0      0 *:59808                     *:*                                     17333/java          
udp        0      0 ::ffff:192.168.12:56480     ::ffff:192.168.9.120:ndmp   ESTABLISHED 28094/java          
udp        0      0 ::ffff:192.168.12:58154     ::ffff:192.168.9.120:ndmp   ESTABLISHED 15429/java          
udp        0      0 *:36780                     *:*                                     10091/java          
udp        0      0 *:36795                     *:*                                     24594/java          
udp        0      0 *:41922                     *:*                                     20506/java          
udp        0      0 ::ffff:192.168.12:44227     ::ffff:192.168.9.120:ndmp   ESTABLISHED 17333/java          
udp        0      0 *:34258                     *:*                                     8866/java           
udp        0      0 *:55508                     *:*                                     11667/java          
udp        0      0 *:36055                     *:*                                     12425/java          
udp        0      0 ::ffff:192.168.12:36954     ::ffff:192.168.9.120:ndmp   ESTABLISHED 16532/java          
udp        0      0 ::ffff:192.168.12:53984     ::ffff:192.168.9.120:ndmp   ESTABLISHED 20506/java          
udp        0      0 ::ffff:192.168.12:57703     ::ffff:192.168.9.120:ndmp   ESTABLISHED 31757/java          
udp        0      0 ::ffff:192.168.12:53613     ::ffff:192.168.9.120:ndmp   ESTABLISHED 3199/java           
udp        0      0 *:56309                     *:*                                     15429/java          
udp        0      0 *:54007                     *:*                                     16532/java          
udp        0      0 *:39544                     *:*                                     3199/java           
udp        0      0 *:43900                     *:*                                     19327/java          
[root@andy ~]


說明:

 

實例5:顯示網卡列表

命令:

netstat -i

輸出:


[root@andy ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0 151818887      0      0      0 198928403      0      0      0 BMRU
lo        16436   0   107235      0      0      0   107235      0      0      0 LRU
[root@andy ~]


說明:

 

實例6:顯示組播組的關系

命令:

netstat -g

輸出:


[root@andy ~]# netstat -g
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      all-systems.mcast.net
eth0            1      all-systems.mcast.net
lo              1      ff02::1
eth0            1      ff02::1:ffff:9b0c
eth0            1      ff02::1
[root@andy ~]


說明:

 

實例7:顯示網絡統計信息

命令:

netstat -s

輸出:


[root@localhost ~]# netstat -s
Ip:
    530999 total packets received
    0 forwarded
    0 incoming packets discarded
    530999 incoming packets delivered
    8258 requests sent out
    1 dropped because of missing route
Icmp:
    90 ICMP messages received
    0 input ICMP message failed.
    ICMP input histogram:
        destination unreachable: 17
        echo requests: 1
        echo replies: 72
    106 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 8
        echo request: 97
        echo replies: 1
IcmpMsg:
        InType0: 72
        InType3: 17
        InType8: 1
        OutType0: 1
        OutType3: 8
        OutType8: 97
Tcp:
    8 active connections openings
    15 passive connection openings
    8 failed connection attempts
    3 connection resets received
    1 connections established
    3132 segments received
    2617 segments send out
    53 segments retransmited
    0 bad segments received.
    252 resets sent
Udp:
    0 packets received
    0 packets to unknown port received.
    0 packet receive errors
    5482 packets sent
TcpExt:
    1 invalid SYN cookies received
    1 TCP sockets finished time wait 
in fast timer
    57 delayed acks sent
    Quick ack mode was activated 50 times
    60 packets directly queued to recvmsg prequeue.
    68 packets directly received from backlog
    4399 packets directly received from prequeue
    520 packets header predicted
    51 packets header predicted and directly queued to user
    1194 acknowledgments not containing data received
    21 predicted acknowledgments
    0 TCP data loss events
    1 timeouts after reno fast retransmit
    9 retransmits 
in slow start
    42 other TCP timeouts
    3 connections aborted due to timeout
IpExt:
    InBcastPkts: 527777


說明:

按照各個協議分別顯示其統計數據。如果我們的應用程序(如Web瀏覽器)運行速度比較慢,或者不能顯示Web頁之類的數據,那么我們就可以用本選項來查看一下所顯示的信息。我們需要仔細查看統計數據的各行,找到出錯的關鍵字,進而確定問題所在。

 

實例8:顯示監聽的套接口

命令:

netstat -l

輸出:


[root@localhost ~]# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 localhost:smux              *:*                         LISTEN      
tcp        0      0 *:svn                       *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
udp        0      0 localhost:syslog            *:*                                     
udp        0      0 *:snmp                      *:*                                     
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     708833 /tmp/ssh-yKnDB15725/agent.15725
unix  2      [ ACC ]     STREAM     LISTENING     7296   /var/run/audispd_events
[root@localhost ~]


 

說明:

 

實例9:顯示所有已建立的有效連接

命令:

netstat -n

輸出:


[root@localhost ~]# netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0    268 192.168.120.204:22          10.2.0.68:62420             ESTABLISHED 
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         DGRAM                    1491   @/org/kernel/udev/udevd
unix  4      [ ]         DGRAM                    7337   /dev/log
unix  2      [ ]         DGRAM                    708823 
unix  2      [ ]         DGRAM                    7539   
unix  3      [ ]         STREAM     CONNECTED     7287   
unix  3      [ ]         STREAM     CONNECTED     7286   
[root@localhost ~]


 

說明:

 

實例10:顯示關於以太網的統計數據

命令:

netstat -e

輸出:


[root@localhost ~]# netstat -e
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       User       Inode     
tcp        0    248 192.168.120.204:ssh         10.2.0.68:62420             ESTABLISHED root       708795     
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         DGRAM                    1491   @/org/kernel/udev/udevd
unix  4      [ ]         DGRAM                    7337   /dev/log
unix  2      [ ]         DGRAM                    708823 
unix  2      [ ]         DGRAM                    7539   
unix  3      [ ]         STREAM     CONNECTED     7287   
unix  3      [ ]         STREAM     CONNECTED     7286   
[root@localhost ~]
#


 

說明:

用於顯示關於以太網的統計數據。它列出的項目包括傳送的數據報的總字節數、錯誤數、刪除數、數據報的數量和廣播的數量。這些統計數據既有發送的數據報數量,也有接收的數據報數量。這個選項可以用來統計一些基本的網絡流量)

 

實例11:顯示關於路由表的信息

命令:

netstat -r

輸出:


[root@localhost ~]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.120.0   *               255.255.255.0   U         0 0          0 eth0
192.168.0.0     192.168.120.1   255.255.0.0     UG        0 0          0 eth0
10.0.0.0        192.168.120.1   255.0.0.0       UG        0 0          0 eth0
default         192.168.120.240 0.0.0.0         UG        0 0          0 eth0
[root@localhost ~]


 

說明:

 

實例12:列出所有 tcp 端口

命令:

netstat -at

輸出:


[root@localhost ~]# netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 localhost:smux              *:*                         LISTEN      
tcp        0      0 *:svn                       *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0    284 192.168.120.204:ssh         10.2.0.68:62420             ESTABLISHED 
[root@localhost ~]
#


 

說明:

 

實例13:統計機器中網絡連接各個狀態個數

命令:

netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

輸出:

[root@localhost ~]# netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 1
LISTEN 3
[root@localhost ~]

 

說明:

 

實例14把狀態全都取出來后使用uniq -c統計后再進行排序

命令:

netstat -nat |awk '{print $6}'|sort|uniq -c

輸出:


[root@andy ~]# netstat -nat |awk '{print $6}'|sort|uniq -c
     14 CLOSE_WAIT
      1 established)
    578 ESTABLISHED
      1 Foreign
     43 LISTEN
      5 TIME_WAIT
[root@andy ~]
# netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
    576 ESTABLISHED
     43 LISTEN
     14 CLOSE_WAIT
      5 TIME_WAIT
      1 Foreign
      1 established)
[root@andy ~]
#


 

說明:

 

實例15:查看連接某服務端口最多的的IP地址

命令:

netstat -nat | grep "192.168.120.20:16067" |awk '{print $5}'|awk -F: '{print $4}'|sort|uniq -c|sort -nr|head -20

輸出:


[root@andy ~]# netstat -nat | grep "192.168.120.20:16067" |awk '{print $5}'|awk -F: '{print $4}'|sort|uniq -c|sort -nr|head -20
      8 10.2.1.68
      7 192.168.119.13
      6 192.168.119.201
      6 192.168.119.20
      6 192.168.119.10
      4 10.2.1.199
      3 10.2.1.207
      2 192.168.120.20
      2 192.168.120.15
      2 192.168.119.197
      2 192.168.119.11
      2 10.2.1.206
      2 10.2.1.203
      2 10.2.1.189
      2 10.2.1.173
      1 192.168.120.18
      1 192.168.119.19
      1 10.2.2.227
      1 10.2.2.138
      1 10.2.1.208
[root@andy ~]


 

說明:

 

實例16:找出程序運行的端口

命令:

netstat -ap | grep ssh

輸出:


[root@andy ~]# netstat -ap | grep ssh
tcp        0      0 *:ssh                       *:*                         LISTEN      2570/sshd           
tcp        0      0 ::ffff:192.168.120.206:ssh  ::ffff:10.2.1.205:54508     ESTABLISHED 13883/14            
tcp        0      0 ::ffff:192.168.120.206:ssh  ::ffff:10.2.0.68:62886      ESTABLISHED 20900/6             
tcp        0      0 ::ffff:192.168.120.206:ssh  ::ffff:10.2.2.131:52730     ESTABLISHED 20285/sshd: root@no 
unix  2      [ ACC ]     STREAM     LISTENING     194494461 20900/6             /tmp/ssh-cXIJj20900/agent.20900
unix  3      [ ]         STREAM     CONNECTED     194307443 20285/sshd: root@no 
unix  3      [ ]         STREAM     CONNECTED     194307441 20285/sshd: root@no 
[root@andy ~]


 

說明:

 

實例17:在 netstat 輸出中顯示 PID 和進程名稱

命令:

netstat -pt

輸出:

[root@localhost ~]# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0    248 192.168.120.204:ssh         10.2.0.68:62420             ESTABLISHED 15725/0             
[root@localhost ~]

 

說明:

netstat -p 可以與其它開關一起使用,就可以添加 “PID/進程名稱” 到 netstat 輸出中,這樣 debugging 的時候可以很方便的發現特定端口運行的程序。

 

實例18:找出運行在指定端口的進程

命令:

netstat -anpt | grep ':16064'

輸出:


[root@andy ~]# netstat -anpt | grep ':16064'
tcp        0      0 :::16064                    :::*                        LISTEN      24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:192.168.119.201:6462 ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:192.168.119.20:26341 ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:192.168.119.20:32208 ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:192.168.119.20:32207 ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:51303      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:51302      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:50020      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:50019      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:56155      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:50681      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:50680      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:52136      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:56989      ESTABLISHED 24594/java          
tcp        0      0 ::ffff:192.168.120.20:16064 ::ffff:10.2.1.68:56988      ESTABLISHED 24594/java          
[root@andy ~]


 

說明:

運行在端口16064的進程id24596,再通過ps命令就可以找到具體的應用程序了。

    1. ss命令

ssSocket Statistics的縮寫。顧名思義,ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容。但ss的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。

當 服務器的socket連接數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。可能你不會有 切身的感受,但請相信我,當服務器維持的連接達到上萬個的時候,使用netstat等於浪費 生命,而用ss才是節省時間。

天 下武功唯快不破。ss快的秘訣在於,它利用到了TCP協議棧中tcp_diagtcp_diag是一個用於分析統計的模塊,可以獲得Linux 內核中 第一手的信息,這就確保了ss的快捷高效。當然,如果你的系統中沒有tcp_diagss也可以正常運行,只是效率會變得稍慢。(但仍然 比 netstat要快。)

1.命令格式:

ss [參數]

ss [參數] [過濾]

2.命令功能:

ss(Socket Statistics 的縮寫)命令可以用來獲取 socket統計信息,此命令輸出的結果類似於 netstat輸出的內容,但它能顯示更多更詳細的 TCP連接狀態的信息, 且比 netstat 更快速高效。它使用了 TCP協議棧中 tcp_diag(是一個用於分析統計的模塊),能直接從獲得第一手內核信息,這就使 得 ss命令快捷高效。在沒有 tcp_diagss也可以正常運行。

3.命令參數:

-h, --help 幫助信息

-V, --version 程序版本信息

-n, --numeric 不解析服務名稱

-r, --resolve 解析主機名

-a, --all 顯示所有套接字(sockets

-l, --listening 顯示監聽狀態的套接字(sockets

-o, --options 顯示計時器信息

-e, --extended 顯示詳細的套接字(sockets)信息

-m, --memory 顯示套接字(socket)的內存使用情況

-p, --processes 顯示使用套接字(socket)的進程

-i, --info 顯示 TCP內部信息

-s, --summary 顯示套接字(socket)使用概況

-4, --ipv4 僅顯示IPv4的套接字(sockets

-6, --ipv6 僅顯示IPv6的套接字(sockets

-0, --packet 顯示 PACKET 套接字(socket

-t, --tcp 僅顯示 TCP套接字(sockets

-u, --udp 僅顯示 UCP套接字(sockets

-d, --dccp 僅顯示 DCCP套接字(sockets

-w, --raw 僅顯示 RAW套接字(sockets

-x, --unix 僅顯示 Unix套接字(sockets

-f, --family=FAMILY 顯示 FAMILY類型的套接字(sockets),FAMILY可選,支持 unix, inet, inet6, link, netlink

-A, --query=QUERY, --socket=QUERY

QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

-D, --diag=FILE 將原始TCP套接字(sockets)信息轉儲到文件

-F, --filter=FILE 從文件中都去過濾器信息

FILTER := [ state TCP-STATE ] [ EXPRESSION ]

4.使用實例:

實例1:顯示TCP連接

命令:

ss -t -a

輸出:


[root@localhost ~]# ss -t -a
State      Recv-Q Send-Q                                Local Address:Port                                    Peer Address:Port   
LISTEN     0      0                                         127.0.0.1:smux                                               *:*       
LISTEN     0      0                                                 *:3690                                               *:*       
LISTEN     0      0                                                 *:ssh                                                *:*       
ESTAB      0      0                                   192.168.120.204:ssh                                        10.2.0.68:49368   
[root@localhost ~]


說明:

實例2:顯示 Sockets 摘要

命令:

ss -s

輸出:


[root@localhost ~]# ss -s
Total: 34 (kernel 48)
TCP:   4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 3

Transport Total     IP        IPv6
*         48        -         -        
RAW       0         0         0        
UDP       5         5         0        
TCP       4         4         0        
INET      9         9         0        
FRAG      0         0         0        

[root@localhost ~]


說明:

列出當前的established, closed, orphaned and waiting TCP sockets

實例3列出所有打開的網絡連接端口

命令:

ss -l

輸出:


[root@localhost ~]# ss -l
Recv-Q Send-Q                                     Local Address:Port                                         Peer Address:Port   
0      0                                              127.0.0.1:smux                                                    *:*       
0      0                                                      *:3690                                                    *:*       
0      0                                                      *:ssh                                                     *:*       
[root@localhost ~]
 


說明:

實例4:查看進程使用的socket

命令:

ss -pl

輸出:


[root@localhost ~]# ss -pl
Recv-Q Send-Q                                     Local Address:Port                                         Peer Address:Port   
0      0                                              127.0.0.1:smux                                                    *:*        users:((
"snmpd",2716,8))
0      0                                                      *:3690                                                    *:*        users:((
"svnserve",3590,3))
0      0                                                      *:ssh                                                     *:*        users:((
"sshd",2735,3))
[root@localhost ~]
#


說明:

實例5:找出打開套接字/端口應用程序

命令:

ss -lp | grep 3306

輸出:


[root@localhost ~]# ss -lp|grep 1935
0      0                            *:1935                          *:*        users:(("fmsedge",2913,18))
0      0                    127.0.0.1:19350                         *:*        users:((
"fmsedge",2913,17))
[root@localhost ~]
# ss -lp|grep 3306
0      0                            *:3306                          *:*        users:(("mysqld",2871,10))
[root@localhost ~]


說明:

實例6:顯示所有UDP Sockets

命令:

ss -u -a

輸出:


[root@localhost ~]# ss -u -a
State      Recv-Q Send-Q                                Local Address:Port                                    Peer Address:Port   
UNCONN     0      0                                         127.0.0.1:syslog                                             *:*       
UNCONN     0      0                                                 *:snmp                                               *:*       
ESTAB      0      0                                   192.168.120.203:39641                                  10.58.119.119:domain 
[root@localhost ~]
#


說明:

實例7:顯示所有狀態為establishedSMTP連接

命令:

ss -o state established '( dport = :smtp or sport = :smtp )'

輸出:

[root@localhost ~]# ss -o state established '( dport = :smtp or sport = :smtp )' 
Recv-Q Send-Q                                     Local Address:Port                                         Peer Address:Port   
[root@localhost ~]
#

說明:

實例8:顯示所有狀態為EstablishedHTTP連接

命令:

ss -o state established '( dport = :http or sport = :http )'

輸出:

[root@localhost ~]# ss -o state established '( dport = :http or sport = :http )' 
Recv-Q Send-Q                                     Local Address:Port                                         Peer Address:Port   
0      0                                              75.126.153.214:2164                                        192.168.10.42:http    
[root@localhost ~]

說明:

實例9:列舉出處於 FIN-WAIT-1狀態的源端口為 80或者 443,目標網絡為 193.233.7/24所有 tcp套接字

命令:

ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24

輸出:

說明:

實例10:用TCP 狀態過濾Sockets:

命令:

ss -4 state FILTER-NAME-HERE

ss -6 state FILTER-NAME-HERE

輸出:

[root@localhost ~]#ss -4 state closing 
Recv-Q Send-Q                                                  Local Address:Port                                                      Peer Address:Port 
1      11094                                                  75.126.153.214:http                                                      192.168.10.42:4669 

說明:

FILTER-NAME-HERE 可以代表以下任何一個:

established

syn-sent

syn-recv

fin-wait-1

fin-wait-2

time-wait

closed

close-wait

last-ack

listen

closing

 

all : 所有以上狀態

connected : 除了listen and closed的所有狀態

synchronized :所有已連接的狀態除了syn-sent

bucket : 顯示狀態為maintained as minisockets,如:time-waitsyn-recv.

big : bucket相反.

實例11匹配遠程地址和端口號

命令:

ss dst ADDRESS_PATTERN

ss dst 192.168.1.5

ss dst 192.168.119.113:http

ss dst 192.168.119.113:smtp

ss dst 192.168.119.113:443

輸出:


[root@localhost ~]# ss dst 192.168.119.113
State      Recv-Q Send-Q                                Local Address:Port                                    Peer Address:Port   
ESTAB      0      0                                   192.168.119.103:16014                                192.168.119.113:20229   
ESTAB      0      0                                   192.168.119.103:16014                                192.168.119.113:61056   
ESTAB      0      0                                   192.168.119.103:16014                                192.168.119.113:61623   
ESTAB      0      0                                   192.168.119.103:16014                                192.168.119.113:60924   
ESTAB      0      0                                   192.168.119.103:16050                                192.168.119.113:43701   
ESTAB      0      0                                   192.168.119.103:16073                                192.168.119.113:32930   
ESTAB      0      0                                   192.168.119.103:16073                                192.168.119.113:49318   
ESTAB      0      0                                   192.168.119.103:16014                                192.168.119.113:3844    
[root@localhost ~]
# ss dst 192.168.119.113:http
State      Recv-Q Send-Q                                Local Address:Port                                    Peer Address:Port   
[root@localhost ~]
# ss dst 192.168.119.113:3844
State      Recv-Q Send-Q                                Local Address:Port                                    Peer Address:Port   
ESTAB      0      0                                   192.168.119.103:16014                                192.168.119.113:3844    
[root@localhost ~]


說明:

實例12:匹配本地地址和端口號

命令:

ss src ADDRESS_PATTERN

ss src 192.168.119.103

ss src 192.168.119.103:http

ss src 192.168.119.103:80

ss src 192.168.119.103:smtp

ss src 192.168.119.103:25

輸出:


[root@localhost ~]# ss src 192.168.119.103:16021
State      Recv-Q Send-Q                                Local Address:Port                                    Peer Address:Port   
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.201:63054   
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.201:62894   
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.201:63055   
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.201:2274    
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.201:44784   
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.201:7233    
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.103:58660   
ESTAB      0      0                                   192.168.119.103:16021                                192.168.119.201:44822   
ESTAB      0      0                                   192.168.119.103:16021                                     10.2.1.206:56737   
ESTAB      0      0                                   192.168.119.103:16021                                     10.2.1.206:57487   
ESTAB      0      0                                   192.168.119.103:16021                                     10.2.1.206:56736   
ESTAB      0      0                                   192.168.119.103:16021                                     10.2.1.206:64652   
ESTAB      0      0                                   192.168.119.103:16021                                     10.2.1.206:56586   
ESTAB      0      0                                   192.168.119.103:16021                                     10.2.1.206:64653   
ESTAB      0      0                                   192.168.119.103:16021                                     10.2.1.206:56587   
[root@localhost ~]


說明:

實例13:將本地或者遠程端口和一個數比較

命令:

ss dport OP PORT 

ss sport OP PORT

輸出:


[root@localhost ~]# ss  sport = :http 
[root@localhost ~]# ss  dport = :http 
[root@localhost ~]# ss  dport \> :1024 
[root@localhost ~]# ss  sport \> :1024 
[root@localhost ~]# ss sport \< :32000 
[root@localhost ~]# ss  sport eq :22 
[root@localhost ~]# ss  dport != :22 
[root@localhost ~]# ss  state connected sport = :http 
[root@localhost ~]# ss \( sport = :http or sport = :https \) 
[root@localhost ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24


說明:

ss dport OP PORT 遠程端口和一個數比較;ss sport OP PORT 本地端口和一個數比較。

OP 可以代表以下任意一個: 

<= or le : 小於或等於端口號

>= or ge : 大於或等於端口號

== or eq : 等於端口號

!= or ne : 不等於端口號

< or gt : 小於端口號

> or lt : 大於端口號

實例14ss netstat 效率對比

命令:

time netstat -at

time ss

輸出:


[root@localhost ~]# time ss   
real    0m0.739s
user    0m0.019s
sys     0m0.013s
[root@localhost ~]

[root@localhost ~]# time netstat -at
real    2m45.907s
user    0m0.063s
sys     0m0.067s
[root@localhost ~]
#


 

說明:

time 命令分別獲取通過netstatss命令獲取程序和概要占用資源所使用的時間。在服務器連接數比較多的時候,netstat的效率完全沒法和ss比。

    1. telnet命令

telnet 命令通常用來遠程登錄。telnet程序是基於TELNET協議的遠程登錄客戶端程序。Telnet協議是TCP/IP協議族中的一員,是 Internet遠程登陸服務的標准協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的 能力。在終端使用者的電腦上使用telnet程 序,用它連接到服務器。終端使用者可以在telnet程序中輸入命令,這些命令會在服務器上運行,就像直接在服務器的控制台上輸入一樣。可以在本地就能控 制服務器。要開始一個 telnet會話,必須輸入用戶名和密碼來登錄服務器。Telnet是常用的遠程控制Web服務器的方法。

但是,telnet因為采用明文傳送報文,安全性不好,很多Linux服務器都不開放telnet服務,而改用更安全的ssh方式了。但仍然有很多別的系統可能采用了telnet方式來提供遠程登錄,因此弄清楚telnet客戶端的使用方式仍是很有必要的。

telnet命令還可做別的用途,比如確定遠程服務的狀態,比如確定遠程服務器的某個端口是否能訪問。

1命令格式:

telnet[參數][主機]

2命令功能:

執行telnet指令開啟終端機階段作業,並登入遠端主機。

3命令參數:

-8 允許使用8位字符資料,包括輸入與輸出。

-a 嘗試自動登入遠端系統。

-b<主機別名> 使用別名指定遠端主機名稱。

-c 不讀取用戶專屬目錄里的.telnetrc文件。

-d 啟動排錯模式。

-e<脫離字符> 設置脫離字符。

-E 濾除脫離字符。

-f 此參數的效果和指定"-F"參數相同。

-F 使用Kerberos V5認證時,加上此參數可把本地主機的認證數據上傳到遠端主機。

-k<域名> 使用Kerberos認證時,加上此參數讓遠端主機采用指定的領域名,而非該主機的域名。

-K 不自動登入遠端主機。

-l<用戶名稱> 指定要登入遠端主機的用戶名稱。

-L 允許輸出8位字符資料。

-n<記錄文件> 指定文件記錄相關信息。

-r 使用類似rlogin指令的用戶界面。

-S<服務類型> 設置telnet連線所需的IP TOS信息。

-x 假設主機有支持數據加密的功能,就使用它。

-X<認證形態> 關閉指定的認證形態。

4使用實例:

實例1:遠程服務器無法訪問

命令:

telnet 192.168.120.206

輸出:

[root@localhost ~]# telnet 192.168.120.209
Trying 192.168.120.209...
telnet: connect to address 192.168.120.209: No route to host
telnet: Unable to connect to remote host: No route to host
[root@localhost ~]

說明:

處理這種情況方法:

1)確認ip地址是否正確?

2)確認ip地址對應的主機是否已經開機?

3)如果主機已經啟動,確認路由設置是否設置正確?(使用route命令查看)

4)如果主機已經啟動,確認主機上是否開啟了telnet服務?(使用netstat命令查看,TCP23端口是否有LISTEN狀態的行)

5)如果主機已經啟動telnet服務,確認防火牆是否放開了23端口的訪問?(使用iptables-save查看)

實例2域名無法解析

命令:

telnet www.baidu.com

輸出:

[root@localhost ~]# telnet www.baidu.com
www.baidu.com/telnet: Temporary failure in name resolution
[root@localhost ~]

說明:

處理這種情況方法:

1)確認域名是否正確

2)確認本機的域名解析有關的設置是否正確(/etc/resolv.confnameserver的設置是否正確,如果沒有,可以使用nameserver 8.8.8.8

3)確認防火牆是否放開了UDP53端口的訪問(DNS使用UDP協議,端口53,使用iptables-save查看)

實例3

命令:

輸出:

[root@localhost ~]# telnet 192.168.120.206
Trying 192.168.120.206...
telnet: connect to address 192.168.120.206: Connection refused
telnet: Unable to connect to remote host: Connection refused
[root@localhost ~]
#

說明:

處理這種情況:

1)確認ip地址或者主機名是否正確?

2)確認端口是否正確,是否默認的23端口

實例4:啟動telnet服務

命令:

service xinetd restart

輸出:


[root@localhost ~]# cd /etc/xinetd.d/
[root@localhost xinetd.d]# ll
總計 124
-rw-r--r-- 1 root root 1157 2011-05-31 chargen-dgram
-rw-r--r-- 1 root root 1159 2011-05-31 chargen-stream
-rw-r--r-- 1 root root  523 2009-09-04 cvs
-rw-r--r-- 1 root root 1157 2011-05-31 daytime-dgram
-rw-r--r-- 1 root root 1159 2011-05-31 daytime-stream
-rw-r--r-- 1 root root 1157 2011-05-31 discard-dgram
-rw-r--r-- 1 root root 1159 2011-05-31 discard-stream
-rw-r--r-- 1 root root 1148 2011-05-31 echo-dgram
-rw-r--r-- 1 root root 1150 2011-05-31 echo-stream
-rw-r--r-- 1 root root  323 2004-09-09 eklogin
-rw-r--r-- 1 root root  347 2005-09-06 ekrb5-telnet
-rw-r--r-- 1 root root  326 2004-09-09 gssftp
-rw-r--r-- 1 root root  310 2004-09-09 klogin
-rw-r--r-- 1 root root  323 2004-09-09 krb5-telnet
-rw-r--r-- 1 root root  308 2004-09-09 kshell
-rw-r--r-- 1 root root  317 2004-09-09 rsync
-rw-r--r-- 1 root root 1212 2011-05-31 tcpmux-server
-rw-r--r-- 1 root root 1149 2011-05-31 time-dgram
-rw-r--r-- 1 root root 1150 2011-05-31 time-stream
[root@localhost xinetd.d]
# cat krb5-telnet 
# default: off
# description: The kerberized telnet server accepts normal telnet sessions, \
#              but can also use Kerberos 5 authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream        
        wait            = no
        user            = root
        server          = /usr/kerberos/sbin/telnetd
        log_on_failure  += USERID
        disable         = yes
}
[root@localhost xinetd.d]


說明:

配置參數,通常的配置如下: 

service telnet

{

disable = no #啟用

flags = REUSE #socket可重用

socket_type = stream #連接方式為TCP

wait = no #為每個請求啟動一個進程

user = root #啟動服務的用戶為root

server = /usr/sbin/in.telnetd #要激活的進程

log_on_failure += USERID #登錄失敗時記錄登錄用戶名

}

如果要配置允許登錄的客戶端列表,加入

only_from = 192.168.0.2 #只允許192.168.0.2登錄

如果要配置禁止登錄的客戶端列表,加入

no_access = 192.168.0.{2,3,4} #禁止192.168.0.2192.168.0.3192.168.0.4登錄

如果要設置開放時段,加入

access_times = 9:00-12:00 13:00-17:00 # 每天只有這兩個時段開放服務(我們的上班時間:P

如果你有兩個IP地址,一個是私網的IP地址如192.168.0.2,一個是公網的IP地址如218.75.74.83,如果你希望用戶只能從私網來登錄telnet服務,那么加入

bind = 192.168.0.2

各配置項具體的含義和語法可參考xined配置文件屬性說明(man xinetd.conf

配置端口,修改services文件:

# vi /etc/services

找到以下兩句

telnet 23/tcp

telnet 23/udp

如 果前面有#字符,就去掉它。telnet的默認端口是23,這個端口也是黑客端口掃描的主要對象,因此最好將這個端口修改掉,修改的方法很簡單,就是將 23這個數字修改掉,改成大一點的數字,比如61123。注意,1024以下的端口號是internet保留的端口號,因此最好不要用,還應該注意不要與 其它服務的端口沖突。

啟動服務:

service xinetd restart

實例5:正常telnet

命令:

telnet 192.168.120.204

輸出:


[root@andy ~]# telnet 192.168.120.204
Trying 192.168.120.204...
Connected to 192.168.120.204 (192.168.120.204).
Escape character is '^]'.

    localhost (Linux release 2.6.18-274.18.1.el5 
#1 SMP Thu Feb 9 12:45:44 EST 2012) (1)

login: root
Password: 
Login incorrect


說明:

一般情況下不允許root從遠程登錄,可以先用普通賬號登錄,然后再用su -切到root用戶。

    1. rcp命令

rcp代表“remote file copy”(遠程文件拷貝)。該命令用於在計算機之間拷貝文件。rcp命令有兩種格式。第一種格式用於文件到文件的拷貝;第二種格式用於把文件或目錄拷貝到另一個目錄中。

1命令格式:

rcp [參數] [源文件] [目標文件]

2命令功能:

rcp命令用在遠端復制文件或目錄,如同時指定兩個以上的文件或目錄,且最后的目的地是一個已經存在的目錄,則它會把前面指定的所有文件或目錄復制到該目錄中。

3命令參數:

各選項含義:

-r 遞歸地把源目錄中的所有內容拷貝到目的目錄中。要使用這個選項,目的必須是一個目錄。

-p 試圖保留源文件的修改時間和模式,忽略umask

-k 請求rcp獲得在指定區域內的遠程主機的Kerberos 許可,而不是獲得由krb_relmofhost⑶確定的遠程主機區域內的遠程主機的Kerberos許可。

-x 為 傳送的所有數據打開DES加密。這會影響響應時間和CPU利用率,但是可以提高安全性。如果在文件名中指定的路徑不是完整的路徑名,那么這個路徑被解釋為 相對遠程機上同名用戶的主目錄。如果沒有給出遠程用戶名,就使用當前用戶名。如果遠程機上的路徑包含特殊shell字符,需要用反斜線(\\)、雙引號 (”)或單引號(’)括起來,使所有的shell元字符都能被遠程地解釋。需要說明的是,rcp不提示輸入口令,它通過rsh命令來執行拷貝。

directory 每個文件或目錄參數既可以是遠程文件名也可以是本地文件名。遠程文件名具有如下形式:rname@rhostpath,其中rname是遠程用戶名,rhost是遠程計算機名,path是這個文件的路徑。

4使用實例:

要使用 rcp,需要具備以下條件:

如果系統中有 /etc/hosts 文件,系統管理員應確保該文件包含要與之進行通信的遠程主機的項。

/etc/hosts 文件中有一行文字,其中包含每個遠程系統的以下信息:

internet_address official_name alias

例如:

9.186.10.*** webserver1.com.58.webserver

.rhosts 文件

.rhosts 文件位於遠程系統的主目錄下,其中包含本地系統的名稱和本地登錄名。

例如,遠程系統的 .rhosts 文件中的項可能是:

webserver1 root

其中,webserver1 是本地系統的名稱,root 是本地登錄名。這樣,webserver1 上的 root 即可在包含 .rhosts 文件的遠程系統中來回復制文件。

配置過程:

只對root用戶生效

1. 在雙方root用戶根目錄下建立.rhosts文件,並將雙方的hostname加進去.在此之前應在雙方的 /etc/hosts文件中加入對方的IPhostname

2. rsh服務啟動起來,redhat默認是不啟動的。

方法:用執行ntsysv命令,rsh選項前用空格鍵選中,確定退出。然后執行:

service xinetd restart即可。

3. /etc/pam.d/目錄下,rsh文件中的auth required /lib/security/pam_securetty.so

一行用“#”注釋掉即可。(只有注釋掉這一行,才能用root用戶登錄)

命令使用:

將文件復制到遠程系統

要將本地系統中的文件復制到遠程系統,請使用以下命令:

Rcp local_fileremote_hostname:remote_fileEnter

注意,如果當前目錄下沒有 local_file,則除本地文件名外,還需要提供相對路徑(自當前目錄開始)或絕對路徑名(自 / 開始)。

僅當希望將 remote_hostname 上的 remote_file 放到其他目錄(遠程主目錄除外)下時,才需要為其指定完整的(絕對)路徑。

使用實例1:將當前目錄下的 test1 復制到名為 webserver1的遠程系統

命令

rcp test1 webserver1:/home/root/test3

說明:

在這種情況下,test1 被復制到遠程子目錄 test3下,名稱仍為 test1 。如果僅提供了遠程主機名,rcp 將把 test1 復制到遠程主目錄下,名稱仍為 test1

還可以在目的目錄中包含文件名。例如,將文件復制到名為 webserver1的系統中:

rcp test1 webserver1:/home/root/test3

在這種情況下,將 test1 復制到遠程目錄root 下並將其命名為 test3

使用實例2:從遠程系統復制文件:要將遠程系統中的文件復制到本地目錄下

命令:

rcp remote_hostname:remote_file local_fileEnter

使用實例:3:將遠程系統 webserver1中的 test2 復制到當前目錄:

命令:

rcp webserver1:/home/root/test2 .Enter

說明:

(.) 是“當前目錄”的簡寫形式。在這種情況下,遠程目錄中的 test2 被復制到當前目錄下,名稱仍為 test2

如果希望用新名稱復制文件,請提供目標文件名。

如果希望將 test2 復制到本地系統中的其他目錄下,請使用以下絕對或相對路徑名:

rcp webserver1:/home/root/test2 otherdir/ Enter

或者,如果希望用其他文件名將文件復制到其他目錄下:

rcp webserver1:/home/root/test2 otherdir/otherfile Enter

使用實例4:將目錄復制到遠程系統:要將本地目錄及其文件和子目錄復制到遠程系統,請同時使用 rcp -r(遞歸)選項。

命令:

rcp –r local_dir remote_hostname:remote_dir Enter

說明:

如 果當前目錄下沒有 local_dir,則除本地目錄名外,還需要提供相對路徑名(自當前目錄開始)或絕對路徑名(自 / 頂級目錄開始)。另外,如果主 目錄下沒有 remote_dir,則 remote_dir 將需要一個相對路徑(自主目錄開始)或絕對路徑(自 / 開始)。

使用實例5:

要將名為 work 的子目錄完整地復制到 webserver1遠程計算機中的主目錄下名為 products 的目錄,請鍵入以下內容:

rcp –r work webserver1:/home/root/products Enter

此命令在 webserver1:/home/root/products 下創建名為 work 的目錄及其全部內容(假定 /home/root/products 已存在於 webserver1中)。

本示例假定用戶處於包含 work 的本地目錄下。否則,必須提供該目錄的相對或絕對路徑,如 /home/root/work

使用實例6:從遠程系統復制目錄:

要將遠程目錄及其所有文件和子目錄復制到本地目錄,請在以下語法中使用 rcp -r(遞歸)選項。

命令:

rcp –r remote_hostname:remote_dir local_dir Enter

要將名為 work 的遠程目錄復制到當前目錄,請鍵入以下內容:z

rcp –r webserver1:/home/root/work .Enter

(.) 表示當前目錄。將在此目錄下創建 work 目錄。

    1. scp命令

scp secure copy的簡寫,用於在Linux下進行遠程拷貝文件的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨服務器,而且 scp傳輸是加密的。可能會稍微影響一下速度。當你服務器硬盤變為只讀 read only system時,用scp可以幫你把文件移出來。另 外,scp還非常不占資源,不會提高多少系統負荷,在這一點上,rsync就遠遠不及它了。雖然 rsyncscp會快一點,但當小文件眾多的情況 下,rsync會導致硬盤I/O非常高,而scp基本不影響系統正常使用。

1命令格式:

scp [參數] [原路徑] [目標路徑]

2命令功能:

scpsecure copy的縮寫, scplinux系統下基於ssh登陸進行安全的遠程文件拷貝命令。linuxscp命令可以在linux服務器之間復制文件和目錄。

3命令參數:

-1 強制scp命令使用協議ssh1

-2 強制scp命令使用協議ssh2

-4 強制scp命令只使用IPv4尋址

-6 強制scp命令只使用IPv6尋址

-B 使用批處理模式(傳輸過程中不詢問傳輸口令或短語)

-C 允許壓縮。(將-C標志傳遞給ssh,從而打開壓縮功能)

-p 保留原文件的修改時間,訪問時間和訪問權限。

-q 不顯示傳輸進度條。

-r 遞歸復制整個目錄。

-v 詳細方式顯示輸出。scpssh(1)會顯示出整個過程的調試信息。這些信息用於調試連接,驗證和配置問題。

-c cipher cipher將數據傳輸進行加密,這個選項將直接傳遞給ssh

-F ssh_config 指定一個替代的ssh配置文件,此參數直接傳遞給ssh

-i identity_file 從指定文件中讀取傳輸時使用的密鑰文件,此參數直接傳遞給ssh

-l limit 限定用戶所能使用的帶寬,以Kbit/s為單位。

-o ssh_option 如果習慣於使用ssh_config(5)中的參數傳遞方式,

-P port 注意是大寫的P, port是指定數據傳輸用到的端口號

-S program 指定加密傳輸時所使用的程序。此程序必須能夠理解ssh(1)的選項。

4使用實例:

scp命令的實際應用概述:

從本地服務器復制到遠程服務器: 

(1) 復制文件:

命令格式:

scp local_file remote_username@remote_ip:remote_folder

或者

scp local_file remote_username@remote_ip:remote_file

或者

scp local_file remote_ip:remote_folder

或者

scp local_file remote_ip:remote_file

1,2個指定了用戶名,命令執行后需要輸入用戶密碼,第1個僅指定了遠程的目錄,文件名字不變,第2個指定了文件名

3,4個沒有指定用戶名,命令執行后需要輸入用戶名和密碼,第3個僅指定了遠程的目錄,文件名字不變,第4個指定了文件名

(2) 復制目錄:

命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder

或者

scp -r local_folder remote_ip:remote_folder

1個指定了用戶名,命令執行后需要輸入用戶密碼;

2個沒有指定用戶名,命令執行后需要輸入用戶名和密碼;

 

從遠程服務器復制到本地服務器: 

從遠程復制到本地的scp命令與上面的命令雷同,只要將從本地復制到遠程的命令后面2個參數互換順序就行了。

實例1:從遠處復制文件到本地目錄

命令:

scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/

輸出:


[root@localhost ~]# cd /opt/soft/
[root@localhost soft]# ll
總計 80072
drwxr-xr-x 12 root root     4096 09-21 18:40 fms3.5
drwxr-xr-x  3 root root     4096 09-21 17:58 fms4.5
drwxr-xr-x 10 root root     4096 10-30 17:15 jdk1.6.0_16
drwxr-xr-x 10 root root     4096 09-17 19:27 jdk1.6.0_16.bak
-rwxr-xr-x  1 root root 81871260 2009-12-21 jdk-6u16-linux-x64.bin
drwxrwxrwx  2 root root     4096 09-21 01:16 mysql
drwxr-xr-x  3 root root     4096 09-21 18:40 setup_file
drwxr-xr-x  9 root root     4096 09-17 19:23 tomcat6.0.32
drwxr-xr-x  9 root root     4096 2012-08-14 tomcat_7.0
[root@localhost soft]
# scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
root@192.168.120.204's password: 
nginx-0.5.38.tar.gz                                                                               100%  479KB 478.7KB/s   00:00    
[root@localhost soft]
# ll
總計 80556
drwxr-xr-x 12 root root     4096 09-21 18:40 fms3.5
drwxr-xr-x  3 root root     4096 09-21 17:58 fms4.5
drwxr-xr-x 10 root root     4096 10-30 17:15 jdk1.6.0_16
drwxr-xr-x 10 root root     4096 09-17 19:27 jdk1.6.0_16.bak
-rwxr-xr-x  1 root root 81871260 2009-12-21 jdk-6u16-linux-x64.bin
drwxrwxrwx  2 root root     4096 09-21 01:16 mysql
-rw-r--r--  1 root root   490220 03-15 09:11 nginx-0.5.38.tar.gz
drwxr-xr-x  3 root root     4096 09-21 18:40 setup_file
drwxr-xr-x  9 root root     4096 09-17 19:23 tomcat6.0.32
drwxr-xr-x  9 root root     4096 2012-08-14 tomcat_7.0
[root@localhost soft]


說明:

192.168.120.204機器上的/opt/soft/的目錄中下載nginx-0.5.38.tar.gz 文件到本地/opt/soft/目錄中

實例2:從遠處復制到本地

命令:

scp -r root@192.168.120.204:/opt/soft/mongodb /opt/soft/

輸出:


[root@localhost soft]# ll
總計 80556
drwxr-xr-x 12 root root     4096 09-21 18:40 fms3.5
drwxr-xr-x  3 root root     4096 09-21 17:58 fms4.5
drwxr-xr-x 10 root root     4096 10-30 17:15 jdk1.6.0_16
drwxr-xr-x 10 root root     4096 09-17 19:27 jdk1.6.0_16.bak
-rwxr-xr-x  1 root root 81871260 2009-12-21 jdk-6u16-linux-x64.bin
drwxrwxrwx  2 root root     4096 09-21 01:16 mysql
-rw-r--r--  1 root root   490220 03-15 09:11 nginx-0.5.38.tar.gz
drwxr-xr-x  3 root root     4096 09-21 18:40 setup_file
drwxr-xr-x  9 root root     4096 09-17 19:23 tomcat6.0.32
drwxr-xr-x  9 root root     4096 2012-08-14 tomcat_7.0
[root@localhost soft]
# scp -r root@192.168.120.204:/opt/soft/mongodb /opt/soft/
root@192.168.120.204's password: 
mongodb-linux-i686-static-1.8.5.tgz                                                               100%   28MB  28.3MB/s   00:01    
README                                                                                            100%  731     0.7KB/s   00:00    
THIRD-PARTY-NOTICES                                                                               100% 7866     7.7KB/s   00:00    
mongorestore                                                                                      100% 7753KB   7.6MB/s   00:00    
mongod                                                                                            100% 7760KB   7.6MB/s   00:01    
mongoexport                                                                                       100% 7744KB   7.6MB/s   00:00    
bsondump                                                                                          100% 7737KB   7.6MB/s   00:00    
mongofiles                                                                                        100% 7748KB   7.6MB/s   00:01    
mongostat                                                                                         100% 7808KB   7.6MB/s   00:00    
mongos                                                                                            100% 5262KB   5.1MB/s   00:01    
mongo                                                                                             100% 3707KB   3.6MB/s   00:00    
mongoimport                                                                                       100% 7754KB   7.6MB/s   00:00    
mongodump                                                                                         100% 7773KB   7.6MB/s   00:00    
GNU-AGPL-3.0                                                                                      100%   34KB  33.7KB/s   00:00    
[root@localhost soft]
# ll
總計 80560
drwxr-xr-x 12 root root     4096 09-21 18:40 fms3.5
drwxr-xr-x  3 root root     4096 09-21 17:58 fms4.5
drwxr-xr-x 10 root root     4096 10-30 17:15 jdk1.6.0_16
drwxr-xr-x 10 root root     4096 09-17 19:27 jdk1.6.0_16.bak
-rwxr-xr-x  1 root root 81871260 2009-12-21 jdk-6u16-linux-x64.bin
drwxr-xr-x  3 root root     4096 03-15 09:18 mongodb
drwxrwxrwx  2 root root     4096 09-21 01:16 mysql
-rw-r--r--  1 root root   490220 03-15 09:11 nginx-0.5.38.tar.gz
drwxr-xr-x  3 root root     4096 09-21 18:40 setup_file
drwxr-xr-x  9 root root     4096 09-17 19:23 tomcat6.0.32
drwxr-xr-x  9 root root     4096 2012-08-14 tomcat_7.0
[root@localhost soft]


說明:

192.168.120.204機器上的/opt/soft/中下載mongodb 目錄到本地的/opt/soft/目錄來。

實例3:上傳本地文件到遠程機器指定目錄

命令:

scp /opt/soft/nginx-0.5.38.tar.gz root@192.168.120.204:/opt/soft/scptest

輸出:


上傳前目標機器的目標目錄:
[root@localhost soft]
# cd scptest/
[root@localhost scptest]# ll
總計 0
[root@localhost scptest]
# ll

本地機器上傳:
[root@localhost soft]
# scp /opt/soft/nginx-0.5.38.tar.gz root@192.168.120.204:/opt/soft/scptest
root@192.168.120.204's password: 
nginx-0.5.38.tar.gz                                                                               100%  479KB 478.7KB/s   00:00    
[root@localhost soft]


上傳后目標機器的目標目錄:
[root@localhost scptest]
# ll
總計 484
-rw-r--r-- 1 root root 490220 03-15 09:25 nginx-0.5.38.tar.gz
[root@localhost scptest]
#


說明:

復制本地opt/soft/目錄下的文件nginx-0.5.38.tar.gz 到遠程機器192.168.120.204opt/soft/scptest目錄

實例4:上傳本地目錄到遠程機器指定目錄

命令:

scp -r /opt/soft/mongodb root@192.168.120.204:/opt/soft/scptest

輸出:


上傳前目標機器的目標目錄:
[root@localhost ~]
# cd /opt/soft/scptest/
[root@localhost scptest]# ll
總計 484
-rw-r--r-- 1 root root 490220 03-15 09:25 nginx-0.5.38.tar.gz
[root@localhost scptest]

本地機器上傳:
[root@localhost ~]
# scp -r /opt/soft/mongodb root@192.168.120.204:/opt/soft/scptest
root@192.168.120.204's password: 
mongodb-linux-i686-static-1.8.5.tgz                                                               100%   28MB  28.3MB/s   00:01    
README                                                                                            100%  731     0.7KB/s   00:00    
THIRD-PARTY-NOTICES                                                                               100% 7866     7.7KB/s   00:00    
mongorestore                                                                                      100% 7753KB   7.6MB/s   00:00    
mongod                                                                                            100% 7760KB   7.6MB/s   00:01    
mongoexport                                                                                       100% 7744KB   7.6MB/s   00:00    
bsondump                                                                                          100% 7737KB   7.6MB/s   00:00    
mongofiles                                                                                        100% 7748KB   7.6MB/s   00:00    
mongostat                                                                                         100% 7808KB   7.6MB/s   00:01    
mongos                                                                                            100% 5262KB   5.1MB/s   00:00    
mongo                                                                                             100% 3707KB   3.6MB/s   00:00    
mongoimport                                                                                       100% 7754KB   7.6MB/s   00:01    
mongodump                                                                                         100% 7773KB   7.6MB/s   00:00    
GNU-AGPL-3.0                                                                                      100%   34KB  33.7KB/s   00:00    
[root@localhost ~]


上傳后目標機器的目標目錄:
[root@localhost scptest]
# ll
總計 488
drwxr-xr-x 3 root root   4096 03-15 09:33 mongodb
-rw-r--r-- 1 root root 490220 03-15 09:25 nginx-0.5.38.tar.gz
[root@localhost scptest]


說明:

    上傳本地目錄 /opt/soft/mongodb到遠程機器192.168.120.204/opt/soft/scptest的目錄中去

    1. wget命令

Linux系統中的wget是一個下載文件的工具,它用在命令行下。對於Linux用戶是必不可少的工具,我們經常要下載一些軟件或從遠程服務器恢復備份到本地服務器。wget支持HTTPHTTPSFTP協議,可以使用HTTP代理。所謂的自動下載是指,wget可以在用戶退出系統的之后在后台執行。這意味這你可以登錄系統,啟動一個wget下載任務,然后退出系統,wget將在后台執行直到任務完成,相對於其它大部分瀏覽器在下載大量數據時需要用戶一直的參與,這省去了極大的麻煩。

wget 可 以跟蹤HTML頁面上的鏈接依次下載來創建遠程服務器的本地版本,完全重建原始站點的目錄結構。這又常被稱作”遞歸下載”。在遞歸下載的時 候,wget 遵循Robot Exclusion標准(/robots.txt). wget可以在下載的同時,將鏈接轉換成指向本地文件,以方便離線 瀏覽。

wget 非常穩定,它在帶寬很窄的情況下和不穩定網絡中有很強的適應性.如果是由於網絡的原因下載失敗,wget會不斷的嘗試,直到整個文件下載完畢。如果是服務器打斷下載過程,它會再次聯到服務器上從停止的地方繼續下載。這對從那些限定了鏈接時間的服務器上下載大文件非常有用。

1命令格式:

wget [參數] [URL地址]

2命令功能:

用於從網絡上下載資源,沒有指定目錄,下載資源回默認為當前目錄。wget雖然功能強大,但是使用起來還是比較簡單:

1)支持斷點下傳功能;這一點,也是網絡螞蟻和FlashGet當年最大的賣點,現在,Wget也可以使用此功能,那些網絡不是太好的用戶可以放心了;

2)同時支持FTPHTTP下載方式;盡管現在大部分軟件可以使用HTTP方式下載,但是,有些時候,仍然需要使用FTP方式下載軟件;

3)支持代理服務器;對安全強度很高的系統而言,一般不會將自己的系統直接暴露在互聯網上,所以,支持代理是下載軟件必須有的功能;

4)設置方便簡單;可能,習慣圖形界面的用戶已經不是太習慣命令行了,但是,命令行在設置上其實有更多的優點,最少,鼠標可以少點很多次,也不要擔心是否錯點鼠標;

5)程序小,完全免費;程序小可以考慮不計,因為現在的硬盤實在太大了;完全免費就不得不考慮了,即使網絡上有很多所謂的免費軟件,但是,這些軟件的廣告卻不是我們喜歡的。

3命令參數:

啟動參數:

-V, –version 顯示wget的版本后退出

-h, –help 打印語法幫助

-b, –background 啟動后轉入后台執行

-e, –execute=COMMAND 執行`.wgetrc’格式的命令,wgetrc格式參見/etc/wgetrc~/.wgetrc

記錄和輸入文件參數:

-o, –output-file=FILE 把記錄寫到FILE文件中

-a, –append-output=FILE 把記錄追加到FILE文件中

-d, –debug 打印調試輸出

-q, –quiet 安靜模式(沒有輸出)

-v, –verbose 冗長模式(這是缺省設置)

-nv, –non-verbose 關掉冗長模式,但不是安靜模式

-i, –input-file=FILE 下載在FILE文件中出現的URLs

-F, –force-html 把輸入文件當作HTML格式文件對待

-B, –base=URL URL作為在-F -i參數指定的文件中出現的相對鏈接的前綴

sslcertfile=FILE 可選客戶端證書

sslcertkey=KEYFILE 可選客戶端證書的KEYFILE

egd-file=FILE 指定EGD socket的文件名

下載參數:

bind-address=ADDRESS 指定本地使用地址(主機名或IP,當本地有多個IP或名字時使用)

-t, –tries=NUMBER 設定最大嘗試鏈接次數(0 表示無限制).

-O –output-document=FILE 把文檔寫到FILE文件中

-nc, –no-clobber 不要覆蓋存在的文件或使用.#前綴

-c, –continue 接着下載沒下載完的文件

progress=TYPE 設定進程條標記

-N, –timestamping 不要重新下載文件除非比本地文件新

-S, –server-response 打印服務器的回應

spider 不下載任何東西

-T, –timeout=SECONDS 設定響應超時的秒數

-w, –wait=SECONDS 兩次嘗試之間間隔SECONDS

waitretry=SECONDS 在重新鏈接之間等待1…SECONDS

random-wait 在下載之間等待0…2*WAIT

-Y, –proxy=on/off 打開或關閉代理

-Q, –quota=NUMBER 設置下載的容量限制

limit-rate=RATE 限定下載輸率

目錄參數:

-nd –no-directories 不創建目錄

-x, –force-directories 強制創建目錄

-nH, –no-host-directories 不創建主機目錄

-P, –directory-prefix=PREFIX 將文件保存到目錄 PREFIX/…

cut-dirs=NUMBER 忽略 NUMBER層遠程目錄

HTTP 選項參數:

http-user=USER 設定HTTP用戶名為 USER.

http-passwd=PASS 設定http密碼為 PASS

-C, –cache=on/off 允許/不允許服務器端的數據緩存 (一般情況下允許)

-E, –html-extension 將所有text/html文檔以.html擴展名保存

ignore-length 忽略 `Content-Length’頭域

header=STRING headers中插入字符串 STRING

proxy-user=USER 設定代理的用戶名為 USER

proxy-passwd=PASS 設定代理的密碼為 PASS

referer=URL HTTP請求中包含 `Referer: URL’

-s, –save-headers 保存HTTP頭到文件

-U, –user-agent=AGENT 設定代理的名稱為 AGENT而不是 Wget/VERSION

no-http-keep-alive 關閉 HTTP活動鏈接 (永遠鏈接)

cookies=off 不使用 cookies

load-cookies=FILE 在開始會話前從文件 FILE中加載cookie

save-cookies=FILE 在會話結束后將 cookies保存到 FILE文件中

FTP 選項參數:

-nr, –dont-remove-listing 不移走 `.listing’文件

-g, –glob=on/off 打開或關閉文件名的 globbing機制

passive-ftp 使用被動傳輸模式 (缺省值).

active-ftp 使用主動傳輸模式

retr-symlinks 在遞歸的時候,將鏈接指向文件(而不是目錄)

遞歸下載參數:

-r, –recursive 遞歸下載--慎用!

-l, –level=NUMBER 最大遞歸深度 (inf 0 代表無窮)

delete-after 在現在完畢后局部刪除文件

-k, –convert-links 轉換非相對鏈接為相對鏈接

-K, –backup-converted 在轉換文件X之前,將之備份為 X.orig

-m, –mirror 等價於 -r -N -l inf -nr

-p, –page-requisites 下載顯示HTML文件的所有圖片

遞歸下載中的包含和不包含(accept/reject)

-A, –accept=LIST 分號分隔的被接受擴展名的列表

-R, –reject=LIST 分號分隔的不被接受的擴展名的列表

-D, –domains=LIST 分號分隔的被接受域的列表

exclude-domains=LIST 分號分隔的不被接受的域的列表

follow-ftp 跟蹤HTML文檔中的FTP鏈接

follow-tags=LIST 分號分隔的被跟蹤的HTML標簽的列表

-G, –ignore-tags=LIST 分號分隔的被忽略的HTML標簽的列表

-H, –span-hosts 當遞歸時轉到外部主機

-L, –relative 僅僅跟蹤相對鏈接

-I, –include-directories=LIST 允許目錄的列表

-X, –exclude-directories=LIST 不被包含目錄的列表

-np, –no-parent 不要追溯到父目錄

wget -S –spider url 不下載只顯示過程

4使用實例:

實例1:使用wget下載單個文件

命令:

wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip

說明:

以下的例子是從網絡下載一個文件並保存在當前目錄,在下載的過程中會顯示進度條,包含(下載完成百分比,已經下載的字節,當前下載速度,剩余下載時間)。

實例2:使用wget -O下載並以不同的文件名保存

命令:

: wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080

說明:

wget默認會以最后一個符合”/”的后面的字符來命令,對於動態鏈接的下載通常文件名會不正確。

錯誤:下面的例子會下載一個文件並以名稱download.aspx?id=1080保存

wget http://www.minjieren.com/download?id=1

即使下載的文件是zip格式,它仍然以download.php?id=1080命令。

正確:為了解決這個問題,我們可以使用參數-O來指定一個文件名:

wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080

實例3:使用wget –limit -rate限速下載

命令:

wget --limit-rate=300k http://www.minjieren.com/wordpress-3.1-zh_CN.zip

說明:

當你執行wget的時候,它默認會占用全部可能的寬帶下載。但是當你准備下載一個大文件,而你還需要下載其它文件時就有必要限速了。

實例4:使用wget -c斷點續傳

命令:

wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip

說明:

使用wget -c重新啟動下載中斷的文件,對於我們下載大文件時突然由於網絡等原因中斷非常有幫助,我們可以繼續接着下載而不是重新下載一個文件。需要繼續中斷的下載時可以使用-c參數。

實例5:使用wget -b后台下載

命令:

wget -b http://www.minjieren.com/wordpress-3.1-zh_CN.zip

說明:

對於下載非常大的文件的時候,我們可以使用參數-b進行后台下載。

wget -b http://www.minjieren.com/wordpress-3.1-zh_CN.zip

Continuing in background, pid 1840.

Output will be written to `wget-log'.

你可以使用以下命令來察看下載進度:

tail -f wget-log

實例6:偽裝代理名稱下載

命令:

wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.minjieren.com/wordpress-3.1-zh_CN.zip

說明:

有些網站能通過根據判斷代理名稱不是瀏覽器而拒絕你的下載請求。不過你可以通過–user-agent參數偽裝。

實例7:使用wget –spider測試下載鏈接

命令:

wget --spider URL

說明:

當你打算進行定時下載,你應該在預定時間測試下載鏈接是否有效。我們可以增加–spider參數進行檢查。

wget --spider URL

如果下載鏈接正確,將會顯示

wget --spider URL

Spider mode enabled. Check if remote file exists.

HTTP request sent, awaiting response... 200 OK

Length: unspecified [text/html]

Remote file exists and could contain further links,

but recursion is disabled -- not retrieving.

這保證了下載能在預定的時間進行,但當你給錯了一個鏈接,將會顯示如下錯誤

wget --spider url

Spider mode enabled. Check if remote file exists.

HTTP request sent, awaiting response... 404 Not Found

Remote file does not exist -- broken link!!!

你可以在以下幾種情況下使用spider參數:

定時下載之前進行檢查

間隔檢測網站是否可用

檢查網站頁面的死鏈接

實例8:使用wget –tries增加重試次數

命令:

wget --tries=40 URL

說明:

如果網絡有問題或下載一個大文件也有可能失敗。wget默認重試20次連接下載文件。如果需要,你可以使用–tries增加重試次數。

實例9:使用wget -i下載多個文件

命令:

wget -i filelist.txt

說明:

首先,保存一份下載鏈接文件

cat > filelist.txt

url1

url2

url3

url4

接着使用這個文件和參數-i下載

實例10:使用wget –mirror鏡像網站

命令:

wget --mirror -p --convert-links -P ./LOCAL URL

說明:

下載整個網站到本地。

miror:開戶鏡像下載

-p:下載所有為了html頁面顯示正常的文件

convert-links:下載后,轉換成本地的鏈接

-P ./LOCAL:保存所有文件和目錄到本地指定目錄

實例11:使用wget –reject過濾指定格式下載

命令:
wget --reject=gif ur

說明:

下載一個網站,但你不希望下載圖片,可以使用以下命令。

實例12:使用wget -o把下載信息存入日志文件

命令:

wget -o download.log URL

說明:

不希望下載信息直接顯示在終端而是在一個日志文件,可以使用

實例13:使用wget -Q限制總下載文件大小

命令:

wget -Q5m -i filelist.txt

說明:

當你想要下載的文件超過5M而退出下載,你可以使用。注意:這個參數對單個文件下載不起作用,只能遞歸下載時才有效。

實例14:使用wget -r -A下載指定格式文件

命令:

wget -r -A.pdf url

說明:

可以在以下情況使用該功能:

下載一個網站的所有圖片

下載一個網站的所有視頻

下載一個網站的所有PDF文件

實例15:使用wget FTP下載

命令:

wget ftp-url

wget --ftp-user=USERNAME --ftp-password=PASSWORD url

說明:

可以使用wget來完成ftp鏈接的下載。

使用wget匿名ftp下載:

wget ftp-url

使用wget用戶名和密碼認證的ftp下載

wget --ftp-user=USERNAME --ftp-password=PASSWORD url

備注:編譯安裝

使用如下命令編譯安裝:

# tar zxvf wget-1.9.1.tar.gz

# cd wget-1.9.1

# ./configure

# make

# make install



    1. ssh 命令:

      1. 命令:ssh use@10.16.51.113登錄另一台linux

ssh 10.16.51.113 連接到指定服務器


        1. WFT命令用來維護服務:

用法: WFT { start | stop | state | show } [<標識>]

start: 啟動服務

stop: 終止服務

state: 顯示狀態

show: 顯示進程

  1. 自動刪除n天前日志

linux 是一個很能自動產生文件的系統,日志、郵件、備份等。雖然現在硬盤廉價,我們可以有很多硬盤空間供這些文件浪費,讓系統定時清理一些不需要的文件很有一種 爽快的事情。不用你去每天惦記着是否需要清理日志,不用每天收到硬盤空間不足的報警短信,想好好休息的話,讓我們把這個事情交給機器定時去執行吧。

1.刪除文件命令:

find 對應目錄 -mtime +天數 -name "文件名" -exec rm -rf {} \;

實例命令:

find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;

說明:

/opt/soft/log/目錄下所有30天前帶".log"的文件刪除。具體參數說明如下:

findlinux的查找命令,用戶查找指定條件的文件;

/opt/soft/log/:想要進行清理的任意目錄;

-mtime:標准語句寫法;

+30:查找30天前的文件,這里用數字代表天數;

"*.log":希望查找的數據類型,"*.jpg"表示查找擴展名為jpg的所有文件,"*"表示查找所有文件,這個可以靈活運用,舉一反三;

-exec:固定寫法;

rm -rf:強制刪除文件,包括目錄;

{} \; :固定寫法,一對大括號+空格+\+; 

2.計划任務:

若嫌每次手動執行語句太麻煩,可以將這小語句寫到一個可執行shell腳本文件中,再設置cron調度執行,那就可以讓系統自動去清理相關文件。

2.1創建shell

touch /opt/soft/bin/auto-del-30-days-ago-log.sh

chmod +x auto-del-30-days-ago-log.sh

新建一個可執行文件auto-del-30-days-ago-log.sh,並分配可運行權限

2.2編輯shell腳本:

vi auto-del-30-days-ago-log.sh

編輯auto-del-30-days-ago-log.sh文件如下:

#!/bin/sh

find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;

ok,保存退出(:wq)

2.3計划任務:

#crontab -e

auto-del-30-days-ago-log.sh執行腳本加入到系統計划任務,到點自動執行

輸入:

10 0 * * * /opt/soft/log/auto-del-7-days-ago-log.sh >/dev/null 2>&1

這里的設置是每天凌晨010分執行auto-del-7-days-ago-log.sh文件進行數據清理任務了。

完成以上三步,你就再也不每天惦記是否硬盤空間滿了,該清理日志文件了,再也不會受到服務器硬盤空間不足的報警信息了,放心的去看書喝咖啡去吧!

Linux中的文件和目錄管理

    1. df命令:

    2. linuxdf命令的功能是用來檢查linux服務器的文件系統的磁盤空間占用情況。可以利用該命令來獲取硬盤被占用了多少空間,目前還剩下多少空間等信息。

功能:磁盤與目錄的容量

常用選項說明:

-h GB,MBKB易讀的格式顯示出來

-I 不用硬盤的容量,而以inode的數量顯示

格式 df [-ahikhTm] xyz 文件或者目錄(dirname/filename)

【例】將系統內所的分區都列出來

[root@dsetl /]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/mapper/VolGroup-lv_root 51606140 29317580 19667120 60% /

tmpfs 7601684 236 7601448 1% /dev/shm

/dev/sda1 495844 38679 431565 9% /boot

/dev/mapper/VolGroup-lv_home 459882608 1 73166096 263355796 40% /home


 

【例】將系統容量結果以易讀的容量格式顯示出來

 

[root@dsetl /]# df -h

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/mapper/VolGroup-lv_root 50G 28G 19G 60% /

tmpfs 7.3G 236K 7.3G 1% /dev/shm

/dev/sda1 485M 38M 422M 9% /boot

/dev/mapper/VolGroup-lv_home 439G 166G 252G 40% /home

 

【例】將系統內的所有特殊文件格式及名稱都列出來


[root@dsetl /]# df -aT

Filesystem Type 1K-blocks Used Available Use% Mounted on

/dev/mapper/VolGroup-lv_root ext4 51606140 29318060 19666640 60% /

proc proc 0 0 0 - /proc

sysfs sysfs 0 0 0 - /sys

devpts devpts 0 0 0 - /dev/pts

tmpfs tmpfs 7601684 236 7601448 1% /dev/shm

/dev/sda1 ext4 495844 38679 431565 9% /boot

/dev/mapper/VolGroup-lv_home ext4 459882608 173166228 263355664 40% /home

 

注意:系統里其實還有很多的特殊系統在運行,不過,那些比較特殊的文件系統都幾乎在內存中,例如/proc載入點。

因此這些特殊的文件系統都不會占用磁盤空間


【例】將/etc下面可用的磁盤容量以易讀的容量格式顯示出來,可以知道某個目錄下面還有多少容量可以使用

[root@dsetl /]# df -h /etc

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/VolGroup-lv_root 50G 28G 19G 60% /


【例】將當前各個分區中可用的inode數量列出來

[root@dsetl /]# df -ih

Filesystem Inodes IUsed IFree IUse% Mounted on

/dev/mapper/VolGroup-lv_root 3.2M 555K 2.6M 18% /

tmpfs 1.9M 8 1.9M 1% /dev/shm

/dev/sda1 126K 43 125K 1% /boot

/dev/mapper/VolGroup-lv_home 28M 5.1K 28M 1% /home


    1. du命令:

功能:磁盤與目錄的容量

常用選項說明:

-h GB,MBKB易讀的格式顯示出來

-I 不用硬盤的容量,而以inode的數量顯示

格式 du [-ahskm] 文件或者目錄(dirname/filename)

范例一:列出當前目錄下的所有文件的總容量

[root@dsetl tmp]# du


4 ./pulse-5jkObmcfehgL

4 ./informationServer/ReportingdsetlNode01server1/engine/JREPORT/temp

8 ./informationServer/ReportingdsetlNode01server1/engine/JREPORT

12 ./informationServer/ReportingdsetlNode01server1/engine

16 ./informationServer/ReportingdsetlNode01server1

20 ./informationServer

4 ./keyring-XoSvfl

4 ./orbit-gdm

4 ./.esd-602

61444 ./javasharedresources

范例二:列出當前目錄下的所有文件的總容量,以易讀的格式顯示


[root@dsetl tmp]# du -h

4.0K ./pulse-5jkObmcfehgL

4.0K ./informationServer/ReportingdsetlNode01server1/engine/JREPORT/temp

8.0K ./informationServer/ReportingdsetlNode01server1/engine/JREPORT

12K ./informationServer/ReportingdsetlNode01server1/engine

16K ./informationServer/ReportingdsetlNode01server1

20K ./informationServer

4.0K ./keyring-XoSvfl

4.0K ./orbit-gdm

4.0K ./.esd-602

范例三:檢查根目錄下面每個目錄所占用的容量

[root@dsetl tmp]# du -am /*


4使用實例:

實例1:顯示目錄或者文件所占空間

命令:

du

輸出:

[root@localhost test]# du

608     ./test6

308     ./test4

4       ./scf/lib

4       ./scf/service/deploy/product

4       ./scf/service/deploy/info

12      ./scf/service/deploy

16      ./scf/service

4       ./scf/doc

4       ./scf/bin

32      ./scf

8       ./test3

1288    .

[root@localhost test]#

說明:

只顯示當前目錄下面的子目錄的目錄大小和當前目錄的總的大小,最下面的1288為當前目錄的總大小

實例2顯示指定文件所占空間

命令:

du log2012.log

輸出:

[root@localhost test]# du log2012.log 

300     log2012.log

[root@localhost test]#

說明:

實例3:查看指定目錄的所占空間

命令:

du scf

輸出:

[root@localhost test]# du scf

4       scf/lib

4       scf/service/deploy/product

4       scf/service/deploy/info

12      scf/service/deploy

16      scf/service

4       scf/doc

4       scf/bin

32      scf

[root@localhost test]#

說明:

實例4:顯示多個文件所占空間

命令:

du log30.tar.gz log31.tar.gz

輸出:

[root@localhost test]# du log30.tar.gz log31.tar.gz 

4       log30.tar.gz

4       log31.tar.gz

[root@localhost test]#

說明:

實例5:只顯示總和的大小

命令:

du -s

輸出:

[root@localhost test]# du -s

1288    .

[root@localhost test]# du -s scf

32      scf

[root@localhost test]# cd ..

[root@localhost soft]# du -s test

1288    test

[root@localhost soft]#

說明:

實例6:方便閱讀的格式顯示

命令:

du -h test

輸出:

[root@localhost soft]# du -h test

608K    test/test6

308K    test/test4

4.0K    test/scf/lib

4.0K    test/scf/service/deploy/product

4.0K    test/scf/service/deploy/info

12K     test/scf/service/deploy

16K     test/scf/service

4.0K    test/scf/doc

4.0K    test/scf/bin

32K     test/scf

8.0K    test/test3

1.3M    test

[root@localhost soft]#

說明:

實例7:文件和目錄都顯示

命令:

輸出:

[root@localhost soft]# du -ah test

4.0K    test/log31.tar.gz

4.0K    test/test13.tar.gz

0       test/linklog.log

0       test/test6/log2014.log

300K    test/test6/linklog.log

0       test/test6/log2015.log

4.0K    test/test6/log2013.log

300K    test/test6/log2012.log

0       test/test6/log2017.log

0       test/test6/log2016.log

608K    test/test6

0       test/log2015.log

0       test/test4/log2014.log

4.0K    test/test4/log2013.log

300K    test/test4/log2012.log

308K    test/test4

4.0K    test/scf/lib

4.0K    test/scf/service/deploy/product

4.0K    test/scf/service/deploy/info

12K     test/scf/service/deploy

16K     test/scf/service

4.0K    test/scf/doc

4.0K    test/scf/bin

32K     test/scf

4.0K    test/log2013.log

300K    test/log2012.log

0       test/log2017.log

0       test/log2016.log

4.0K    test/log30.tar.gz

4.0K    test/log.tar.bz2

4.0K    test/log.tar.gz

0       test/test3/log2014.log

4.0K    test/test3/log2013.log

8.0K    test/test3

4.0K    test/scf.tar.gz

1.3M    test

[root@localhost soft]#

說明:

實例8顯示幾個文件或目錄各自占用磁盤空間的大小,還統計它們的總和

命令:

du -c log30.tar.gz log31.tar.gz

輸出:

[root@localhost test]# du -c log30.tar.gz log31.tar.gz 

4       log30.tar.gz

4       log31.tar.gz

8       總計

[root@localhost test]#

說明:

加上-c選項后,du不僅顯示兩個目錄各自占用磁盤空間的大小,還在最后一行統計它們的總和

實例9:按照空間大小排序

命令:

du|sort -nr|more

輸出:

[root@localhost test]# du|sort -nr|more

1288    .

608     ./test6

308     ./test4

32      ./scf

16      ./scf/service

12      ./scf/service/deploy

8       ./test3

4       ./scf/service/deploy/product

4       ./scf/service/deploy/info

4       ./scf/lib

4       ./scf/doc

4       ./scf/bin

[root@localhost test]#

說明:

實例10:輸出當前目錄下各個子目錄所使用的空間

命令:

du -h --max-depth=1

輸出:

[root@localhost test]# du -h  --max-depth=1

608K    ./test6

308K    ./test4

32K     ./scf

8.0K    ./test3

1.3M    .

[root@localhost test]#

說明:

    1. ln 命令

ln linux中又一個非常重要命令,它的功能是為某一個文件在另外一個位置建立一個同步的鏈接.當我們需要在不同的目錄,用到相同的文件時,我們不需要在 每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄,放上該文件,然后在 其它的目錄下用ln命令鏈接(link)它就可以,不必重復 的占用磁盤空間。

1命令格式:

ln [參數][源文件或目錄][目標文件或目錄]

2命令功能:

Linux文件系統中,有所謂的鏈接(link),我們可以將其視為檔案的別名,而鏈接又可分為兩種 : 鏈接(hard link)與軟鏈接(symbolic link),硬鏈接的意思是一個檔案可以有多個名稱,而軟鏈接的方式則是產生一個特殊的檔案,該檔案的內容是指向另一個檔案的位置。硬鏈接是存在同一個文件系統中,而軟鏈接卻可以跨越不同的文件系統。

軟鏈接:

1.鏈接,以路徑的形式存在。類似於Windows操作系統中的快捷方式

2.鏈接可以 跨文件系統 ,硬鏈接不可以

3.鏈接可以對一個不存在的文件名進行鏈接

4.鏈接可以對目錄進行鏈接

硬鏈接:

1.硬鏈接,以文件副本的形式存在。但不占用實際空間。

2.不允許給目錄創建硬鏈接

3.硬鏈接只有在同一個文件系統中才能創建

 這里有兩點要注意:

第一,ln命令會保持每一處鏈接文件的同步性,也就是說,不論你改動了哪一處,其它的文件都會發生相同的變化;

第 二,ln的鏈接又分軟鏈接和硬鏈接兩種,軟鏈接就是ln –s 源文件 目標文件,它只會在你選定的位置上生成一個文件的鏡像,不會占用磁盤空間,硬鏈 接 ln 源文件 目標文件,沒有參數-s, 它會在你選定的位置上生成一個和源文件大小相同的文件,無論是軟鏈接還是硬鏈接,文件都保持同步變化。

ln指令用在鏈接文件或目錄,如同時指定兩個以上的文件或目錄,且最后的目的地是一個已經存在的目錄,則會把前面指定的所有文件或目錄復制到該目錄中。若同時指定多個文件或目錄,且最后的目的地並非是一個已存在的目錄,則會出現錯誤信息。

3命令參數:

必要參數:

-b 刪除,覆蓋以前建立的鏈接

-d 允許超級用戶制作目錄的硬鏈接

-f 強制執行

-i 交互模式,文件存在則提示用戶是否覆蓋

-n 把符號鏈接視為一般目錄

-s 軟鏈接(符號鏈接)

-v 顯示詳細的處理過程

選擇參數:

-S “-S<字尾備份字符串> ”或 “--suffix=<字尾備份字符串>”

-V “-V<備份方式>”或“--version-control=<備份方式>”

--help 顯示幫助信息

--version 顯示版本信息

4使用實例:

實例1:給文件創建軟鏈接

命令:

ln -s log2013.log link2013

輸出:

[root@localhost test]# ll

-rw-r--r-- 1 root bin      61 11-13 06:03 log2013.log

[root@localhost test]# ln -s log2013.log link2013

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 1 root bin      61 11-13 06:03 log2013.log

說明:

log2013.log文件創建軟鏈接link2013,如果log2013.log丟失,link2013將失效

實例2:給文件創建硬鏈接

命令:

ln log2013.log ln2013

輸出:

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 1 root bin      61 11-13 06:03 log2013.log

[root@localhost test]# ln log2013.log ln2013

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 2 root bin      61 11-13 06:03 ln2013

-rw-r--r-- 2 root bin      61 11-13 06:03 log2013.log

說明:

log2013.log創建硬鏈接ln2013log2013.logln2013的各項屬性相同

實例3:接上面兩實例,鏈接完畢后,刪除和重建鏈接原文件

命令:

輸出:

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 2 root bin      61 11-13 06:03 ln2013

-rw-r--r-- 2 root bin      61 11-13 06:03 log2013.log

[root@localhost test]# rm -rf log2013.log 

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 1 root bin      61 11-13 06:03 ln2013

[root@localhost test]# touch log2013.log

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 1 root bin      61 11-13 06:03 ln2013

---xrw-r-- 1 root bin  302108 11-13 06:03 log2012.log

-rw-r--r-- 1 root root      0 12-07 16:19 log2013.log

[root@localhost test]# vi log2013.log 

2013-01

2013-02

2013-03

2013-04

2013-05

2013-06

2013-07

2013-08

2013-09

2013-10

2013-11

2013-12[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 1 root bin      61 11-13 06:03 ln2013

-rw-r--r-- 1 root root     96 12-07 16:21 log2013.log

[root@localhost test]# cat link2013 

2013-01

2013-02

2013-03

2013-04

2013-05

2013-06

2013-07

2013-08

2013-09

2013-10

2013-11

2013-12

[root@localhost test]# cat ln2013 

hostnamebaidu=baidu.com

hostnamesina=sina.com

hostnames=true

說明:

1.源文件被刪除后,並沒有影響硬鏈接文件;軟鏈接文件在centos系統下不斷的閃爍,提示源文件已經不存在

2.重建源文件后,軟鏈接不在閃爍提示,說明已經鏈接成功,找到了鏈接文件系統;重建后,硬鏈接文件並沒有受到源文件影響,硬鏈接文件的內容還是保留了刪除前源文件的內容,說明硬鏈接已經失效

實例4:將文件鏈接為另一個目錄中的相同名字

命令:

ln log2013.log test3

輸出:

[root@localhost test]# ln log2013.log test3

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 1 root bin      61 11-13 06:03 ln2013

-rw-r--r-- 2 root root     96 12-07 16:21 log2013.log

[root@localhost test]# cd test3

[root@localhost test3]# ll

-rw-r--r-- 2 root root 96 12-07 16:21 log2013.log

[root@localhost test3]# vi log2013.log 

2013-01

2013-02

2013-03

2013-04

2013-05

2013-06

2013-07

2013-08

2013-09

2013-10[root@localhost test3]# ll

-rw-r--r-- 2 root root 80 12-07 16:36 log2013.log

[root@localhost test3]# cd ..

[root@localhost test]# ll

lrwxrwxrwx 1 root root     11 12-07 16:01 link2013 -> log2013.log

-rw-r--r-- 1 root bin      61 11-13 06:03 ln2013

-rw-r--r-- 2 root root     80 12-07 16:36 log2013.log

[root@localhost test]#

說明:

test3目錄中創建了log2013.log的硬鏈接,修改test3目錄中的log2013.log文件,同時也會同步到源文件

實例5:給目錄創建軟鏈接

命令:

ln -sv /opt/soft/test/test3 /opt/soft/test/test5

輸出:

[root@localhost test]# ll

drwxr-xr-x 2 root root   4096 12-07 16:36 test3

drwxr-xr-x 2 root root   4096 12-07 16:57 test5

[root@localhost test]# cd test5

[root@localhost test5]# ll

lrwxrwxrwx 1 root root 5 12-07 16:57 test3 -> test3

[root@localhost test5]# cd test3

-bash: cd: test3: 符號連接的層數過多

[root@localhost test5]# 

[root@localhost test5]# 

[root@localhost test5]# ll

lrwxrwxrwx 1 root root 5 12-07 16:57 test3 -> test3

[root@localhost test5]# rm -rf test3

[root@localhost test5]# ll

[root@localhost test5]# ln -sv /opt/soft/test/test3 /opt/soft/test/test5

創建指向“/opt/soft/test/test3”的符號鏈接“/opt/soft/test/test5/test3”

[root@localhost test5]# ll

lrwxrwxrwx 1 root root 20 12-07 16:59 test3 -> /opt/soft/test/test3

[root@localhost test5]# 

[root@localhost test5]# cd test3

[root@localhost test3]# ll

總計 4

-rw-r--r-- 2 root root 80 12-07 16:36 log2013.log

[root@localhost test3]# touch log2014.log

[root@localhost test3]# ll

總計 4

-rw-r--r-- 2 root root 80 12-07 16:36 log2013.log

-rw-r--r-- 1 root root  0 12-07 17:05 log2014.log

[root@localhost test3]# cd ..

[root@localhost test5]# cd ..

說明:

1.目錄只能創建軟鏈接

2.目錄創建鏈接必須用絕對路徑,相對路徑創建會不成功,會提示:符號連接的層數過多 這樣的錯誤

3.在鏈接目標目錄中修改文件都會在源文件目錄中同步變化

    1. ps命令

Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要動態的顯示進程信息,就可以使用top命令。

要 對進程進行監測和控制,首先必須要了解當前進程的情況,也就是需要查看當前進程,而 ps 命令就是最基本同時也是非常強大的進程查看命令。使用該命令可 以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。總之大部分信息都是可以通過執行該命令得到的。

ps 為我們提供了進程的一次性的查看,它所提供的查看結果並不動態連續的;如果想對進程時間監控,應該用 top 工具。

kill 命令用於殺死進程。

linux上進程有5種狀態: 

1. 運行(正在運行或在運行隊列中等待)

2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到信號)

3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生)

4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用后釋放)

5. 停止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號后停止運行運行)

ps工具標識進程的5種狀態碼: 

D 不可中斷 uninterruptible sleep (usually IO)

R 運行 runnable (on run queue)

S 中斷 sleeping

T 停止 traced or stopped

Z 僵死 a defunct (”zombie”) process

1命令格式:

ps[參數]

2命令功能:

用來顯示當前進程的狀態

3命令參數:

a 顯示所有進程

-a 顯示同一終端下的所有程序

-A 顯示所有進程

c 顯示進程的真實名稱

-N 反向選擇

-e 等於“-A”

e 顯示環境變量

f 顯示程序間的關系

-H 顯示樹狀結構

r 顯示當前終端的進程

T 顯示當前終端的所有程序

u 指定用戶的所有進程

-au 顯示較詳細的資訊

-aux 顯示所有包含其他使用者的行程

-C<命令> 列出指定命令的狀況

--lines<行數> 每頁顯示的行數

--width<字符數> 每頁顯示的字符數

--help 顯示幫助信息

--version 顯示版本顯示

4使用實例:

實例1顯示所有進程信息

命令:

ps -A

輸出:

[root@localhost test6]# ps -A

  PID TTY          TIME CMD

    1 ?        00:00:00 init

    2 ?        00:00:01 migration/0

    3 ?        00:00:00 ksoftirqd/0

    4 ?        00:00:01 migration/1

    5 ?        00:00:00 ksoftirqd/1

    6 ?        00:29:57 events/0

    7 ?        00:00:00 events/1

    8 ?        00:00:00 khelper

   49 ?        00:00:00 kthread

   54 ?        00:00:00 kblockd/0

   55 ?        00:00:00 kblockd/1

   56 ?        00:00:00 kacpid

  217 ?        00:00:00 cqueue/0

  ……省略部分結果

說明:

實例2:顯示指定用戶信息

命令:

ps -u root

輸出:

[root@localhost test6]# ps -u root

  PID TTY          TIME CMD

    1 ?        00:00:00 init

    2 ?        00:00:01 migration/0

    3 ?        00:00:00 ksoftirqd/0

    4 ?        00:00:01 migration/1

    5 ?        00:00:00 ksoftirqd/1

    6 ?        00:29:57 events/0

    7 ?        00:00:00 events/1

    8 ?        00:00:00 khelper

   49 ?        00:00:00 kthread

   54 ?        00:00:00 kblockd/0

   55 ?        00:00:00 kblockd/1

   56 ?        00:00:00 kacpid

    ……省略部分結果

說明:

實例3:顯示所有進程信息,連同命令行

命令:

ps -ef

輸出:

[root@localhost test6]# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD

root         1     0  0 Nov02 ?        00:00:00 init [3]                  

root         2     1  0 Nov02 ?        00:00:01 [migration/0]

root         3     1  0 Nov02 ?        00:00:00 [ksoftirqd/0]

root         4     1  0 Nov02 ?        00:00:01 [migration/1]

root         5     1  0 Nov02 ?        00:00:00 [ksoftirqd/1]

root         6     1  0 Nov02 ?        00:29:57 [events/0]

root         7     1  0 Nov02 ?        00:00:00 [events/1]

root         8     1  0 Nov02 ?        00:00:00 [khelper]

root        49     1  0 Nov02 ?        00:00:00 [kthread]

root        54    49  0 Nov02 ?        00:00:00 [kblockd/0]

root        55    49  0 Nov02 ?        00:00:00 [kblockd/1]

root        56    49  0 Nov02 ?        00:00:00 [kacpid]

……省略部分結果

說明:

實例4 ps grep 常用組合用法,查找特定進程

命令:

ps -ef|grep ssh

輸出:

[root@localhost test6]# ps -ef|grep ssh

root      2720     1  0 Nov02 ?        00:00:00 /usr/sbin/sshd

root     17394  2720  0 14:58 ?        00:00:00 sshd: root@pts/0 

root     17465 17398  0 15:57 pts/0    00:00:00 grep ssh

說明:

實例5:將目前屬於您自己這次登入的 PID 與相關信息列示出來

命令:

ps -l

輸出:

[root@localhost test6]# ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0 17398 17394  0  75   0 - 16543 wait   pts/0    00:00:00 bash

4 R     0 17469 17398  0  77   0 - 15877 -      pts/0    00:00:00 ps

說明:

各相關信息的意義:

F 代表這個程序的旗標 (flag)4 代表使用者為 super user

S 代表這個程序的狀態 (STAT),關於各 STAT 的意義將在內文介紹

UID 程序被該 UID 所擁有

PID 就是這個程序的 ID

PPID 則是其上級父程序的ID

C CPU 使用的資源百分比

PRI 這個是 Priority (優先執行序) 的縮寫,詳細后面介紹

NI 這個是 Nice 值,在下一小節我們會持續介紹

ADDR 這個是 kernel function,指出該程序在內存的那個部分。如果是個 running的程序,一般就是 "-"

SZ 使用掉的內存大小

WCHAN 目前這個程序是否正在運作當中,若為 - 表示正在運作

TTY 登入者的終端機位置

TIME 使用掉的 CPU 時間。

CMD 所下達的指令為何

在預設的情況下, ps 僅會列出與目前所在的 bash shell 有關的 PID 而已,所以, 當我使用 ps -l 的時候,只有三個 PID

實例6列出目前所有的正在內存當中的程序

命令:

ps aux

輸出:

[root@localhost test6]# ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.0  0.0  10368   676 ?        Ss   Nov02   0:00 init [3]                  

root         2  0.0  0.0      0     0 ?        S<   Nov02   0:01 [migration/0]

root         3  0.0  0.0      0     0 ?        SN   Nov02   0:00 [ksoftirqd/0]

root         4  0.0  0.0      0     0 ?        S<   Nov02   0:01 [migration/1]

root         5  0.0  0.0      0     0 ?        SN   Nov02   0:00 [ksoftirqd/1]

root         6  0.0  0.0      0     0 ?        S<   Nov02  29:57 [events/0]

root         7  0.0  0.0      0     0 ?        S<   Nov02   0:00 [events/1]

root         8  0.0  0.0      0     0 ?        S<   Nov02   0:00 [khelper]

root        49  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kthread]

root        54  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kblockd/0]

root        55  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kblockd/1]

root        56  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kacpid]

……省略部分結果

說明:

USER:該 process 屬於那個使用者賬號的

PID :該 process 的號碼

%CPU:該 process 使用掉的 CPU 資源百分比

%MEM:該 process 所占用的物理內存百分比

VSZ :該 process 使用掉的虛擬內存量 (Kbytes)

RSS :該 process 占用的固定的內存量 (Kbytes)

TTY :該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序。

STAT:該程序目前的狀態,主要的狀態有

R :該程序目前正在運作,或者是可被運作

S :該程序目前正在睡眠當中 (可說是 idle 狀態),但可被某些訊號 (signal) 喚醒。

T :該程序目前正在偵測或者是停止了

Z :該程序應該已經終止,但是其父程序卻無法正常的終止他,造成 zombie (疆屍) 程序的狀態

START:該 process 被觸發啟動的時間

TIME :該 process 實際使用 CPU 運作的時間

COMMAND:該程序的實際指令

實例7:列出類似程序樹的程序顯示

命令:

ps -axjf

輸出:

[root@localhost test6]# ps -axjf

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

    0     1     1     1 ?           -1 Ss       0   0:00 init [3]                  

    1     2     1     1 ?           -1 S<       0   0:01 [migration/0]

    1     3     1     1 ?           -1 SN       0   0:00 [ksoftirqd/0]

    1     4     1     1 ?           -1 S<       0   0:01 [migration/1]

    1     5     1     1 ?           -1 SN       0   0:00 [ksoftirqd/1]

    1     6     1     1 ?           -1 S<       0  29:58 [events/0]

    1     7     1     1 ?           -1 S<       0   0:00 [events/1]

    1     8     1     1 ?           -1 S<       0   0:00 [khelper]

    1    49     1     1 ?           -1 S<       0   0:00 [kthread]

   49    54     1     1 ?           -1 S<       0   0:00  \_ [kblockd/0]

   49    55     1     1 ?           -1 S<       0   0:00  \_ [kblockd/1]

   49    56     1     1 ?           -1 S<       0   0:00  \_ [kacpid]

說明:

實例8找出與 cron syslog 這兩個服務有關的 PID 號碼

命令:

輸出:

[root@localhost test6]# ps aux | egrep '(cron|syslog)'

root      2682  0.0  0.0  83384  2000 ?        Sl   Nov02   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

root      2735  0.0  0.0  74812  1140 ?        Ss   Nov02   0:00 crond

root     17475  0.0  0.0  61180   832 pts/0    S+   16:27   0:00 egrep (cron|syslog)

[root@localhost test6]#

說明:

其他實例:

1. 可以用 | 管道和 more 連接起來分頁查看

命令:

ps -aux |more

2. 把所有進程顯示出來,並輸出到ps001.txt文件

命令:

ps -aux > ps001.txt

3. 輸出指定的字段

命令:

ps -o pid,ppid,pgrp,session,tpgid,comm

輸出:

[root@localhost test6]# ps -o pid,ppid,pgrp,session,tpgid,comm

  PID  PPID  PGRP  SESS TPGID COMMAND

17398 17394 17398 17398 17478 bash

17478 17398 17478 17398 17478 ps

[root@localhost test6]#


    1. 設置編碼:

      1. export LANG =”zh_CN.GBK” –設置成為GBK

      2. export LNNG=C --設置成為英文

  1. Linux 壓縮與打包

    1. compress 命令:

格式 compress [-dcr] 文件或者目錄

功能:壓縮文件,解壓縮文件

主選項:


-d創建新的檔案文件。如果用戶想備份一個目錄或是一些文件,就要選擇這個選項。相當於打包。

-r從檔案文件中釋放文件。相當於拆包。

-c列出檔案文件的內容,查看已經備份了哪些文件。

范例一:壓縮

[root@dsetl ~]# cd /tmp

[root@dsetl tmp]# cp /etc/man.config .

[root@dsetl tmp]# compress man.config

[root@dsetl tmp]# ls

man.config.Z --輸出結果以.Z結尾的,壓縮后的文件

范例二:解壓縮

[root@dsetl tmp]# compress -d man.config.Z --解壓縮

范例三:壓縮成另一個文件備份

[root@dsetl tmp]# compress -c man.config > man.config.back.Z

注意: -- -c參數比較有趣,它會將壓縮過程的數據輸出到屏幕上,而不是寫入到file.Z文件。所以我們可以通過數據流重導向(>)的方法,將數據輸出為另一個文件名。

[root@dsetl tmp]# ll man.config*

-rw-r--r-- 1 root root 4940 Feb 25 15:25 man.config

-rw-r--r-- 1 root root 2873 Feb 25 15:39 man.config.back.Z

    1. Gzipzcat

格式 Gzip [-cdt] 文件或者目錄 zcat 文件名.gz

功能:壓縮文件

主選項:


-c :將壓縮的數據輸出到屏幕上,可通過數據流重導向來處理

-d : 解壓縮的參數。

-# :壓縮等級,-1最快,但壓縮比最差,-9最慢,但是壓縮比較好。默認是-6

范例一:壓縮

[root@dsetl ~]# cd /tmp

[root@dsetl tmp]# cp /etc/man.config .

[root@dsetl tmp]# gzip man.config --壓縮文件

[root@dsetl tmp]# ll man.config*

-rw-r--r-- 1 root root 2873 Feb 25 15:39 man.config.back.Z

-rw-r--r-- 1 root root 2184 Feb 25 15:25 man.config.gz

范例二:解壓縮

[root@dsetl tmp]# gzip -d man.config.gz

范例三:將man.config用最佳的壓縮比壓縮,並保留原本man.config的文件。

[root@dsetl tmp]# gzip -9 -c man.config > man.config.gz -- -9可以達到較佳的壓縮比,卻會損失一些速度。

范例四:使用zcat查看后綴為.gz的文件。

[root@dsetl tmp]# zcat man.config.gz

    1. Bzip2bzcat

格式 Bzip2 [-cdt] 文件或者目錄 bzcat文件名.bz2

功能:壓縮文件

主選項:

-c :將壓縮的數據輸出到屏幕上,可通過數據流重導向來處理

-d : 解壓縮的參數。

-z : 壓縮的參數

-# :壓縮等級,-1最快,但壓縮比最差,-9最慢,但是壓縮比較好。默認是-6

范例一:壓縮

[root@dsetl ~]# cd /tmp

[root@dsetl tmp]# cp /etc/man.config .

[root@dsetl tmp]# bzip2 -z man.config --壓縮成為后綴為.bz2

[root@dsetl tmp]# ls

man.config.bz2

范例二:解壓縮

[root@dsetl tmp]# bzip2 -d man.config.bz2 ---解壓縮

范例三:將man.config用最佳的壓縮比壓縮,並保留原本man.config的文件。

[root@dsetl tmp]# bzip2 -c man.config > man.config.bz2


范例四:使用bzcat查看后綴為.bz2的文件。

[root@dsetl tmp]# bzcat man.config.bz2

    1. Tar

通過SSH訪問服務器,難免會要用到壓縮,解壓縮,打包,解包等,這時候tar命令就是是必不可少的一個功能強大的工具。linux中最流行的tar是麻雀雖小,五臟俱全,功能強大。

tar 命令可以為linux的文件和目錄創建檔案。利用tar,可以為某一特定文件創建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。 tar最初被用來在磁帶上創建檔案,現在,用戶可以在任何設備上創建檔案。利用tar命令,可以把一大堆的文件和目錄全部打包成一個文件,這對於備份文件 或將幾個文件組合成為一個文件以便於網絡傳輸是非常有用的。

首先要弄清兩個概念:打包和壓縮。打包是指將一大堆文件或目錄變成一個總的文件;壓縮則是將一個大的文件通過一些壓縮算法變成一個小文件。

為什么要區分這兩個概念呢?這源於Linux中很多壓縮程序只能針對一個文件進行壓縮,這樣當你想要壓縮一大堆文件時,你得先將這一大堆文件先打成一個包(tar命令),然后再用壓縮程序進行壓縮(gzip bzip2命令)。

linux下最常用的打包程序就是tar了,使用tar程序打出來的包我們常稱為tar包,tar包文件的命令通常都是以.tar結尾的。生成tar包后,就可以用其它的程序來進行壓縮。

格式 tar [-cxtzjvfpPN] 文件或者目錄

功能:打包

主選項:


-c :建立壓縮文件的參數命令(create

-v: 壓縮的過程中顯示文件。

-f : 使用文件名,在f之后要立即接文件名。不要加參數。

-z 是否同時具有gzip的屬性?即是否需要用gzip壓縮。

-j:是否同時具有bzip2的屬性?即是否需要用bzip2壓縮。

-x:解壓文件的參數命令


范例一:打包

[root@dsetl tmp]# cd lp

[root@dsetl lp]# ls

test1.txt test2.txt test3.txt test4.txt

[root@dsetl lp]#

[root@dsetl lp]# tar -cvf lp.tar *.txt ---打包,將后綴含有.txt的文件打包為lp.tar

test1.txt

test2.txt

test3.txt

test4.txt

[root@dsetl lp]# ls

lp.tar test1.txt test2.txt test3.txt test4.txt


范例二:打包后以gzip壓縮

[root@dsetl lp]# tar -zcvf lp.tar.gz *.txt --將后綴含有.txt的文件打包壓縮為lp.tar.gz

test1.txt

test2.txt

test3.txt

test4.txt

[root@dsetl lp]# ls

lp.tar lp.tar.gz test1.txt test2.txt test3.txt test4.txt

范例三:打包后以bzip2壓縮

[root@dsetl lp]# tar -jcvf lp.tar.bz2 *.txt ---將后綴含有.txt的文件打包壓縮為lp.tar.bz2

test1.txt

test2.txt

test3.txt

test4.txt

[root@dsetl lp]# ls

lp.tar lp.tar.bz2 lp.tar.gz test1.txt test2.txt test3.txt test4.txt

    1. 解壓

范例一

[root@dsetl lp]# tar -xvf lp.tar //解壓 tar

[root@dsetl lp]# ls

lp.tar lp.tar.bz2 lp.tar.gz lp1 test1.txt test2.txt test3.txt test4.txt

范例二

[root@dsetl lp]# tar -xzvf lp.tar.gz //解壓tar.gz

test1.txt

test2.txt

test3.txt

test4.txt

范例三

root@dsetl lp]# tar -jxvf lp.tar.bz2//解壓 tar.bz2

test1.txt

test2.txt

test3.txt

test4.txt

5使用實例

實例1:將文件全部打包成tar

命令:

tar -cvf log.tar log2012.log

tar -zcvf log.tar.gz log2012.log

tar -jcvf log.tar.bz2 log2012.log

輸出:

[root@localhost test]# ls -al log2012.log

---xrw-r-- 1 root root 302108 11-13 06:03 log2012.log

[root@localhost test]# tar -cvf log.tar log2012.log 

log2012.log

[root@localhost test]# tar -zcvf log.tar.gz log2012.log

log2012.log

[root@localhost test]# tar -jcvf log.tar.bz2 log2012.log 

log2012.log

[root@localhost test]# ls -al *.tar*

-rw-r--r-- 1 root root 307200 11-29 17:54 log.tar

-rw-r--r-- 1 root root   1413 11-29 17:55 log.tar.bz2

-rw-r--r-- 1 root root   1413 11-29 17:54 log.tar.gz

說明:

tar -cvf log.tar log2012.log僅打包,不壓縮!

tar -zcvf log.tar.gz log2012.log打包后,以 gzip 壓縮

tar -zcvf log.tar.bz2 log2012.log打包后,以 bzip2 壓縮

在參數 f 之后的文件檔名是自己取的,我們習慣上都用 .tar 來作為辨識。 如果加 z 參數,則以 .tar.gz .tgz 來代表 gzip 壓縮過的 tar包; 如果加 j 參數,則以 .tar.bz2 來作為tar包名。

實例2:查閱上述 tar包內有哪些文件

命令:

tar -ztvf log.tar.gz

輸出:

[root@localhost test]# tar -ztvf log.tar.gz

---xrw-r-- root/root    302108 2012-11-13 06:03:25 log2012.log

說明:

由於我們使用 gzip 壓縮的log.tar.gz,所以要查閱log.tar.gz包內的文件時,就得要加上 z 這個參數了。

實例3:將tar 包解壓縮

命令:

tar -zxvf /opt/soft/test/log.tar.gz

輸出:

[root@localhost test3]# ll

總計 0[root@localhost test3]# tar -zxvf /opt/soft/test/log.tar.gz

log2012.log

[root@localhost test3]# ls

log2012.log

[root@localhost test3]#

說明:

在預設的情況下,我們可以將壓縮檔在任何地方解開的

實例4:只將 /tar 內的 部分文件解壓出來

命令:

tar -zxvf /opt/soft/test/log30.tar.gz log2013.log

輸出:

[root@localhost test]# tar -zcvf log30.tar.gz log2012.log log2013.log 

log2012.log

log2013.log

[root@localhost test]# ls -al log30.tar.gz 

-rw-r--r-- 1 root root 1512 11-30 08:19 log30.tar.gz

[root@localhost test]# tar -zxvf log30.tar.gz log2013.log

log2013.log

[root@localhost test]# ll

-rw-r--r-- 1 root root   1512 11-30 08:19 log30.tar.gz

[root@localhost test]# cd test3

[root@localhost test3]# tar -zxvf /opt/soft/test/log30.tar.gz log2013.log

log2013.log

[root@localhost test3]# ll

總計 4

-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log

[root@localhost test3]#

說明:

我可以透過 tar -ztvf 來查閱 tar 包內的文件名稱,如果單只要一個文件,就可以透過這個方式來解壓部分文件!

實例5:文件備份下來,並且保存其權限

命令:

tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log

輸出:

[root@localhost test]# ll

總計 0

-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

-rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

-rw-r--r-- 1 root root      0 11-16 14:41 log2016.log

[root@localhost test]# tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log 

log2014.log

log2015.log

log2016.log

[root@localhost test]# cd test6

[root@localhost test6]# ll

[root@localhost test6]# tar -zxvpf /opt/soft/test/log31.tar.gz 

log2014.log

log2015.log

log2016.log

[root@localhost test6]# ll

總計 0

-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log

-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log

-rw-r--r-- 1 root root 0 11-16 14:41 log2016.log

[root@localhost test6]#

說明:

這個 -p 的屬性是很重要的,尤其是當您要保留原本文件的屬性時

實例6:在 文件夾當中,比某個日期新的文件才備份

命令:

tar -N "2012/11/13" -zcvf log17.tar.gz test

輸出:

[root@localhost soft]# tar -N "2012/11/13" -zcvf log17.tar.gz test

tar: Treating date `2012/11/13' as 2012-11-13 00:00:00 + 0 nanoseconds

test/test/log31.tar.gz

test/log2014.log

test/linklog.log

test/log2015.log

test/log2013.log

test/log2012.log

test/log2017.log

test/log2016.log

test/log30.tar.gz

test/log.tar

test/log.tar.bz2

test/log.tar.gz

說明:

實例7:備份文件夾內容是排除部分文件

命令:

tar --exclude scf/service -zcvf scf.tar.gz scf/*

輸出:

[root@localhost test]# tree scf

scf

|-- bin

|-- doc

|-- lib

`-- service

     `-- deploy

          |-- info

          `-- product

7 directories, 0 files

[root@localhost test]# tar --exclude scf/service -zcvf scf.tar.gz scf/* 

scf/bin/

scf/doc/

scf/lib/

[root@localhost test]#


  1. 學習shell腳本

    1. Vi的使用:

Vi分為三種模式:一般模式,編輯模式,命令行命令模式。



    1. Vi命令行的命令模式常用命令表

范例一:

使用Vi進入一般模式:

[root@dsetl lp]# vi test1.txt

范例二:按下i鍵進入編輯模式,開始編輯文字

-- INSERT –

范例三:按下【ESC】鍵回到一般模式

范例四:在一般模式下按下 :wq保存后離開Vi

注意:如果文件權限不對,例如為-r--r--r--,可能無法寫入,使用 :wq!多加一個嘆號進行強制寫入.

范例5vi命令設置行號

[root@dsetl lp]# cp /etc/man.config .

[root@dsetl lp]# vi man.config

:set nu – 設置行號

set nonu --取消行號

范例6vi命令刪除所在行

  • D或者d按兩次 刪除光標所在行

范例7vi命令查找字串

  • /text  從光標位置往下找字串text ?text 從光標位置往上找字串text

  • n 繼續找下一個字串(在輸入上面的尋找指令之后使用)

  • N 繼續向上找一個字符串(在輸入上面的尋找指令之后使用)

范例8vi命令移動光標

  • Ctrl+f 向下移動一頁

  • Ctrl+b 向上移動一頁

  • 0 移動到這一行的最前面處

  • $ 移動到這一行的最后面字符處

  • G移動到這個文件的最后一行

  • nG移動到這個文件的第n行。10G移動到這個文件的第10

  • gg移動到這個文件的第1

  • n<Enter> 光標向下移動n行。

  • 40 + 向右箭頭

范例8vi命令搜索與替換(一般模式)

%表示整個文件,$從當前行到文件尾。s表示替換操作。

g放在命令末尾,表示對指定行的搜索字符串的每次出現進行替換;

不加g,表示支隊指定行的搜索字符串的首次出現進行替換。

  • :%s/text1/text2/g   將各行的text1替換為text2

  • :1,$s/ str1/ str2/g 用字符串str2替換所有出現的字符串str1

  • :.,$s/ str1/ str2/g 用字符串str2替換正文當前行到末尾所有出現的字符串str1

  • :1,$s/ str1/ str2/gc 用字符串str2替換所有出現的字符串str1,進行詢問

范例8vi命令刪除、復制、粘貼(一般模式)

刪除:

  • x為向后刪除一個字符,X為向前刪除一個字符。

  • dd 刪除光標所在的那一整行,ndd,例如3dd刪除向下的3行。

復制

  • yy表示復制光標所在的哪一行

  • nyy :n為數字。復制光標所在的向下n行,例如20yy則是復制20行。

  • yw 將光標所在單詞拷入剪貼板

  • y$ 將光標至行尾的字符拷入剪貼板

粘貼:

  • p :把粘貼到的數據粘貼到光標的下一行,

  • P則為貼在光標的上一行。

范例9:復原操作與重做操作

  • u表示復原前一個操作,【Ctrl+r表示重做上一個操作。

  • . 小數點,意思是重復前一個動作。如果想重復刪除,重復粘貼,按下“.”就可以。

  • Vi命令的使用練習:



    1. Bash shell 的內置命令:(cd/umask)

    2. type

格式 type [-tpa] name

主選項:

-t:加入 –t參數,將顯示name的意義

File :表示外部命令。

Alias:表示該命令為命令別名所設置的名稱

Builtin:表示該命令為bash內置的命令功能。

-a: path變量定義的路徑中,列出所有含有name的命令,包括alias別名

范例一:打包

[root@dsetl ~]# type -t tar

File --表示外部命令

[root@dsetl ~]# type -t cd

Builtin --表示該命令為bash內置的命令功能。

[root@dsetl ~]# type -t cp

Alias --表示該命令為命令別名所設置的名稱

    1. Echo :變量的獲取與設置

范例一:讀出變量的內容

[root@dsetl ~]# echo $PATH

范例二:設置和修改某個變量的內容

[root@dsetl ~]# echo $myname

<==這里沒有任何數據,因為這個變量尚未設置。

[root@dsetl ~]# myname=VBird

[root@dsetl ~]# echo $myname

VBird <=變量被設置為VBird

[root@dsetl ~]# unset myname --取消變量名稱

[root@dsetl ~]# echo $myname

<==這里沒有任何數據,因為這個變量尚未設置。

范例三:設置某個變量的內容為Vbird’s name

[root@dsetl ~]# name="Vbird's name"

[root@dsetl ~]# echo $name

Vbird's name

或者

[root@dsetl ~]# name=Vbird\'s\ name

[root@dsetl ~]# echo $name

Vbird's name


  1. 存儲過程學習:

    1. SP_F_CARD_EVENT增量:流水表,數據量大,跑增量,刪除當天的數據,根據時間進行刪除,數據按時間段刪除。給一張表只增不減。

    2. SP_F_CARD_ACCT變量:客戶信息表,即數據會增加也會減少,改變某個字段的信息,例如改變客戶的年齡這個字段。

    3. 全量:數據量小SP_RPT_F_LN_LNMOA_H

在表格或數值數組的首列查找指定的數值,並由此返回表格或數組中該值所在行中指定列處的數值。vlookup(查找值,區域,序列號,邏輯值)“查找值”:為需要在數組第一列中查找的數值,可以是數值、引用或文字符串;“區域”:數組所在的區域,如“B2E10”,也可以對區域或者區域名稱的引用,例如數據庫或數據清單。“序列號”:即希望區域(數組)中待返回的匹配值的序列號,為1時,返回第一列中的數值,依次類推,若序列號小於1,函數返回錯誤#VALUE!;如果大於區域的列數,則返回#REF!;“邏輯值”:為TRUE 或者 FALSE ,它指明是精確匹配還是近似匹配,如果為true或者省略 則返回 近似匹配,為FALSE則返回精確匹配,如果找不到值,則返回#N/A





使用連接函數拼出字段的備注:

=CONCATENATE("comment on column ",B2,".",C2," is '",K2,"';")



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM