1.linux下查看進程占用cpu的情況(top);
格式
top [-] [d delay] [q] [c] [S] [s] [i] [n]
主要參數
- d:指定更新的間隔,以秒計算。
- q:沒有任何延遲的更新。如果使用者有超級用戶,則top命令將會以最高的優先序執行。
- S:累積模式,會將己完成或消失的子行程的CPU時間累積起來。
- s:安全模式。
- n:顯示更新的次數,完成后將會退出top。
??在圖1中,第一行表示的項目依次為當前時間、系統啟動時間、當前系統登錄用戶數目、平均負載(最近一分鐘,五分鐘和十五分鐘的系統負載。load average數據是每隔5秒鐘檢查一次活躍的進程數,然后按特定算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高于5的時候就表明系統在超負荷運轉了。)。第二行顯示的是所有啟動的進程、目前運行的、掛起(Sleeping)的和無用(Zombie)的進程。
第三行,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的百分比
??第四行顯示物理內存的使用情況,包括總的可以使用的內存、已用內存、空閑內存、緩沖區占用的內存。
??第五行顯示交換分區使用情況,包括總的交換分區、使用的、空閑的和用于高速緩存的大小。對于內存監控,在top里我們要時刻監控第五行swap交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行內存和swap的數據交換,這是真正的內存不夠用了。
??第七行以下:各進程(任務)的狀態監控,項目列信息說明如下:
- PID — 進程id
- USER — 進程所有者
- PR — 進程優先級
- NI — nice值。負值表示高優先級,正值表示低優先級
- VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
- RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
- SHR — 共享內存大小,單位kb
- S — 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程
- %CPU — 上次更新到現在的CPU時間占用百分比
- %MEM — 進程使用的物理內存百分比
- TIME+ — 進程使用的CPU時間總計,單位1/100秒
- COMMAND — 進程名稱(命令名/命令行)
在top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況:
觀察上圖,服務器有16個邏輯CPU,實際上是4個物理CPU。再按數字鍵1,就會返回到top基本視圖界面。
高亮顯示當前運行進程
敲擊鍵盤“b”(打開/關閉加亮效果),top的視圖變化如下:
我們發現進程id為2570的“top”進程被加亮了,top進程就是視圖第二行顯示的唯一的運行態(runing)的那個進程,可以通過敲擊“y”鍵關閉或打開運行態進程的加亮效果。
2.查看內存使用情況free
free命令用來顯示內存的使用情況,使用權限是所有用戶。
格式
free [-b-k-m] [-o] [-s delay] [-t] [-V]
主要參數
- -b -k -m:分別以字節(KB、MB)為單位顯示內存使用情況。
- -s delay:顯示每隔多少秒數來顯示一次內存使用情況。
- -t:顯示內存總和列。
- -o:不顯示緩沖區調節列。
應用實例
??free命令是用來查看內存使用情況的主要命令。和top命令相比,它的優點是使用簡單,并且只占用很少的系統資源。通過-S參數可以使用free命令不間斷地監視有多少內存在使用,這樣可以把它當作一個方便實時監控器。
#free -b -s5
??使用這個命令后終端會連續不斷地報告內存使用情況(以字節為單位),每5秒更新一次。
3.linux下查看目錄(ls);
4.顯示日期的指令: date
5.顯示日歷的指令:cal
5.1簡單好用的計算器:bc
怎么10/100會變成0呢?這是因為bc預設僅輸出整數,如果要輸出小數點下位數,那么就必須要執行 scale=number ,那個number就是小數點位數,例如:
數據同步寫入磁盤: sync
輸入sync,在內存中尚未被更新的數據就會被寫入硬盤中;所以,這個指令在系統關機重新啟動之前很重要!最好多執行幾次!
7.慣用的關機指令:shutdown
8.改變文件擁有者:chown
9.改變文件的權限:chmod
權限的設定方法有兩種, 分別可以使用數字或者是符號來進行權限的變更。
–數字類型改變檔案權限:
10.變換目錄:cd
11.顯示當前所在目錄:pwd
12.檔案與目錄的顯示:ls
13.觀察文件類型:file
14. 網絡操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger。
netstat 查看網絡信息
telnet命令通常用來遠程登錄。telnet程序是基于TELNET協議的遠程登錄客戶端程序。Telnet協議是TCP/IP協議族中的一員,是Internet遠程登錄服務的標準協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。
telnet 192.168.120.209
15.終止當前執行命令 ctrl+c
16.打開終端: ctrl+alt+t;關閉當前終端:exit
vi編輯器命令
三種工作模式:輸入模式、命令模式、底行命令模式。三種模式轉換方式如下:
- i鍵–光標之前插入
- I鍵–光標所在行的行首插入
- a鍵– 光標之后插入
- A鍵–光標所在行的行尾插入
- o鍵–光標所在行的下一行插入
- O鍵–光標所在行的上一行插入
- x鍵–刪除光標所在字符
- X鍵–刪除光標前面的字符
- dd–刪除光標所在的整行
- u鍵–取消最近的一次操作
- U鍵–取消所有的操作
底行命令
- :set number 顯示正文行號
- :set autoindent 設置正文自動縮進
文件間的文本移動(前提:目標文件已存在)
- :1,5 w filename
- :1,5 w >> filename
文本塊移動
- :1,3 m 7
按行復制
- :1,3 co . 將1-3行復制到光標所在位置
- :1.3 co 7 將1-3行復制到第7行
編輯多個文件
- vi m1.c m2.c m3.c
編輯下一個文件
- : n
跳躍式編輯
- : e m3.c
返回剛才編輯的文件
- :e #
- :wq 存盤后退出
- :q 若無修改直接退出
- :w filename 另存為
- :w 將編輯緩沖區的文件寫入編輯的文件中
- :q! 強制退出,丟棄緩沖區內容
注 makefile
??makefile關系到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。
??makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。
??一般來說,無論是C、C++、還是pas,首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然后再把大量的Object File合成執行文件,這個動作叫作鏈接(link)。
??編譯時,編譯器需要的是語法的正確,函數與變量的聲明的正確。對于后者,通常是你需要告訴編譯器頭文件的所在位置(頭文件中應該只是聲明,而定義應該放在C/C++文件中),只要所有的語法正確,編譯器就可以編譯出中間目標文件。一般來說,每個源文件都應該對應于一個中間目標文件(O文件或是OBJ文件)。
??鏈接時,主要是鏈接函數和全局變量,所以,我們可以使用這些中間目標文件(O文件或是OBJ文件)來鏈接我們的應用程序。鏈接器并不管函數所在的源文件,只管函數的中間目標文件(Object File),在大多數時候,由于源文件太多,編譯生成的中間目標文件太多,而在鏈接時需要明顯地指出中間目標文件名,這對于編譯很不方便,所以,我們要給中間目標文件打個包,在Windows下這種包叫“庫文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
??總結一下,源文件首先會生成中間目標文件,再由中間目標文件生成執行文件。在編譯時,編譯器只檢測程序語法,和函數、變量是否被聲明。如果函數未被聲明,編譯器會給出一個警告,但可以生成Object File。而在鏈接程序時,鏈接器會在所有的Object File中找尋函數的實現,如果找不到,那到就會報鏈接錯誤碼(Linker Error).
新建文件 vi、vim、touch
假設我們有下面這樣的程序:
/*main.c*/ #include "mytool1.h" #include "mytool2.h" #include <stdio.h>int main(int argc,char *argv[]) {mytool1_print("hello");mytool2_print("hello"); } /*mytoo1.h*/ #ifndef _MYTOOL1_H #define _MYTOOL1_H void mytool1_print(char *print_str); #endif /*mytool1.c*/ #include "mytool1.h"void mytool1_print(char *print_str) {printf("This is mytool1 print %s\n",print_str); } /*mytool2.h*/ #ifndef _MYTOOL2_H #define _MYTOOL2_H void mytool2_print(char *print_str); #endif /*mytool2.c*/ #include "mytool2.h"void mytool2_print(char *print_str) {printf("This is mytool2 print %s\n",print_str); }
我們可以這么編譯鏈接這個程序:
gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c gcc -o myprint main.o mytool1.o mytool2.o
這樣之后只需執行命令”./myprint”,便可以簡單的運行這個程序。
但是當我們修改了其中的一個文件之后是不是還要不厭其煩的輸入上面的編譯命令?
??為了解決這一問題,我們有個好方法去解決,那就是編寫一個makefile文件,用make命令去編譯上面的程序。
執行命令”vim Makefile”
編寫如下代碼:
main: main.o mytool1.o mytool2.o [Tab]gcc -o myprint main.o mytool1.o mytool2.o main.o: main.c mytool1.h mytool2.h [Tab]gcc -c main.c mytool1.o: mytool1.c mytool1.h [Tab]gcc -c mytool1.c mytool2.o: mytool2.c mytool2.h [Tab]gcc -c mytool2.c
保存后執行命令“make -f Makefile”
這樣也可以生成一個可執行程序。
有了這個Makefile文件之后,無論我們修改什么地方,只要make一些這個文件,就可以輕松的生成可執行文件。
在Makefile中#開始的行為注釋行,此文件的一般格式為:
(target目標):(components依賴對象)
【Tab制表符按鍵】(rule規則)
??第一行為依賴關系,比如上面那個Makefile文件的第一行,我們的目標main的依賴對象為main.o、mytool1.o和mytool2.o
??第二行為執行規則,當依賴的對象在目標修改后修改的話,就要執行規則這一行所指定的命令,注意,這一行開頭必須是Tab鍵。
??上面的make里的-f參數表示尋找到名為Makefile的文件進行make,因為make只能自動識別名為makefile或者Makefiile兩個文件,如果你編譯的makefile文件名為my_makefile的話,就需要加上-f參數,否則make無法找到你指定的my_makefile文件。
??此外,makefile里面還有三個非常有用的變量:$@(目標文件)、$^(所有的依賴文件)和$<(第一個依賴文件)
??如果使用這三個變量,我們的Makefile文件可以簡化為:
main: main.o mytool1.o mytool2.o [Tab]gcc -o $@ $^ main.o: main.c mytool1.h mytool2.h [Tab]gcc -c $< mytool1.o: mytool1.c mytool1.h [Tab]gcc -c $< mytool2.o: mytool2.c mytool2.h [Tab]gcc -c $<