第13章 學習Bash Shell
第14章 Linux帳號管理與ACL許可權設定
/etc/shadow檔案
- Su使用
su總結一下用法是這樣的:
若要完整的切換到新使用者的環境,必須要使用『 su - username 』或『 su -l username 』, 才會連同 PATH/USER/MAIL 等變數都轉成新使用者的環境;
如果僅想要執行一次 root 的指令,可以利用『 su - -c "指令串" 』的方式來處理;
使用 root 切換成為任何使用者時,並與需要輸入新使用者的密碼;
雖然使用 su 很方便啦,與過缺點是,當我的主機是多人共管的環境時,如果大家都要使用 su 來切換成為 root 的身份,那麼與就每個人都得要知道 root 的密碼,這樣密碼太多人知道可能會流出去, 很不妥當呢!怎辦?透過 sudo 來處理即可!
- sudo
相對於 su 需要瞭解新切換的使用者密碼 (常常是需要 root 的密碼), sudo 的執行則僅需要自己的密碼即可! 甚至可以設定不要求輸入密碼即可執行 sudo 呢!由於 sudo 可以讓你以其他使用者的身份執行指令 (通常是使用 root 的身份來執行指令),因此並非所有人都能夠執行 sudo , 而是僅有規範到/etc/sudoers 內的使用者才能夠執行 sudo 這個指令
第十五章、磁碟配額(Quota)與進階檔案系統管理
第17章 程式管理
- ps :將某個時間點的程式運作情況擷取下來
- 僅觀察自己的 bash 相關程式: ps –l
系統整體的程式運作是非常多的,但如果使用 ps -l 則僅列出與你的作業環境 (bash) 有關的程式而已,
亦即最上層的父程式會是你自己的 bash 而沒有延伸到 init 這支程式去!我們就來觀察看看:
- F:代表這個程式旗標 (process flags),說明這個程式的總結許可權,常見號碼有:
o 若為 4 表示此程式的許可權為 root ;
o 若為 1 則表示此子程式僅進行複製(fork)而沒有實際執行(exec)。
- S:代表這個程式的狀態 (STAT),主要的狀態有:
o R (Running):該程式正在運作中;
o S (Sleep):開程式目前正在睡眠狀態(idle),但可以被喚醒(signal)。
o D :不可被喚醒的睡眠狀態,通常這支程式可能在等待 I/O 的情況(ex>列印)
o T :停止狀態(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態;
o Z (Zombie):殭屍狀態,程式已經終止但即無法被移除至記憶體外。
- UID/PID/PPID:代表『此程式被該 UID 所擁有/程式的 P識別碼/此程式的父程式 P識別碼』
- C:代表 CPU 使用率,單位為百分比;
- PRI/NI:Priority/Nice 的縮寫,代表此程式被 CPU 所執行的優先順序,數值越小代表該程式越快被 CPU 執行。
- ADDR/SZ/WCHAN:都與記憶體有關,ADDR 是 kernel function,指出該程式在記憶體的哪個部分,如果是個 running 的程式,一般就會顯示『 - 』 / SZ 代表此程式用掉多少記憶體 / WCHAN表示目前程式是否運作中,同樣的, 若為 - 表示正在運作中。
- TTY:登入者的終端機位置,若為進程登入則使用動態終端介面 (pts/n);
- TIME:使用掉的 CPU 時間,注意,是此程式實際花費 CPU 運作的時間,而不是系統時間;
- CMD:就是 command 的縮寫,造成此程式的觸發程式之指令為何。
所以你看到的 ps -l 輸出訊息中,他說明的是:『bash 的程式屬於 UID 為 0 的使用者,狀態為睡眠(sleep), 之所以為睡眠因為他觸發了 ps (狀態為 run) 之故。此程式的 PID 為 13639,優先執行順序為 75 , 下達 bash 所取得的終端介面為 pts/1 ,運作狀態為等待 (wait) 。』這樣已經夠清楚了吧?
- 觀察系統所有程式: ps aux
你會變現 ps -l 與 ps aux 顯示的項目並不相同!在 ps aux 顯示的項目中,各欄位的意義為:
- USER:該 process 屬於那個使用者帳號的?
- PID :該 process 的程式標識符。
- %CPU:該 process 使用掉的 CPU 資源百分比;
- %MEM:該 process 所佔用的實體記憶體百分比;
- VSZ :該 process 使用掉的虛擬記憶體量 (Kbytes)
- RSS :該 process 佔用的固定的記憶體量 (Kbytes)
- TTY :該 process 是在那個終端機上面運作,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登入者程式,若為 pts/0 等等的,則表示為由網路連接進主機的程式。
- STAT:該程式目前的狀態,狀態顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)
- START:該 process 被觸發啟動的時間;
- TIME :該 process 實際使用 CPU 運作的時間。
- COMMAND:該程式的實際指令為何?
一般來說,ps aux 會依照 PID 的順序來排序顯示,我們還是以 13639 那個 PID 那行來說明!該行的意
義為『 root 執行的 bash PID 為 13639,佔用了 0.2% 的記憶體容量百分比,狀態為休眠 (S),該程式啟
動的時間為 11:44 , 且取得的終端機環境為 pts/1 。』與 ps aux 看到的其實是同一個程式啦!
- top:動態觀察程式的變化
相對於 ps 是擷取一個時間點的程式狀態, top 則可以持續偵測程式運作的狀態!使用方式如下:
top 也是個挺不錯的程式觀察工具!但不同於 ps 是靜態結果輸出, top 這個程式可以持續的監測整個系統的程式工作狀態。 在預設的情況下,每次更新程式資源的時間為 5 秒,不過,可以使用 -d 來進行修改。 top 主要分為兩個畫面,上面的畫面為整個系統的資源使用狀態,基本上總共有六行,顯示的內容依序是:
- 第一行(top...):這一行顯示的資訊分別為:
o 目前的時間,亦即是 17:03:09 那個項目;
o 開機到目前為止所經過的時間,亦即是 up 7days, 16:16 那個項目;
o 已經登入系統的使用者人數,亦即是 1 user項目;
o 系統在 1, 5, 15 分鐘的平均工作負載。我們在第十六章課到的 batch 工作方式為負載小於 0.8 就是這個負載囉!代表的是 1, 5, 15 分鐘,系統平均要負責運作幾個程式(工作)的意思。 越小代表系統越閑置,若高於 1 得要注意你的系統程式是否太過繁複了!
- 第二行(Tasks...):顯示的是目前程式的總量與個別程式在什麼狀態(running, sleeping, stopped, zombie)。 比較需要注意的是最後的 zombie 那個數值,如果不是 0 !好好看看到底是那個process 變成殭屍了吧?
- 第三行(Cpus...):顯示的是 CPU 的整體負載,每個項目可使用 ? 需要特別注意的是 %wa ,那個項目代表的是 I/O wait, 通常你的系統會變慢都是 I/O 產生的問題比較大!因此這裡得要注意這個項目耗用 CPU 的資源喔! 另外,如果是多核心的裝置,可以按下數字鍵『1』來切換成與同 CPU 的負載率。
- 第四行與第五行:表示目前的實體記憶體與虛擬記憶體 (Mem/Swap) 的使用方式。 再次重申,要注意的是 swap 的使用量要盡量的少!如果 swap 被用的很大量,表示系統的實體記憶體實在與足!
- 第六行:這個是當在 top 程式當中輸入指令時,顯示狀態的地方。
至於 top 下半部分的畫面,則是每個 process 使用的資源情況。比較需要注意的是:
PID :每個 process 的 ID 啦!
USER:該 process 所屬的使用者;
PR :Priority 的簡寫,程式的優先執行順序,越小越早被執行;
NI :Nice 的簡寫,與 Priority 有關,也是越小越早被執行;
%CPU:CPU 的使用率;
%MEM:記憶體的使用率;
TIME+:CPU 使用時間的累加;
top 預設使用 CPU 使用率 (%CPU) 作為排序的重點,如果你想要使用記憶體使用量率排序,則可以按下『M』, 若要回複則按下『P』即可。如果想要離開 top 則按下『 q 』吧!如果你想要將 top 的結果輸出成為檔案時, 可以這樣做:
(1) free :觀察記憶體使用量情況
仔細看看,我的系統當中有 725MB 左右的實體記憶體,我的 swap 有 1GB 左右, 那我使用 free -m 以 MBytes 來顯示時,就會出現上面的資訊。Mem 那一行顯示的是實體記憶體的量, Swap 則是虛擬記憶體的量。 total 是總量, used 是已被使用的量, free 則是剩餘可用的量。 後面的shared/buffers/cached 則是在已被使用的量當中,用來作為緩衝及快取的量。
仔細的看到範例一的輸出喔,我們的 Linux 測試用主機是很平凡的,根本沒有什麼工作, 但是,我的物記憶體是幾乎被用光光的情況呢!不過,至少有 132MB 用在緩衝記憶 (buffers) 工作, 287MB 則用在快取 (cached) 工作,也就是說,系統是『很有效率的將所有的記憶體用光光』, 目的是為了讓系統的存取效能加速啦!
很多服友都會問到這個問題『我的系統明明很輕鬆,為何記憶體會被用光光?』現在瞭了吧? 被用光是正常的!而需要注意的反而是 swap 的量。一般來說, swap 最好不要被使用,尤其 swap 最好不要被使用超過 20% 以上, 如果您變現 swap 的用量超過 20% ,那舉,最好還是買實體記憶體來插吧! 因為, Swap 的效能跟實體記憶體實在差很多,而系統會使用到 swap , 絕對是因為實體記憶體與足了才會這樣做的!
Tips:
Linux 系統為了要加速系統效能,所以會將最常使用到的或者是最近使用到的檔案資料快取 (cache) 下來, 這樣未來系統要使用該檔案時,就直接由記憶體中搜尋取出,而不需要重新讀取硬碟,速度上面當然就加快了! 因此,實體記憶體被用光是正常的!
uname:查閱系統與核心相關資訊
- uptime:觀察系統啟動時間與工作負載
這個指令很單純呢!就是顯示出目前系統已經開機多久的時間,以及 1, 5, 15 分鐘的平均負載就是了。還記得 top 吧?沒錯啦!這個 uptime 可以顯示出 top 畫面的最上面一行!
- netstat :追蹤網路或插槽檔案
這個 netstat 也是挺好玩的,其實這個指令比較常被用在網路的監控方面,與過,在程式管理方面也是需要瞭解的啦! 這個指令的執行如下所示:基本上, netstat 的輸出分為兩大部分,分別是網路與系統自己的程式相關忢部分:
- dmesg :分析核心產生的訊息
系統在開機的時候,核心會去偵測系統的硬體,你的某些硬體到底有沒有被捉到,那就與這個時候的偵測有關。 但是這些偵測的過程要與是沒有顯示在螢幕上,就是很飛快的在螢幕上一閃而逝!能不能把核心偵測的訊息捉出來瞧瞧? 可以的,那就使用 dmesg 吧!
所有核心偵測的訊息,不管是開機時候還是系統運作過程中,反正只要是核心產生的訊息,都會被記錄到記憶體中的某個保護區段。 dmesg 這個指令就能夠將該區段的訊息讀出來的!因為訊息實在太多了,所以執行時可以加入這個管線指令『 | more 』來使畫面暫停!
由範例二就知道我這部主機的硬碟的格式是什麼了吧!沒錯啦!還可以查閱能與能找到網路卡喔!網路卡的代號是 eth ,所以,直接輸入 dmesg | grep -i eth
(6) vmstat :偵測系統資源變化
如果你想要動態瞭解一下系統資源的運作,那舉這個 vmstat 確實可以玩一玩!vmstat 可以偵測『 CPU / 記憶體 / 磁碟輸入輸出狀態 』等等,如果你想要瞭解一部繁忙的系統到底是哪個環節最累人, 可以使用 vmstat 分析看看。底下是常見的選項與參數說明:
其實,我們之前提到的所謂的程式都是在記憶體當中嘛!而記憶體當中的資料又都是寫入到 /proc/* 這個目錄下的,所以囉,我們當然可以直接觀察 /proc 這個目錄當中的檔案啊!
(1) fuser:藉由檔案(或檔案系統)找出正在使用該檔案的程式
有的時候我想要知道我的程式到底在這次啟動過程中開啟了多少檔案,可以利用 fuser 來觀察啦! 舉例來說,你如果卸載時變現系統通知:『 device is busy 』,那表示這個檔案系統正在忙碌中, 表示有某支程式有利用到該檔案系統啦!那舉你就可以利用 fuser 來追蹤囉!fuser 文法有點像這樣:
(2) lsof :列出被程式所開啟的檔案檔案名稱
相對於 fuser 是由檔案或者裝置去找出使用該檔案或裝置的程式,反過來說, 如何查出某個程式開啟或者使用的檔案與裝置呢?呼呼!那就是使用 lsof 囉~
(3) pidof :找出某支正在執行的程式的 PID