Linux基礎(chǔ)

一佛南、常用操作以及概念

快捷鍵

  • Tab:命令和文件名補(bǔ)全;
  • Ctrl+C:中斷正在運(yùn)行的程序嵌言;
  • Ctrl+D:結(jié)束鍵盤輸入(End Of File嗅回,EOF)

求助

1. --help

指令的基本用法與選項(xiàng)介紹。

2. man

man 是 manual 的縮寫摧茴,將指令的具體信息顯示出來绵载。

當(dāng)執(zhí)行man date時(shí),有 DATE(1) 出現(xiàn)苛白,其中的數(shù)字代表指令的類型尘分,常用的數(shù)字及其類型如下:

代號(hào) 類型
1 用戶在 shell 環(huán)境中可以操作的指令或者可執(zhí)行文件
5 配置文件
8 系統(tǒng)管理員可以使用的管理指令

3. info

info 與 man 類似,但是 info 將文檔分成一個(gè)個(gè)頁面丸氛,每個(gè)頁面可以進(jìn)行跳轉(zhuǎn)培愁。

4. doc

/usr/share/doc 存放著軟件的一整套說明文件。

關(guān)機(jī)

1. who

在關(guān)機(jī)前需要先使用 who 命令查看有沒有其它用戶在線缓窜。

2. sync

為了加快對(duì)磁盤文件的讀寫速度定续,位于內(nèi)存中的文件數(shù)據(jù)不會(huì)立即同步到磁盤上,因此關(guān)機(jī)之前需要先進(jìn)行 sync 同步操作禾锤。

3. shutdown

# shutdown [-krhc] 時(shí)間 [信息]
-k : 不會(huì)關(guān)機(jī)私股,只是發(fā)送警告信息,通知所有在線的用戶
-r : 將系統(tǒng)的服務(wù)停掉后就重新啟動(dòng)
-h : 將系統(tǒng)的服務(wù)停掉后就立即關(guān)機(jī)
-c : 取消已經(jīng)在進(jìn)行的 shutdown 指令內(nèi)容

PATH

可以在環(huán)境變量 PATH 中聲明可執(zhí)行文件的路徑恩掷,路徑之間用 : 分隔倡鲸。

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin

env 命令可以獲取當(dāng)前終端的環(huán)境變量。

sudo

sudo 允許一般用戶使用 root 可執(zhí)行的命令黄娘,不過只有在 /etc/sudoers 配置文件中添加的用戶才能使用該指令峭状。

包管理工具

RPM 和 DPKG 為最常見的兩類軟件包管理工具。RPM 全稱為 Redhat Package Manager逼争,最早由 Red Hat 公司制定實(shí)施优床,隨后被 GNU 開源操作系統(tǒng)接受并成為很多 Linux 系統(tǒng) (RHEL) 的既定軟件標(biāo)準(zhǔn)。與 RPM 進(jìn)行競(jìng)爭(zhēng)的是基于 Debian 操作系統(tǒng) (UBUNTU) 的 DEB 軟件包管理工具 DPKG誓焦,全稱為 Debian Package胆敞,功能方面與 RPM 相似。

YUM 基于 RPM杂伟,具有依賴管理功能移层,并具有軟件升級(jí)的功能。

發(fā)行版

Linux 發(fā)行版是 Linux 內(nèi)核及各種應(yīng)用軟件的集成版本赫粥。

基于的包管理工具 商業(yè)發(fā)行版 社區(qū)發(fā)行版
RPM Red Hat Fedora / CentOS
DPKG Ubuntu Debian

VIM 三個(gè)模式

  • 一般指令模式(Command mode):VIM 的默認(rèn)模式观话,可以用于移動(dòng)游標(biāo)查看內(nèi)容;
  • 編輯模式(Insert mode):按下 "i" 等按鍵之后進(jìn)入傅是,可以對(duì)文本進(jìn)行編輯匪燕;
  • 指令列模式(Bottom-line mode):按下 ":" 按鍵之后進(jìn)入蕾羊,用于保存退出等操作喧笔。

<div align="center"> <img src="../pics//5942debd-fc00-477a-b390-7c5692cc8070.jpg" width="400"/> </div>

在指令列模式下帽驯,有以下命令用于離開或者保存文件。

命令 作用
:w 寫入磁盤
:w! 當(dāng)文件為只讀時(shí)书闸,強(qiáng)制寫入磁盤尼变。到底能不能寫入,與用戶對(duì)該文件的權(quán)限有關(guān)
:q 離開
:q! 強(qiáng)制離開不保存
:wq 寫入磁盤后離開
:wq! 強(qiáng)制寫入磁盤后離開

GNU

GNU 計(jì)劃浆劲,譯為革奴計(jì)劃嫌术,它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng),稱為 GNU牌借,其內(nèi)容軟件完全以 GPL 方式發(fā)布度气。其中 GPL 全稱為 GNU 通用公共許可協(xié)議,包含了以下內(nèi)容:

  • 以任何目的運(yùn)行此程序的自由膨报;
  • 再復(fù)制的自由磷籍;
  • 改進(jìn)此程序,并公開發(fā)布改進(jìn)的自由现柠。

開源協(xié)議

二、磁盤

HDD

Hard Disk Drives(HDD) 俗稱硬盤够吩,具有以下結(jié)構(gòu):

  • 盤面(Platter):一個(gè)硬盤有多個(gè)盤面比然;
  • 磁道(Track):盤面上的圓形帶狀區(qū)域,一個(gè)盤面可以有多個(gè)磁道周循;
  • 扇區(qū)(Track Sector):磁道上的一個(gè)弧段强法,一個(gè)磁道可以有多個(gè)扇區(qū),它是最小的物理儲(chǔ)存單位湾笛,目前主要有 512 bytes 與 4 K 兩種大心馓獭;
  • 磁頭(Head):與盤面非常接近迄本,能夠?qū)⒈P面上的磁場(chǎng)轉(zhuǎn)換為電信號(hào)(讀)硕淑,或者將電信號(hào)轉(zhuǎn)換為盤面的磁場(chǎng)(寫);
  • 制動(dòng)手臂(Actuator arm):用于在磁道之間移動(dòng)磁頭嘉赎;
  • 主軸(Spindle):使整個(gè)盤面轉(zhuǎn)動(dòng)置媳。

<div align="center"> <img src="../pics//014fbc4d-d873-4a12-b160-867ddaed9807.jpg" width=""/> </div>

Decoding UCS Invicta – Part 1

磁盤接口

1. IDE

IDE(ATA)全稱 Advanced Technology Attachment,接口速度最大為 133MB/s公条,因?yàn)椴⒖诰€的抗干擾性太差拇囊,且排線占用空間較大,不利電腦內(nèi)部散熱靶橱,已逐漸被 SATA 所取代寥袭。

<div align="center"> <img src="../pics//924914c0-660c-4e4a-bbc0-1df1146e7516.jpg" width="400"/> </div>

2. SATA

SATA 全稱 Serial ATA路捧,也就是使用串口的 ATA 接口,因抗干擾性強(qiáng)传黄,且對(duì)數(shù)據(jù)線的長度要求比 ATA 低很多杰扫,支持熱插拔等功能,SATA-II 的接口速度為 300MiB/s膘掰,而新的 SATA-III 標(biāo)準(zhǔn)可達(dá)到 600MiB/s 的傳輸速度章姓。SATA 的數(shù)據(jù)線也比 ATA 的細(xì)得多,有利于機(jī)箱內(nèi)的空氣流通凡伊,整理線材也比較方便。

<div align="center"> <img src="../pics//f9f2a16b-4843-44d1-9759-c745772e9bcf.jpg" width=""/> </div>

3. SCSI

SCSI 全稱是 Small Computer System Interface(小型機(jī)系統(tǒng)接口),經(jīng)歷多代的發(fā)展耕腾,從早期的 SCSI-II,到目前的 Ultra320 SCSI 以及 Fiber-Channel(光纖通道)冈欢,接口型式也多種多樣。SCSI 硬盤廣為工作站級(jí)個(gè)人電腦以及服務(wù)器所使用盈简,因此會(huì)使用較為先進(jìn)的技術(shù)凑耻,如碟片轉(zhuǎn)速 15000rpm 的高轉(zhuǎn)速,且資料傳輸時(shí) CPU 占用率較低柠贤,但是單價(jià)也比相同容量的 ATA 及 SATA 硬盤更加昂貴香浩。

<div align="center"> <img src="../pics//f0574025-c514-49f5-a591-6d6a71f271f7.jpg" width=""/> </div>

4. SAS

SAS(Serial Attached SCSI)是新一代的 SCSI 技術(shù),和 SATA 硬盤相同臼勉,都是采取序列式技術(shù)以獲得更高的傳輸速度邻吭,可達(dá)到 6Gb/s。此外也透過縮小連接線改善系統(tǒng)內(nèi)部空間等宴霸。

<div align="center"> <img src="../pics//6729baa0-57d7-4817-b3aa-518cbccf824c.jpg" width=""/> </div>

磁盤的文件名

Linux 中每個(gè)硬件都被當(dāng)做一個(gè)文件囱晴,包括磁盤膏蚓。磁盤以磁盤接口類型進(jìn)行命名,常見磁盤的文件名如下:

  • IDE 磁盤:/dev/hd[a-d]
  • SATA/SCSI/SAS 磁盤:/dev/sd[a-p]

其中文件名后面的序號(hào)的確定與系統(tǒng)檢測(cè)到磁盤的順序有關(guān)畸写,而與磁盤所插入的插槽位置無關(guān)驮瞧。

三、分區(qū)

分區(qū)表

磁盤分區(qū)表主要有兩種格式艺糜,一種是限制較多的 MBR 分區(qū)表剧董,一種是較新且限制較少的 GPT 分區(qū)表幢尚。

1. MBR

MBR 中破停,第一個(gè)扇區(qū)最重要,里面有主要開機(jī)記錄(Master boot record, MBR)及分區(qū)表(partition table)尉剩,其中主要開機(jī)記錄占 446 bytes真慢,分區(qū)表占 64 bytes。

分區(qū)表只有 64 bytes理茎,最多只能存儲(chǔ) 4 個(gè)分區(qū)黑界,這 4 個(gè)分區(qū)為主分區(qū)(Primary)和擴(kuò)展分區(qū)(Extended)。其中擴(kuò)展分區(qū)只有一個(gè)皂林,它將其它扇區(qū)用來記錄分區(qū)表朗鸠,因此通過擴(kuò)展分區(qū)可以分出更多分區(qū),這些分區(qū)稱為邏輯分區(qū)础倍。

Linux 也把分區(qū)當(dāng)成文件烛占,分區(qū)文件的命名方式為:磁盤文件名 + 編號(hào),例如 /dev/sda1沟启。注意忆家,邏輯分區(qū)的編號(hào)從 5 開始。

2. GPT

不同的磁盤有不同的扇區(qū)大小德迹,例如 512 bytes 和最新磁盤的 4 k芽卿。GPT 為了兼容所有磁盤,在定義扇區(qū)上使用邏輯區(qū)塊地址(Logical Block Address, LBA)胳搞,LBA 默認(rèn)大小為 512 bytes卸例。

GPT 第 1 個(gè)區(qū)塊記錄了主要開機(jī)記錄(MBR),緊接著是 33 個(gè)區(qū)塊記錄分區(qū)信息肌毅,并把最后的 33 個(gè)區(qū)塊用于對(duì)分區(qū)信息進(jìn)行備份筷转。這 33 個(gè)區(qū)塊第一個(gè)為 GPT 表頭紀(jì)錄,這個(gè)部份紀(jì)錄了分區(qū)表本身的位置與大小和備份分區(qū)的位置芽腾,同時(shí)放置了分區(qū)表的校驗(yàn)碼 (CRC32)旦装,操作系統(tǒng)可以根據(jù)這個(gè)校驗(yàn)碼來判斷 GPT 是否正確。若有錯(cuò)誤摊滔,可以使用備份分區(qū)進(jìn)行恢復(fù)阴绢。

GPT 沒有擴(kuò)展分區(qū)概念店乐,都是主分區(qū),每個(gè) LAB 可以分 4 個(gè)分區(qū)呻袭,因此總共可以分 4 * 32 = 128 個(gè)分區(qū)眨八。

MBR 不支持 2.2 TB 以上的硬盤,GPT 則最多支持到 233 TB = 8 ZB左电。

<div align="center"> <img src="../pics//GUID_Partition_Table_Scheme.svg.png" width="400"/> </div>

開機(jī)檢測(cè)程序

1. BIOS

BIOS(Basic Input/Output System廉侧,基本輸入輸出系統(tǒng)),它是一個(gè)固件(嵌入在硬件中的軟件)篓足,BIOS 程序存放在斷電后內(nèi)容不會(huì)丟失的只讀內(nèi)存中段誊。

BIOS 是開機(jī)的時(shí)候計(jì)算機(jī)執(zhí)行的第一個(gè)程序,這個(gè)程序知道可以開機(jī)的磁盤栈拖,并讀取磁盤第一個(gè)扇區(qū)的主要開機(jī)記錄(MBR)连舍,由主要開機(jī)記錄(MBR)執(zhí)行其中的開機(jī)管理程序,這個(gè)開機(jī)管理程序會(huì)加載操作系統(tǒng)的核心文件涩哟。

<div align="center"> <img src="../pics//50831a6f-2777-46ea-a571-29f23c85cc21.jpg"/> </div>

主要開機(jī)記錄(MBR)中的開機(jī)管理程序提供以下功能:選單索赏、載入核心文件以及轉(zhuǎn)交其它開機(jī)管理程序。轉(zhuǎn)交這個(gè)功能可以用來實(shí)現(xiàn)了多重引導(dǎo)贴彼,只需要將另一個(gè)操作系統(tǒng)的開機(jī)管理程序安裝在其它分區(qū)的啟動(dòng)扇區(qū)上潜腻,在啟動(dòng)開機(jī)管理程序時(shí),就可以通過選單選擇啟動(dòng)當(dāng)前的操作系統(tǒng)或者轉(zhuǎn)交給其它開機(jī)管理程序從而啟動(dòng)另一個(gè)操作系統(tǒng)器仗。

下圖中融涣,第一扇區(qū)的主要開機(jī)記錄(MBR)中的開機(jī)管理程序提供了兩個(gè)選單:M1、M2青灼,M1 指向了 Windows 操作系統(tǒng)暴心,而 M2 指向其它分區(qū)的啟動(dòng)扇區(qū),里面包含了另外一個(gè)開機(jī)管理程序杂拨,提供了一個(gè)指向 Linux 的選單专普。

<div align="center"> <img src="../pics//f900f266-a323-42b2-bc43-218fdb8811a8.jpg" width="600"/> </div>

安裝多重引導(dǎo),最好先安裝 Windows 再安裝 Linux弹沽。因?yàn)榘惭b Windows 時(shí)會(huì)覆蓋掉主要開機(jī)記錄(MBR)檀夹,而 Linux 可以選擇將開機(jī)管理程序安裝在主要開機(jī)記錄(MBR)或者其它分區(qū)的啟動(dòng)扇區(qū),并且可以設(shè)置開機(jī)管理程序的選單策橘。

2. UEFI

BIOS 不可以讀取 GPT 分區(qū)表炸渡,而 UEFI 可以。

四丽已、文件系統(tǒng)

分區(qū)與文件系統(tǒng)

對(duì)分區(qū)進(jìn)行格式化是為了在分區(qū)上建立文件系統(tǒng)蚌堵。一個(gè)分區(qū)通常只能格式化為一個(gè)文件系統(tǒng),但是磁盤陣列等技術(shù)可以將一個(gè)分區(qū)格式化為多個(gè)文件系統(tǒng)。

組成

<div align="center"> <img src="../pics//BSD_disk.png" width="800"/> </div>

最主要的幾個(gè)組成部分如下:

  • inode:一個(gè)文件占用一個(gè) inode吼畏,記錄文件的屬性督赤,同時(shí)記錄此文件的內(nèi)容所在的 block 編號(hào);
  • block:記錄文件的內(nèi)容泻蚊,文件太大時(shí)躲舌,會(huì)占用多個(gè) block。

除此之外還包括:

  • superblock:記錄文件系統(tǒng)的整體信息性雄,包括 inode 和 block 的總量没卸、使用量、剩余量秒旋,以及文件系統(tǒng)的格式與相關(guān)信息等约计;
  • block bitmap:記錄 block 是否被使用的位域;

文件讀取

對(duì)于 Ext2 文件系統(tǒng)滩褥,當(dāng)要讀取一個(gè)文件的內(nèi)容時(shí)病蛉,先在 inode 中去查找文件內(nèi)容所在的所有 block炫加,然后把所有 block 的內(nèi)容讀出來瑰煎。

<div align="center"> <img src="../pics//83185315-793a-453a-a927-5e8d92b5c0ef.jpg"/> </div>

而對(duì)于 FAT 文件系統(tǒng),它沒有 inode俗孝,每個(gè) block 中存儲(chǔ)著下一個(gè) block 的編號(hào)酒甸。

<div align="center"> <img src="../pics//075e1977-7846-4928-96c8-bb5b0268693c.jpg"/> </div>

磁盤碎片

指一個(gè)文件內(nèi)容所在的 block 過于分散。

block

在 Ext2 文件系統(tǒng)中所支持的 block 大小有 1K赋铝,2K 及 4K 三種,不同的大小限制了單個(gè)文件和文件系統(tǒng)的最大大小。

大小 1KB 2KB 4KB
最大單一文件 16GB 256GB 2TB
最大文件系統(tǒng) 2TB 8TB 16TB

一個(gè) block 只能被一個(gè)文件所使用煮岁,未使用的部分直接浪費(fèi)了屉符。因此如果需要存儲(chǔ)大量的小文件,那么最好選用比較小的 block良哲。

inode

inode 具體包含以下信息:

  • 權(quán)限 (read/write/excute)盛卡;
  • 擁有者與群組 (owner/group);
  • 容量筑凫;
  • 建立或狀態(tài)改變的時(shí)間 (ctime)滑沧;
  • 最近一次的讀取時(shí)間 (atime);
  • 最近修改的時(shí)間 (mtime)巍实;
  • 定義文件特性的旗標(biāo) (flag)滓技,如 SetUID...;
  • 該文件真正內(nèi)容的指向 (pointer)棚潦。

inode 具有以下特點(diǎn):

  • 每個(gè) inode 大小均固定為 128 bytes (新的 ext4 與 xfs 可設(shè)定到 256 bytes)令漂;
  • 每個(gè)文件都僅會(huì)占用一個(gè) inode。

inode 中記錄了文件內(nèi)容所在的 block 編號(hào),但是每個(gè) block 非常小叠必,一個(gè)大文件隨便都需要幾十萬的 block外潜。而一個(gè) inode 大小有限,無法直接引用這么多 block 編號(hào)挠唆。因此引入了間接处窥、雙間接、三間接引用玄组。間接引用是指滔驾,讓 inode 記錄的引用 block 塊記錄引用信息。

<div align="center"> <img src="../pics//inode_with_signatures.jpg" width="600"/> </div>

目錄

建立一個(gè)目錄時(shí)俄讹,會(huì)分配一個(gè) inode 與至少一個(gè) block哆致。block 記錄的內(nèi)容是目錄下所有文件的 inode 編號(hào)以及文件名』继牛可以看出文件的 inode 本身不記錄文件名摊阀,文件名記錄在目錄中,因此新增文件踪蹬、刪除文件胞此、更改文件名這些操作與目錄的 w 權(quán)限有關(guān)。

日志

如果突然斷電跃捣,那么文件系統(tǒng)會(huì)發(fā)生錯(cuò)誤漱牵,例如斷電前只修改了 block bitmap,而還沒有將數(shù)據(jù)真正寫入 block 中疚漆。

ext3/ext4 文件系統(tǒng)引入了日志功能酣胀,可以利用日志來修復(fù)文件系統(tǒng)。

掛載

掛載利用目錄作為文件系統(tǒng)的進(jìn)入點(diǎn)娶聘,也就是說闻镶,進(jìn)入目錄之后就可以讀取文件系統(tǒng)的數(shù)據(jù)。

目錄配置

為了使不同 Linux 發(fā)行版本的目錄結(jié)構(gòu)保持一致性丸升,F(xiàn)ilesystem Hierarchy Standard (FHS) 規(guī)定了 Linux 的目錄結(jié)構(gòu)铆农。最基礎(chǔ)的三個(gè)目錄如下:

  • / (root, 根目錄)
  • /usr (unix software resource):所有系統(tǒng)默認(rèn)軟件都會(huì)安裝到這個(gè)目錄;
  • /var (variable):存放系統(tǒng)或程序運(yùn)行過程中的數(shù)據(jù)文件发钝。

<div align="center"> <img src="../pics//linux-filesystem.png" width=""/> </div>

五顿涣、文件

文件屬性

用戶分為三種:文件擁有者、群組以及其它人酝豪,對(duì)不同的用戶有不同的文件權(quán)限涛碑。

使用 ls 查看一個(gè)文件時(shí),會(huì)顯示一個(gè)文件的信息孵淘,例如 drwxr-xr-x. 3 root root 17 May 6 00:14 .config蒲障,對(duì)這個(gè)信息的解釋如下:

  • drwxr-xr-x:文件類型以及權(quán)限,第 1 位為文件類型字段,后 9 位為文件權(quán)限字段
  • 3:鏈接數(shù)
  • root:文件擁有者
  • root:所屬群組
  • 17:文件大小
  • May 6 00:14:文件最后被修改的時(shí)間
  • .config:文件名

常見的文件類型及其含義有:

  • d:目錄
  • -:文件
  • l:鏈接文件

9 位的文件權(quán)限字段中揉阎,每 3 個(gè)為一組庄撮,共 3 組,每一組分別代表對(duì)文件擁有者毙籽、所屬群組以及其它人的文件權(quán)限洞斯。一組權(quán)限中的 3 位分別為 r、w坑赡、x 權(quán)限烙如,表示可讀、可寫毅否、可執(zhí)行亚铁。

文件時(shí)間有以下三種:

  • modification time (mtime):文件的內(nèi)容更新就會(huì)更新;
  • status time (ctime):文件的狀態(tài)(權(quán)限螟加、屬性)更新就會(huì)更新徘溢;
  • access time (atime):讀取文件時(shí)就會(huì)更新。

文件與目錄的基本操作

1. ls

列出文件或者目錄的信息捆探,目錄的信息就是其中包含的文件然爆。

# ls [-aAdfFhilnrRSt] file|dir
-a :列出全部的文件
-d :僅列出目錄本身
-l :以長數(shù)據(jù)串行列出,包含文件的屬性與權(quán)限等等數(shù)據(jù)

2. cd

更換當(dāng)前目錄徐许。

cd [相對(duì)路徑或絕對(duì)路徑]

3. mkdir

創(chuàng)建目錄施蜜。

# mkdir [-mp] 目錄名稱
-m :配置目錄權(quán)限
-p :遞歸創(chuàng)建目錄

4. rmdir

刪除目錄,目錄必須為空雌隅。

rmdir [-p] 目錄名稱
-p :遞歸刪除目錄

5. touch

更新文件時(shí)間或者建立新文件。

# touch [-acdmt] filename
-a : 更新 atime
-c : 更新 ctime缸沃,若該文件不存在則不建立新文件
-m : 更新 mtime
-d : 后面可以接更新日期而不使用當(dāng)前日期恰起,也可以使用 --date="日期或時(shí)間"
-t : 后面可以接更新時(shí)間而不使用當(dāng)前時(shí)間,格式為[YYYYMMDDhhmm]

6. cp

復(fù)制文件趾牧。

如果源文件有兩個(gè)以上检盼,則目的文件一定要是目錄才行。

cp [-adfilprsu] source destination
-a :相當(dāng)于 -dr --preserve=all 的意思翘单,至于 dr 請(qǐng)參考下列說明
-d :若來源文件為鏈接文件吨枉,則復(fù)制鏈接文件屬性而非文件本身
-i :若目標(biāo)文件已經(jīng)存在時(shí),在覆蓋前會(huì)先詢問
-p :連同文件的屬性一起復(fù)制過去
-r :遞歸持續(xù)復(fù)制
-u :destination 比 source 舊才更新 destination哄芜,或 destination 不存在的情況下才復(fù)制
--preserve=all :除了 -p 的權(quán)限相關(guān)參數(shù)外貌亭,還加入 SELinux 的屬性, links, xattr 等也復(fù)制了

7. rm

刪除文件。

# rm [-fir] 文件或目錄
-r :遞歸刪除

8. mv

移動(dòng)文件认臊。

# mv [-fiu] source destination
# mv [options] source1 source2 source3 .... directory
-f : force 強(qiáng)制的意思圃庭,如果目標(biāo)文件已經(jīng)存在,不會(huì)詢問而直接覆蓋

修改權(quán)限

可以將一組權(quán)限用數(shù)字來表示,此時(shí)一組權(quán)限的 3 個(gè)位當(dāng)做二進(jìn)制數(shù)字的位剧腻,從左到右每個(gè)位的權(quán)值為 4拘央、2、1书在,即每個(gè)權(quán)限對(duì)應(yīng)的數(shù)字權(quán)值為 r : 4灰伟、w : 2、x : 1儒旬。

# chmod [-R] xyz dirname/filename

示例:將 .bashrc 文件的權(quán)限修改為 -rwxr-xr--袱箱。

# chmod 754 .bashrc

也可以使用符號(hào)來設(shè)定權(quán)限。

# chmod [ugoa]  [+-=] [rwx] dirname/filename
- u:擁有者
- g:所屬群組
- o:其他人
- a:所有人
- +:添加權(quán)限
- -:移除權(quán)限
- =:設(shè)定權(quán)限

示例:為 .bashrc 文件的所有用戶添加寫權(quán)限义矛。

# chmod a+w .bashrc

文件默認(rèn)權(quán)限

  • 文件默認(rèn)權(quán)限:文件默認(rèn)沒有可執(zhí)行權(quán)限发笔,因此為 666,也就是 -rw-rw-rw- 凉翻。
  • 目錄默認(rèn)權(quán)限:目錄必須要能夠進(jìn)入了讨,也就是必須擁有可執(zhí)行權(quán)限,因此為 777 制轰,也就是 drwxrwxrwx前计。

可以通過 umask 設(shè)置或者查看文件的默認(rèn)權(quán)限,通常以掩碼的形式來表示垃杖,例如 002 表示其它用戶的權(quán)限去除了一個(gè) 2 的權(quán)限男杈,也就是寫權(quán)限,因此建立新文件時(shí)默認(rèn)的權(quán)限為 -rw-rw-r--调俘。

目錄的權(quán)限

文件名不是存儲(chǔ)在一個(gè)文件的內(nèi)容中伶棒,而是存儲(chǔ)在一個(gè)文件所在的目錄中。因此彩库,擁有文件的 w 權(quán)限并不能對(duì)文件名進(jìn)行修改肤无。

目錄存儲(chǔ)文件列表,一個(gè)目錄的權(quán)限也就是對(duì)其文件列表的權(quán)限骇钦。因此宛渐,目錄的 r 權(quán)限表示可以讀取文件列表;w 權(quán)限表示可以修改文件列表眯搭,具體來說窥翩,就是添加刪除文件,對(duì)文件名進(jìn)行修改鳞仙;x 權(quán)限可以讓該目錄成為工作目錄寇蚊,x 權(quán)限是 r 和 w 權(quán)限的基礎(chǔ),如果不能使一個(gè)目錄成為工作目錄繁扎,也就沒辦法讀取文件列表以及對(duì)文件列表進(jìn)行修改了幔荒。

鏈接

# ln [-sf] source_filename dist_filename
-s :默認(rèn)是 hard link糊闽,加 -s 為 symbolic link
-f :如果目標(biāo)文件存在時(shí),先刪除目標(biāo)文件

<div align="center"> <img src="../pics//b8081c84-62c4-4019-b3ee-4bd0e443d647.jpg"/> </div>

1. 實(shí)體鏈接

在目錄下創(chuàng)建一個(gè)條目爹梁,記錄著文件名與 inode 編號(hào)右犹,這個(gè) inode 就是源文件的 inode。

刪除任意一個(gè)條目姚垃,文件還是存在念链,只要引用數(shù)量不為 0。

有以下限制:不能跨越文件系統(tǒng)积糯、不能對(duì)目錄進(jìn)行鏈接掂墓。

# ln /etc/crontab .
# ll -i /etc/crontab crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab

2. 符號(hào)鏈接

符號(hào)鏈接文件保存著源文件所在的絕對(duì)路徑,在讀取時(shí)會(huì)定位到源文件上看成,可以理解為 Windows 的快捷方式君编。

當(dāng)源文件被刪除了,鏈接文件就打不開了川慌。

可以為目錄建立鏈接吃嘿。

# ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab

獲取文件內(nèi)容

1. cat

取得文件內(nèi)容。

# cat [-AbEnTv] filename
-n :打印出行號(hào)梦重,連同空白行也會(huì)有行號(hào)兑燥,-b 不會(huì)

2. tac

是 cat 的反向操作,從最后一行開始打印琴拧。

3. more

和 cat 不同的是它可以一頁一頁查看文件內(nèi)容降瞳,比較適合大文件的查看。

4. less

和 more 類似蚓胸,但是多了一個(gè)向前翻頁的功能挣饥。

5. head

取得文件前幾行。

# head [-n number] filename
-n :后面接數(shù)字赢织,代表顯示幾行的意思

6. tail

是 head 的反向操作亮靴,只是取得是后幾行。

7. od

以字符或者十六進(jìn)制的形式顯示二進(jìn)制文件于置。

指令與文件搜索

1. which

指令搜索。

# which [-a] command
-a :將所有指令列出贞岭,而不是只列第一個(gè)

2. whereis

文件搜索八毯。速度比較快,因?yàn)樗凰阉鲙讉€(gè)特定的目錄瞄桨。

# whereis [-bmsu] dirname/filename

3. locate

文件搜索话速。可以用關(guān)鍵字或者正則表達(dá)式進(jìn)行搜索芯侥。

locate 使用 /var/lib/mlocate/ 這個(gè)數(shù)據(jù)庫來進(jìn)行搜索泊交,它存儲(chǔ)在內(nèi)存中乳讥,并且每天更新一次,所以無法用 locate 搜索新建的文件廓俭≡剖可以使用 updatedb 來立即更新數(shù)據(jù)庫。

# locate [-ir] keyword
-r:正則表達(dá)式

4. find

文件搜索研乒⌒谥遥可以使用文件的屬性和權(quán)限進(jìn)行搜索。

# find [basedir] [option]
example: find . -name "shadow*"

(一)與時(shí)間有關(guān)的選項(xiàng)

-mtime  n :列出在 n 天前的那一天修改過內(nèi)容的文件
-mtime +n :列出在 n 天之前 (不含 n 天本身) 修改過內(nèi)容的文件
-mtime -n :列出在 n 天之內(nèi) (含 n 天本身) 修改過內(nèi)容的文件
-newer file : 列出比 file 更新的文件

+4雹熬、4 和 -4 的指示的時(shí)間范圍如下:

<div align="center"> <img src="../pics//658fc5e7-79c0-4247-9445-d69bf194c539.png" width=""/> </div>

(二)與文件擁有者和所屬群組有關(guān)的選項(xiàng)

-uid n
-gid n
-user name
-group name
-nouser :搜索擁有者不存在 /etc/passwd 的文件
-nogroup:搜索所屬群組不存在于 /etc/group 的文件

(三)與文件權(quán)限和名稱有關(guān)的選項(xiàng)

-name filename
-size [+-]SIZE:搜尋比 SIZE 還要大 (+) 或小 (-) 的文件宽菜。這個(gè) SIZE 的規(guī)格有:c: 代表 byte,k: 代表 1024bytes竿报。所以铅乡,要找比 50KB 還要大的文件,就是 -size +50k
-type TYPE
-perm mode  :搜索權(quán)限等于 mode 的文件
-perm -mode :搜索權(quán)限包含 mode 的文件
-perm /mode :搜索權(quán)限包含任一 mode 的文件

六烈菌、壓縮與打包

壓縮文件名

Linux 底下有很多壓縮文件名阵幸,常見的如下:

擴(kuò)展名 壓縮程序
*.Z compress
*.zip zip
*.gz gzip
*.bz2 bzip2
*.xz xz
*.tar tar 程序打包的數(shù)據(jù),沒有經(jīng)過壓縮
*.tar.gz tar 程序打包的文件僧界,經(jīng)過 gzip 的壓縮
*.tar.bz2 tar 程序打包的文件侨嘀,經(jīng)過 bzip2 的壓縮
*.tar.xz tar 程序打包的文件,經(jīng)過 xz 的壓縮

壓縮指令

1. gzip

gzip 是 Linux 使用最廣的壓縮指令捂襟,可以解開 compress咬腕、zip 與 gzip 所壓縮的文件。

經(jīng)過 gzip 壓縮過葬荷,源文件就不存在了涨共。

有 9 個(gè)不同的壓縮等級(jí)可以使用。

可以使用 zcat宠漩、zmore举反、zless 來讀取壓縮文件的內(nèi)容。

$ gzip [-cdtv#] filename
-c :將壓縮的數(shù)據(jù)輸出到屏幕上
-d :解壓縮
-t :檢驗(yàn)壓縮文件是否出錯(cuò)
-v :顯示壓縮比等信息
-# : # 為數(shù)字的意思扒吁,代表壓縮等級(jí)火鼻,數(shù)字越大壓縮比越高,默認(rèn)為 6

2. bzip2

提供比 gzip 更高的壓縮比雕崩。

查看命令:bzcat魁索、bzmore、bzless盼铁、bzgrep粗蔚。

$ bzip2 [-cdkzv#] filename
-k :保留源文件

3. xz

提供比 bzip2 更佳的壓縮比。

可以看到饶火,gzip鹏控、bzip2致扯、xz 的壓縮比不斷優(yōu)化。不過要注意的是当辐,壓縮比越高抖僵,壓縮的時(shí)間也越長。

查看命令:xzcat瀑构、xzmore裆针、xzless、xzgrep寺晌。

$ xz [-dtlkc#] filename

打包

壓縮指令只能對(duì)一個(gè)文件進(jìn)行壓縮世吨,而打包能夠?qū)⒍鄠€(gè)文件打包成一個(gè)大文件。tar 不僅可以用于打包呻征,也可以使用 gip耘婚、bzip2、xz 將打包文件進(jìn)行壓縮陆赋。

$ tar [-z|-j|-J] [cv] [-f 新建的 tar 文件] filename...  ==打包壓縮
$ tar [-z|-j|-J] [tv] [-f 已有的 tar 文件]              ==查看
$ tar [-z|-j|-J] [xv] [-f 已有的 tar 文件] [-C 目錄]    ==解壓縮
-z :使用 zip沐祷;
-j :使用 bzip2;
-J :使用 xz攒岛;
-c :新建打包文件赖临;
-t :查看打包文件里面有哪些文件;
-x :解打包或解壓縮的功能灾锯;
-v :在壓縮/解壓縮的過程中兢榨,顯示正在處理的文件名;
-f : filename:要處理的文件顺饮;
-C 目錄 : 在特定目錄解壓縮吵聪。
使用方式 命令
打包壓縮 tar -jcv -f filename.tar.bz2 要被壓縮的文件或目錄名稱
查 看 tar -jtv -f filename.tar.bz2
解壓縮 tar -jxv -f filename.tar.bz2 -C 要解壓縮的目錄

七、Bash

可以通過 Shell 請(qǐng)求內(nèi)核提供服務(wù)兼雄,Bash 正是 Shell 的一種吟逝。

特性

  • 命令歷史:記錄使用過的命令
  • 命令與文件補(bǔ)全:快捷鍵:tab
  • 命名別名:例如 lm 是 ls -al 的別名
  • shell scripts
  • 通配符:例如 ls -l /usr/bin/X* 列出 /usr/bin 下面所有以 X 開頭的文件

變量操作

對(duì)一個(gè)變量賦值直接使用 =。

對(duì)變量取用需要在變量前加上 $ 赦肋,也可以用 ${} 的形式块攒;

輸出變量使用 echo 命令。

$ x=abc
$ echo $x
$ echo ${x}

變量?jī)?nèi)容如果有空格佃乘,必須使用雙引號(hào)或者單引號(hào)局蚀。

  • 雙引號(hào)內(nèi)的特殊字符可以保留原本特性,例如 x="lang is $LANG"恕稠,則 x 的值為 lang is zh_TW.UTF-8;
  • 單引號(hào)內(nèi)的特殊字符就是特殊字符本身扶欣,例如 x='lang is $LANG'鹅巍,則 x 的值為 lang is $LANG千扶。

可以使用 `指令` 或者 $(指令) 的方式將指令的執(zhí)行結(jié)果賦值給變量。例如 version=$(uname -r)骆捧,則 version 的值為 4.15.0-22-generic澎羞。

可以使用 export 命令將自定義變量轉(zhuǎn)成環(huán)境變量,環(huán)境變量可以在子程序中使用敛苇,所謂子程序就是由當(dāng)前 Bash 而產(chǎn)生的子 Bash妆绞。

Bash 的變量可以聲明為數(shù)組和整數(shù)數(shù)字。注意數(shù)字類型沒有浮點(diǎn)數(shù)枫攀。如果不進(jìn)行聲明括饶,默認(rèn)是字符串類型。變量的聲明使用 declare 命令:

$ declare [-aixr] variable
-a : 定義為數(shù)組類型
-i : 定義為整數(shù)類型
-x : 定義為環(huán)境變量
-r : 定義為 readonly 類型

使用 [ ] 來對(duì)數(shù)組進(jìn)行索引操作:

$ array[1]=a
$ array[2]=b
$ echo ${array[1]}

指令搜索順序

  • 以絕對(duì)或相對(duì)路徑來執(zhí)行指令来涨,例如 /bin/ls 或者 ./ls 图焰;
  • 由別名找到該指令來執(zhí)行;
  • 由 Bash 內(nèi)建的指令來執(zhí)行蹦掐;
  • 按 $PATH 變量指定的搜索路徑的順序找到第一個(gè)指令來執(zhí)行技羔。

數(shù)據(jù)流重定向

重定向指的是使用文件代替標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出卧抗。

1 代碼 運(yùn)算符
標(biāo)準(zhǔn)輸入 (stdin) 0 < 或 <<
標(biāo)準(zhǔn)輸出 (stdout) 1 > 或 >>
標(biāo)準(zhǔn)錯(cuò)誤輸出 (stderr) 2 2> 或 2>>

其中藤滥,有一個(gè)箭頭的表示以覆蓋的方式重定向,而有兩個(gè)箭頭的表示以追加的方式重定向社裆。

可以將不需要的標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到 /dev/null拙绊,相當(dāng)于扔進(jìn)垃圾箱。

如果需要將標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯(cuò)誤輸出同時(shí)重定向到一個(gè)文件浦马,需要將某個(gè)輸出轉(zhuǎn)換為另一個(gè)輸出时呀,例如 2>&1 表示將標(biāo)準(zhǔn)錯(cuò)誤輸出轉(zhuǎn)換為標(biāo)準(zhǔn)輸出。

$ find /home -name .bashrc > list 2>&1

八晶默、管線指令

管線是將一個(gè)命令的標(biāo)準(zhǔn)輸出作為另一個(gè)命令的標(biāo)準(zhǔn)輸入谨娜,在數(shù)據(jù)需要經(jīng)過多個(gè)步驟的處理之后才能得到我們想要的內(nèi)容時(shí)就可以使用管線。

在命令之間使用 | 分隔各個(gè)管線命令磺陡。

$ ls -al /etc | less

提取指令

cut 對(duì)數(shù)據(jù)進(jìn)行切分趴梢,取出想要的部分。切分過程一行一行地進(jìn)行币他。

$ cut
-d :分隔符
-f :經(jīng)過 -d 分隔后坞靶,使用 -f n 取出第 n 個(gè)區(qū)間
-c :以字符為單位取出區(qū)間

示例 1:last 顯示登入者的信息,取出用戶名蝴悉。

$ last
root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in
root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33)
root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16)

$ last | cut -d ' ' -f 1

示例 2:將 export 輸出的訊息彰阴,取出第 12 字符以后的所有字符串。

$ export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/dmtsai"
declare -x HOSTNAME="study.centos.vbird"
.....(其他省略).....

$ export | cut -c 12

排序指令

sort 進(jìn)行排序拍冠。

$ sort [-fbMnrtuk] [file or stdin]
-f :忽略大小寫
-b :忽略最前面的空格
-M :以月份的名字來排序尿这,例如 JAN簇抵,DEC
-n :使用數(shù)字
-r :反向排序
-u :相當(dāng)于 unique,重復(fù)的內(nèi)容只出現(xiàn)一次
-t :分隔符射众,默認(rèn)為 tab
-k :指定排序的區(qū)間

示例:/etc/passwd 文件內(nèi)容以 : 來分隔碟摆,要求以第三列進(jìn)行排序。

$ cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash
alex:x:1001:1002::/home/alex:/bin/bash
arod:x:1002:1003::/home/arod:/bin/bash

uniq 可以將重復(fù)的數(shù)據(jù)只取一個(gè)叨橱。

$ uniq [-ic]
-i :忽略大小寫
-c :進(jìn)行計(jì)數(shù)

示例:取得每個(gè)人的登錄總次數(shù)

$ last | cut -d ' ' -f 1 | sort | uniq -c
1
6 (unknown
47 dmtsai
4 reboot
7 root
1 wtmp

雙向輸出重定向

輸出重定向會(huì)將輸出內(nèi)容重定向到文件中典蜕,而 tee 不僅能夠完成這個(gè)功能,還能保留屏幕上的輸出罗洗。也就是說愉舔,使用 tee 指令,一個(gè)輸出會(huì)同時(shí)傳送到文件和屏幕上栖博。

$ tee [-a] file

字符轉(zhuǎn)換指令

tr 用來刪除一行中的字符屑宠,或者對(duì)字符進(jìn)行替換。

$ tr [-ds] SET1 ...
-d : 刪除行中 SET1 這個(gè)字符串

示例仇让,將 last 輸出的信息所有小寫轉(zhuǎn)換為大寫典奉。

$ last | tr '[a-z]' '[A-Z]'

col 將 tab 字符轉(zhuǎn)為空格字符。

$ col [-xb]
-x : 將 tab 鍵轉(zhuǎn)換成對(duì)等的空格鍵

expand 將 tab 轉(zhuǎn)換一定數(shù)量的空格丧叽,默認(rèn)是 8 個(gè)卫玖。

$ expand [-t] file
-t :tab 轉(zhuǎn)為空格的數(shù)量

join 將有相同數(shù)據(jù)的那一行合并在一起。

$ join [-ti12] file1 file2
-t :分隔符踊淳,默認(rèn)為空格
-i :忽略大小寫的差異
-1 :第一個(gè)文件所用的比較字段
-2 :第二個(gè)文件所用的比較字段

paste 直接將兩行粘貼在一起假瞬。

$ paste [-d] file1 file2
-d :分隔符,默認(rèn)為 tab

分區(qū)指令

split 將一個(gè)文件劃分成多個(gè)文件迂尝。

$ split [-bl] file PREFIX
-b :以大小來進(jìn)行分區(qū)脱茉,可加單位,例如 b, k, m 等
-l :以行數(shù)來進(jìn)行分區(qū)垄开。
- PREFIX :分區(qū)文件的前導(dǎo)名稱

九琴许、正則表達(dá)式

grep

g/re/p(globally search a regular expression and print),使用正則表示式進(jìn)行全局查找并打印溉躲。

$ grep [-acinv] [--color=auto] 搜尋字符串 filename
-c : 計(jì)算找到個(gè)數(shù)
-i : 忽略大小寫
-n : 輸出行號(hào)
-v : 反向選擇榜田,亦即顯示出沒有 搜尋字符串 內(nèi)容的那一行
--color=auto :找到的關(guān)鍵字加顏色顯示

示例:把含有 the 字符串的行提取出來(注意默認(rèn)會(huì)有 --color=auto 選項(xiàng),因此以下內(nèi)容在 Linux 中有顏色顯示 the 字符串)

$ grep -n 'the' regular_express.txt
8:I can't finish the test.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world Happy is the same with "glad".
18:google is the best tools for search keyword

因?yàn)?{ 和 } 在 shell 是有特殊意義的锻梳,因此必須要使用轉(zhuǎn)義字符進(jìn)行轉(zhuǎn)義箭券。

$ grep -n 'go\{2,5\}g' regular_express.txt

printf

用于格式化輸出。

它不屬于管道命令疑枯,在給 printf 傳數(shù)據(jù)時(shí)需要使用 $( ) 形式辩块。

$ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt)
    DmTsai    80    60    92    77.33
     VBird    75    55    80    70.00
       Ken    60    90    70    73.33

awk

是由 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 創(chuàng)造,awk 這個(gè)名字就是這三個(gè)創(chuàng)始人名字的首字母庆捺。

awk 每次處理一行古今,處理的最小單位是字段,每個(gè)字段的命名方式為:$n滔以,n 為字段號(hào),從 1 開始氓拼,$0 表示一整行你画。

示例 1:取出登錄用戶的用戶名和 ip

$ last -n 5
dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in
dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)
dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)
dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)
dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)

$ last -n 5 | awk '{print $1 "\t" $3}

可以根據(jù)字段的某些條件進(jìn)行匹配,例如匹配字段小于某個(gè)值的那一行數(shù)據(jù)桃漾。

$ awk '條件類型 1 {動(dòng)作 1} 條件類型 2 {動(dòng)作 2} ...' filename

示例 2:/etc/passwd 文件第三個(gè)字段為 UID坏匪,對(duì) UID 小于 10 的數(shù)據(jù)進(jìn)行處理。

$ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
bin 1
daemon 2

awk 變量:

變量名稱 代表意義
NF 每一行擁有的字段總數(shù)
NR 目前所處理的是第幾行數(shù)據(jù)
FS 目前的分隔字符撬统,默認(rèn)是空格鍵

示例 3:輸出正在處理的行號(hào)适滓,并顯示每一行有多少字段

$ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}'
dmtsai lines: 1 columns: 10
dmtsai lines: 2 columns: 10
dmtsai lines: 3 columns: 10
dmtsai lines: 4 columns: 10
dmtsai lines: 5 columns: 9

十、進(jìn)程管理

查看進(jìn)程

1. ps

查看某個(gè)時(shí)間點(diǎn)的進(jìn)程信息

示例一:查看自己的進(jìn)程

# ps -l

示例二:查看系統(tǒng)所有進(jìn)程

# ps aux

示例三:查看特定的進(jìn)程

# ps aux | grep threadx

2. top

實(shí)時(shí)顯示進(jìn)程信息

示例:兩秒鐘刷新一次

# top -d 2

3. pstree

查看進(jìn)程樹

示例:查看所有進(jìn)程樹

# pstree -A

4. netstat

查看占用端口的進(jìn)程

示例:查看特定端口的進(jìn)程

# netstat -anp | grep port

進(jìn)程狀態(tài)

<div align="center"> <img src="../pics//76a49594323247f21c9b3a69945445ee.png" width=""/> </div>

狀態(tài) 說明
R running or runnable (on run queue)
D uninterruptible sleep (usually I/O)
S interruptible sleep (waiting for an event to complete)
Z zombie (terminated but not reaped by its parent)
T stopped (either by a job control signal or because it is being traced)

SIGCHLD

當(dāng)一個(gè)子進(jìn)程改變了它的狀態(tài)時(shí):停止運(yùn)行恋追,繼續(xù)運(yùn)行或者退出凭迹,有兩件事會(huì)發(fā)生在父進(jìn)程中:

  • 得到 SIGCHLD 信號(hào);
  • waitpid() 或者 wait() 調(diào)用會(huì)返回苦囱。

<div align="center"> <img src="../pics//flow.png" width=""/> </div>

其中子進(jìn)程發(fā)送的 SIGCHLD 信號(hào)包含了子進(jìn)程的信息嗅绸,包含了進(jìn)程 ID、進(jìn)程狀態(tài)撕彤、進(jìn)程使用 CPU 的時(shí)間等鱼鸠。

在子進(jìn)程退出時(shí),它的進(jìn)程描述符不會(huì)立即釋放羹铅,這是為了讓父進(jìn)程得到子進(jìn)程信息蚀狰。父進(jìn)程通過 wait() 和 waitpid() 來獲得一個(gè)已經(jīng)退出的子進(jìn)程的信息。

wait()

pid_t wait(int *status)

父進(jìn)程調(diào)用 wait() 會(huì)一直阻塞职员,直到收到一個(gè)子進(jìn)程退出的 SIGCHLD 信號(hào)麻蹋,之后 wait() 函數(shù)會(huì)銷毀子進(jìn)程并返回。

如果成功廉邑,返回被收集的子進(jìn)程的進(jìn)程 ID哥蔚;如果調(diào)用進(jìn)程沒有子進(jìn)程,調(diào)用就會(huì)失敗蛛蒙,此時(shí)返回 -1糙箍,同時(shí) errno 被置為 ECHILD。

參數(shù) status 用來保存被收集的子進(jìn)程退出時(shí)的一些狀態(tài)牵祟,如果我們對(duì)這個(gè)子進(jìn)程是如何死掉的毫不在意深夯,只想把這個(gè)子進(jìn)程消滅掉,可以設(shè)置這個(gè)參數(shù)為 NULL:

pid = wait(NULL);

waitpid()

pid_t waitpid(pid_t pid, int *status, int options)

作用和 wait() 完全相同,但是多了兩個(gè)可由用戶控制的參數(shù) pid 和 options咕晋。

pid 參數(shù)指示一個(gè)子進(jìn)程的 ID雹拄,表示只關(guān)心這個(gè)子進(jìn)程的退出 SIGCHLD 信號(hào)。如果 pid=-1 時(shí)掌呜,那么和 wait() 作用相同滓玖,都是關(guān)心所有子進(jìn)程退出的 SIGCHLD 信號(hào)。

options 參數(shù)主要有 WNOHANG 和 WUNTRACED 兩個(gè)選項(xiàng)质蕉,WNOHANG 可以使 waitpid() 調(diào)用變成非阻塞的势篡,也就是說它會(huì)立即返回,父進(jìn)程可以繼續(xù)執(zhí)行其它任務(wù)模暗。

孤兒進(jìn)程

一個(gè)父進(jìn)程退出禁悠,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么這些子進(jìn)程將成為孤兒進(jìn)程兑宇。

孤兒進(jìn)程將被 init 進(jìn)程(進(jìn)程號(hào)為 1)所收養(yǎng)碍侦,并由 init 進(jìn)程對(duì)它們完成狀態(tài)收集工作。

由于孤兒進(jìn)程會(huì)被 init 進(jìn)程收養(yǎng)隶糕,所以孤兒進(jìn)程不會(huì)對(duì)系統(tǒng)造成危害瓷产。

僵尸進(jìn)程

一個(gè)子進(jìn)程的進(jìn)程描述符在子進(jìn)程退出時(shí)不會(huì)釋放,只有當(dāng)父進(jìn)程通過 wait() 或 waitpid() 獲取了子進(jìn)程信息后才會(huì)釋放若厚。如果子進(jìn)程退出拦英,而父進(jìn)程并沒有調(diào)用 wait() 或 waitpid(),那么子進(jìn)程的進(jìn)程描述符仍然保存在系統(tǒng)中测秸,這種進(jìn)程稱之為僵尸進(jìn)程疤估。

僵尸進(jìn)程通過 ps 命令顯示出來的狀態(tài)為 Z(zombie)。

系統(tǒng)所能使用的進(jìn)程號(hào)是有限的霎冯,如果大量的產(chǎn)生僵尸進(jìn)程铃拇,將因?yàn)闆]有可用的進(jìn)程號(hào)而導(dǎo)致系統(tǒng)不能產(chǎn)生新的進(jìn)程。

要消滅系統(tǒng)中大量的僵尸進(jìn)程沈撞,只需要將其父進(jìn)程殺死慷荔,此時(shí)所有的僵尸進(jìn)程就會(huì)變成孤兒進(jìn)程,從而被 init 所收養(yǎng)缠俺,這樣 init 就會(huì)釋放所有的僵死進(jìn)程所占有的資源显晶,從而結(jié)束僵尸進(jìn)程。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市崩掘,隨后出現(xiàn)的幾起案子七嫌,更是在濱河造成了極大的恐慌,老刑警劉巖苞慢,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诵原,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枉疼,警方通過查閱死者的電腦和手機(jī)皮假,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骂维,“玉大人,你說我怎么就攤上這事贺纲『焦耄” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵猴誊,是天一觀的道長潦刃。 經(jīng)常有香客問我,道長懈叹,這世上最難降的妖魔是什么乖杠? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮澄成,結(jié)果婚禮上胧洒,老公的妹妹穿的比我還像新娘。我一直安慰自己墨状,他們只是感情好卫漫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肾砂,像睡著了一般列赎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镐确,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天包吝,我揣著相機(jī)與錄音,去河邊找鬼源葫。 笑死诗越,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的臼氨。 我是一名探鬼主播掺喻,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了感耙?” 一聲冷哼從身側(cè)響起褂乍,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎即硼,沒想到半個(gè)月后逃片,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體观蜗,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡投慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了等曼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裂允。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡损离,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绝编,到底是詐尸還是另有隱情僻澎,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布十饥,位于F島的核電站窟勃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逗堵。R本人自食惡果不足惜秉氧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜒秤。 院中可真熱鬧汁咏,春花似錦、人聲如沸垦藏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掂骏。三九已至轰驳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弟灼,已是汗流浹背级解。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留田绑,地道東北人勤哗。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像掩驱,于是被迫代替她去往敵國和親芒划。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冬竟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 常用操作以及概念求助關(guān)機(jī)查看進(jìn)程查看端口PATH運(yùn)行等級(jí)sudoGNU包管理工具常見發(fā)行版本 分區(qū)磁盤的文件名分區(qū)...
    神奇的小蘑菇閱讀 382評(píng)論 0 1
  • 第一章 1.Linux是一套免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng),它可以基于Intel x86系列處理器以及Cy...
    yansicing閱讀 5,423評(píng)論 0 9
  • 本文包括: 1民逼、Linux 系統(tǒng)概述 2泵殴、Linux 用戶和用戶組管理 3、Linux 文件和目錄管理 4拼苍、Lin...
    廖少少閱讀 2,657評(píng)論 1 40
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言俊犯,發(fā)作 oo-boon-too 的音妇多。了解發(fā)音是有意...
    螢火蟲de夢(mèng)閱讀 99,260評(píng)論 9 467
  • 一天一天,皺紋橫生燕侠。 外表尤是如此砌梆,內(nèi)心又何嘗不是呢。 每天經(jīng)歷的事情贬循,既是鍛煉,也在心間漸漸磨出一層老繭桃序,難以被...
    桑巴利亞閱讀 162評(píng)論 0 0