《Linux私房菜》閱讀筆記整理
計算機的五大單元 - 輸入 輸出 CPU內部的控制單元和算數邏輯單元 內存javascript
central processing unitphp
主要做用,管理和運算 (算數邏輯單元,控制單元) - 前者負責程序運算和邏輯判斷 後者負責協調各個組件與各個單元之間的工做html
CPU的重點在與 運算和判斷,這些數據來自於內存. 內存則從輸入單元傳輸進來,CPU處理完畢以後先傳遞給內存,再從內存傳輸到輸出單元java
目前主流的CPU是雙核以上,本來的單核是指僅有一個運算單元,多核是指在一個CPU殼子裏裝了多個運算內核node
1 內部的微指令集linux
2 CPU的頻率 -- 每秒CPU的工做次數 這個數值越高 表明單位時間內能夠作更多的事情webpack
好比某款CPU頻率 3GHZ 則其每秒可進行 3 x 10的9次方 工做c++
爲了加速計算速度,CPU開發商就在CPU內部加上一個加速功能git
外頻 : CPU與外部組件進行數據傳輸,運算的頻率程序員
倍頻: CPU內部用來加速性能的一個倍數
二者相乘纔是CPU的頻率
好比 3GHZ的CPU設置爲超頻 能夠將外頻 333HZ 調整到 400 MHZ 這樣主板各個組件運行頻率增高 CPU能夠到達 3.6GHZ 可是可能形成死機
設計出一種人類能看懂的語言,而後創造一種「編譯器」來將人類寫的程序語言轉換爲機器語言,常見的編譯器語言,c c++
一組程序,用來管理計算機全部活動以及驅動系統中全部硬件
讓CPU開始判斷邏輯與運算數值,讓內存開始加載數據
以上就是操做系統的內核
硬件由內核管理,那想要去開發軟件,就須要去參考這個內核的先關功能,所以操做系統提供了一組開發接口出來
1 操做系統的內核是參考硬件規格寫的,因此同一個操做系統不能在不一樣的硬件架構下運行
2 應用程序的開發是參考操做系統提供的開發接口,因此該應用程序只能在該操做系統中運行
// 直接操做一個硬件設施 音箱 -- 請播放音樂 「黑白格」 // 使用內核 function play (music) { const target = '音箱' target.播放音樂(music) }
好比,window的軟件不能再Linux中運行
內核主要在於管理硬件,提供合理的資源分配,好比CPU資源 內存使用資源等
多任務環境 --- 一部計算機可能同時有不少工做在等待CPU運算處理,內核須要控制這些工做,讓CPU作有效分配
良好的CPU調度機制(CPU先讓那個工做開始運行),能夠加快總體系統性能
控制系統的內存
系統全部的程序代碼和數據都必需要先放在內存裏
好比數據輸入輸出 I/O
若是內核不認識某個文件系統,則沒法使用此格式的文件
CPU讀取的數據都來自與內存,無論是軟件程序仍是數據,都要先讀入內存才能夠被使用
我的計算機的內存爲
內存容量也很重要,由於數據要先存入內存中
通常內存越大 系統越快,由於不用釋放內存內部數據
存儲數據,實際的數據是寫在具備磁性物質的盤片上
什麼是Linux
linux 就是一套操做系統
計算機由一堆硬件設備組成,操做系統用戶管理控制這些硬件資源(內核)
不止如此,爲了程序員能夠更好的開發軟件,操做系統還提供了一組系統調用接口
Linux 提供了一個完整的操做系統中,最底層的硬件控制和資源管理的完整架構,這個是沿用Unix而來的,至關穩定且強大
linux 是操做系統最底層的內核以及其提供的內核管理工具,任何均可以獲取源碼並執行這個內核程序
隨着Linux使用者逐漸增多,能夠在Linux上運行的軟件也愈來愈多,Linux + 各類軟件 就能夠是一個至關完整的操做系統
爲了讓用戶能夠接觸到Linux,有人將 Linux 與可運行的軟件集成起來,加上 一個可讓用戶以光盤或者網絡直接安裝或者管理Linux系統,咱們稱這一整套 可徹底安裝的系統爲 Linux distribution --- 可徹底安裝套件
red hat - 紅帽子
ubuntu -- 無班圖
centos
lsb_release -a
每個組件或者設備在Linux下都是一個文件
主要有 盤片 機械手臂 主軸馬達組成
最簡單的分區: 區分根目錄 與內存交換空間 swap 便可
稍微麻煩一點:將一些讀寫頻繁的重要目錄,與根目錄獨立出來,好比 /, /usr, /var 等
內存交換空間是指?
當有數據被存放在物理內存中,可是這些數據不是常被CPU所取用,那麼這些不常被使用的程序將會被丟到硬盤的swap交換空間中,而將速度較快的物理內存空間釋放出來給真正須要的程序使用
因此若是系統不忙,內存又打,就不須要swap了
commond [option]
命令 | 含義 |
---|---|
date | 獲取日期 |
cal | 獲取日曆 |
bc | 進入計算器模式 |
只是輸入 cal 是展現當前月份的日曆
cal // 當前月份 cal 2018 // 2018的全部月 cal 8 2018 // 2018 8月
輸入 quit 而後回車 能夠自動退出計算器模式
好比想查看關於date 命令的一些信息
man date
看下第一行這裏是個 DATE(1)
這裏的數字含義是 (這裏列幾個常見的)
數字 | 含義 |
---|---|
1 | 用戶在shell環境中可操做的命令或者更可執行的文件 |
4 | 設備文件 |
5 | 配置文件或者是某些文件的格式 |
8 | 系統管理員可用的管理命令 |
另一種在線求助命令 info page
關機 shutdown
數據同步寫入硬盤 sync
重啓 reboot halt poweroff
數據在計算機中運行的模式: 全部的數據都得要被讀入內存後纔可以被CPU所處理,可是數據又經常須要由內存寫回硬盤當中(例如儲存的動做)。 因爲硬盤的速度太慢(相對於內存來講),若是經常讓數據在內存與硬盤中來回寫入/讀出,系統的效能就不會太好
所以在Linux系統中,爲了加快數據的讀取速度,因此在默認的狀況中, 某些已經加載內存中的數據將不會直接被寫回硬盤,而是先緩存在內存當中,如此一來, 若是一個數據被你重複的改寫,那麼因爲他還沒有被寫入硬盤中,所以能夠直接由內存當中讀取出來, 在速度上必定是快上至關多的!
不過,如此一來也形成些許的困擾,那就是萬一你的系統由於某些特殊狀況形成不正常關機 (例如停電或者是不當心踢到power)時,因爲數據還沒有被寫入硬盤當中,會形成數據不正常啦! 那要怎麼辦呢?這個時候就須要sync這個命令來進行數據的寫入動做啦! 直接在文字接口下輸入sync,那麼在內存中還沒有被升級的數據,就會被寫入硬盤中!因此,這個命令在系統關機或從新啓動以前,最好多運行幾回
目前的 shutdown/reboot/halt 等等命令均已經在關機前進行了 sync 命令
文件權限與目錄配置
文件全部者、用戶組、其餘人
系統中全部的賬號與通常身份使用者,以及root的相關信息, 都是記錄在/etc/passwd文件中,每一個人的密碼則是記錄在/etc/shadow文件中,此外,全部的組羣名稱記錄在/etc/group文件中
Linux系統是一個多用戶多任務的分時操做系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個帳號,而後以這個帳號的身份進入系統
每一個用戶都有一個用戶組,系統能夠對一個用戶組中的全部用戶進行集中管理。不一樣Linux 系統對用戶組的規定有所不一樣,如Linux下的用戶屬於與它同名的用戶組,這個用戶組在建立用戶時同時建立
ls 顯示文件的文件名和相關屬性
al 列出文件詳細的權限的屬性
-rw-r--r-- 1 zhengzaijiazai staff 66 4 25 10:21 .gitignore drwxr-xr-x 2 zhengzaijiazai staff 68 4 25 11:32 dist
d rwx r-x r-x
按照 1 3 3 3 的格式進行拆分
命令 | 含義 |
---|---|
d | 第一個字符 表明這個是目錄 文件 或者 連接文件等 |
rwx | 文件全部者的權限 |
r-x | 文件同用戶組的權限 |
r-x | 其餘非本用戶的權限 |
r (read)可讀 w (write) 可寫 x (execute)可執行
r 表明是否能查看文件的內容
w 表明可否對文件的內容進行操做,可是不能刪除文件
x 表明可否被系統執行
目錄的主要內容是記錄文件名列表
r 表示能夠讀取目錄結構列表
w 表示具備更改目錄列表的權限
w權限對於文件的含義 |
---|
建立新的文件與目錄 |
刪除文件和目錄(無論文件權限) |
將已存在的文件與目錄重命名 |
移動文件,目錄位置 |
總而言之,目錄的w權限與該目錄下的文件名變更有關係
x 表示用戶可否進入目錄 好比cd 進入此目錄
有一個目錄權限爲
drwxr--r-- 3 root root .......
當前系統帳號爲 userA userA不屬於root組 那麼 userA 對於這個帳戶有什麼權限, 能切換到此目錄中嗎
userA 具備 讀的權限
而進行目錄切換是須要X的權限 因此不能夠切換到此目錄
命令 | 含義 |
---|---|
chgrp xxx filename | 改變文件所屬用戶組 |
chown xxx filename | 改變文件全部者 |
chmod xxx filename | 改變文件的權限 |
要改的那個組必須在 /etc/group 中存在 不然會報錯
chgrp read.md groupB
要改的那個用戶必須在 /etc/passwd 中有記錄 不然會報錯
chown read.md userB
使用分數也能夠表明權限
命令 | 分數 |
---|---|
r | 4 |
w | 2 |
x | 1 |
rwx 7
rw- 6
r-x 5
有三種身份,就用 u g o 表明三種身份的權限
身份 | 字符 |
---|---|
用戶 | u |
用戶組 | g |
其餘人 | o |
全部身份 | a |
命令 | 含義 |
---|---|
+ | 增長 |
- | 減去 |
= | 設置 |
好比 須要設置一個文件的權限爲 -rwxr-xr-x
則u 爲rwx g/o 爲 r-x
chmod u=rwx,go=rx readme.md
// 若是是給每一身份增長 w 權限 chmod a+w read.md
任何設備都是文件
使用 ls -l 中第一個字符就是文件種類
ls -al 所顯示出來的屬性方面,第一個字符爲 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的內容,又大略能夠分爲:純文本 二進制文件 數據格式文件
好比: 快捷方式
與 window中的有很大不一樣
在Windows底下, 能被執行的文件擴展名一般是 .com .exe .bat等等,而在Linux底下,只要你的權限當中具備x的話,例如[ -rwx-r-xr-x ] 即表明這個文件能夠被執行
一般咱們仍是會以適當的擴展名來表示該文件是什麼種類的。底下有數種經常使用的擴展名:
1 .sh : 腳本或批處理文件 (scripts),由於批處理文件爲使用shell寫成的,因此擴展名就編成 .sh ;
2 .Z, .tar, .zip : 通過打包的壓縮文件。這是由於壓縮軟件分別爲 gunzip, tar 等等的,因爲不一樣的壓縮軟件,而取其相關的擴展名
3 .html, .php:網頁相關文件,分別表明 HTML 語法與 PHP 語法的網頁文件
基本上,Linux系統上的文件名真的只是讓你瞭解該文件可能的用途而已, 真正的執行與否仍然須要權限的規範才行
例如雖然有一個文件爲可執行文件, 如常見的/bin/ls這個顯示文件屬性的指令,不過,若是這個文件的權限被修改爲沒法執行時, 那麼ls就變成不能執行
爲何每套Linux distributions他們的配置文件啊、執行文件啊、每一個目錄內放置的咚咚啊,其實都差很少? 原來是有一套標準依據的
Linux來開發產品或distributions的社羣/公司與我的實在太多了,若是每個人都按照本身的標準去配置文件目錄,可能有管理上的困擾
FHS 用於規範每一個特定目錄下應該要放置什麼數據
FHS針對目錄樹定義了三個目錄下應該放置什麼數據
目錄 | 含義 |
---|---|
/ (root 根目錄) | 與開機系統有關係 |
/usr | 與軟件的安裝、執行有關係 |
/var | 與系統運做過程有關係 |
usr (UNIX Software Resource)Unix操做系統軟件資源
FHS 定義(/)根目錄下須要有如下目錄
目錄 | 文件內容 |
---|---|
/bin | 執行文件,在/bin 下的命令 能夠被root和通常帳號使用,好比 cat cp等 |
/etc | 系統主要配置文件,例如帳號密碼文件,何種服務的啓示文件 |
/tmp | 正在執行的程序放置文件的地方 FHS建議在開機時將 /tmp下的數據刪除 |
/usr
是系統默認的軟件安裝目錄
下面比較常見的目錄
目錄 | 文件內容 |
---|---|
/bin | 用戶可以使用的命令 |
/var
在系統安裝以後,會慢慢佔用硬盤容量
Q: 請問在 /bin 與 /usr/bin 有什麼不一樣
A:
/bin是系統的一些指令
bin爲binary的簡寫主要放置一些系統的必備執行檔例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等
/usr/bin 是你在後期安裝的一些軟件的運行腳本
主要放置一些應用軟體工具的必備執行檔例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m四、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等
由根目錄開始寫起的文件名或者目錄
相對於當前路徑
~ 表明當前用戶的家目錄 或者 使用cd 回車 也能夠進入
/ 表明根目錄
標誌 | 含義 |
---|---|
. | 本層目錄 |
.. | 上一層目錄 |
- | 前一個工做目錄 |
Q: 請問在Linux的根目錄,有沒有上層目錄 (..) 的存在
A:
用普通用戶身份看下
用root身份看一下
命令 | 含義 | |
---|---|---|
cd | 切換目錄 change directory | |
pwd | 顯示當前目錄 | |
mkdir | 建立新目錄 | |
rmdir | 刪除空目錄 | |
cp | 複製 | |
mv | 移動 | 重命名文件與目錄 |
mkdir 只能一層一層的建立目錄, 如何一次性建立多層目錄 -- 藉助 -p 參數
mkdir -p webpack/w1-code/dist
rmdir config
只能刪除一個空目錄
若是要強制刪除一個非空目錄及它下面的所有
rm -r node_modules
ls -a // 顯示所有,連同隱藏的文件
// 將某一個文件移動到文件夾中 mv mian.js newdir // 重命名文件夾 mv oldDir newdir
複製文件須要有 r (可讀) 權限
// 複製index 文件到 當前位置 cp ./config/index.js .
默認條件中,cp的源文件與目的文件權限不一樣,目的文件的全部者是命令操做者自己
判斷文件是二進制文件?數據文件?
查詢命令所在的文件
which ifconfig
which 默認查找的是 PATH 內的目錄
命令 | 含義 |
---|---|
cat | 查看內容 |
cat -n | 查看內容 顯示行號 |
cat -b | 查看內容 顯示行號 【空白部分不算行號】 |
nl 能夠將輸出的內容自動加上行號 默認結果與cat -n有點相似
-b 命令 | 含義 |
---|---|
a | 空行也添加行號 |
t | 空行不添加行號 |
-n 命令 | 含義 |
---|---|
ln | 行號在左側顯示 |
rn | 行號在右側顯示 不加0 |
rz | 行號在右側顯示 加0 |
nl index.js nl -b a index.js 空行也添加行號
前面提到的nl cat 是一次性將全部內容展現到命令行 more 則是 有翻頁功能
more index.js
-n 命令 | 含義 |
---|---|
空格 | 向下翻一頁 |
enter 或者 向下鍵 | 向下滾動一行 |
q | 退出顯示 |
按下 / 而後輸入 要查找的字符 [可是沒有發現有任何高亮提示]
less 的用法要比more 增長了向上翻頁功能
less index.js
按下 / 而後輸入 要查找的字符 [向下查詢]
按下 ? 而後輸入 要查找的字符 [向上查詢]
選取數據展現幾行
head [-n number] filename
number 表示展現幾行 默認展現前10行
tail [-n number] filename
number 表示展現幾行 默認展現最後10行
獲取第 100 到 120 行
cat filename | head -n 120 | tail -n +100
從 100 行開始 顯示 50行
cat filename | tail -n +100 | head -n 50
tail -n +100:從100行開始顯示,顯示100行之後的
當新建一個文件時,它的默認權限和umask有關係
umask是用來指定當前用戶在新建目錄或文件時的權限預設值,具體來講,umask值只是一個掩碼,它從建立文件時的默認權限中掩去對應位置的權限
0022 以數字形式表示權限
能夠看到這裏有四組權限,第一組是特殊權限使用的,咱們平時只須要後面三個就能夠了
u=rwx 以符號類型表示權限
在默認權限的屬性,文件和目錄是不一樣的
Q: 假設用戶的umask是 003 則當其新建一個文件或者文件夾 的權限是什麼
A: 也就是去掉的權限是 other的 寫 w 與 x
文件 rw-rw-r--
文件夾 rwxrxwr--
設置 umask
umask 002
find [指定路徑] [指定條件] [指定動做]
默認會查找當前目錄及子目錄,把查找結果輸出到屏幕上
關於文件的三個時間參數
modification time (mtime): 當該文件的『內容數據』變動時,就會升級這個時間!內容數據指的是文件的內容,而不是文件的屬性或權限
status time (ctime):當該文件的『狀態 (status)』改變時,就會升級這個時間,舉例來講,像是權限與屬性被更改了,都會升級這個時間
access time (atime):當『該文件的內容被取用』時,就會升級這個讀取時間 (access)。舉例來講,咱們使用 cat 去讀取 /etc/man.config , 就會升級該文件的 atime
在默認的狀況下,ls 顯示出來的是該文件的 mtime ,也就是這個文件的內容上次被更動的時間
ls -l —time=ctime test.conf
![important]](https://user-gold-cdn.xitu.io...
條件 | 內容 |
---|---|
可以使用命令 | cd等切換工做目錄 |
目錄所需權限 | x 要有可執行的權限 |
條件 | 內容 |
---|---|
可以使用命令 | cat more less tail head 等 |
目錄所需權限 | x 要有可執行的權限 |
文件所需權限 | r 要有可讀的權限 |
條件 | 內容 |
---|---|
可以使用命令 | vi vim 等 |
目錄所需權限 | x 要有可執行的權限 |
文件所需權限 | r w 要有可讀可寫的權限 |
條件 | 內容 |
---|---|
可以使用命令 | touch 等 |
目錄所需權限 | w x 要有可讀可執行的權限 |
爲何在任何地方均可以執行 ls 這個命令呢 -- 環境變量 PATH
系統會依照PATH的設置去每一個定義PATH的目錄下查詢文件名爲ls的可執行文件,若是在PATH定義的目錄中含有多個文件名爲ls的可執行文件,那麼先查詢的同名命令則先被執行
1 ls 是一個可執行文件
2 根源在 /bin/ls (也就是執行ls 與執行 /bin/ls 是一樣的效果)
3 問題變爲,爲何隨時能夠執行 /bin/ls 這個文件
4 系統按照 PATH 的設置每個 path的定義目錄下 查詢名爲ls的可執行文件
5 先找到的被執行
不一樣身份的 默認的path 不一樣,默認可以隨意運行的命令也不一樣(如root與vbird)
PATH是能夠修改的
Linux最傳統的磁盤文件系統(filesystem)使用的是EXT2
磁盤分區指的是告訴操做系統 這個磁盤在此分割槽能夠存取的區域是由 A 磁柱到 B 磁柱之間的區塊
如此一來操做系統就可以知道他能夠在所指定的區塊內進行文件數據的讀/寫/搜尋等動做了。 也就是說,磁盤分區意即指定分割槽的啓始與結束磁柱
磁盤在作分區以後還須要格式化,這是由於每種操做系統所配置的文件屬性/權限並不相同, 爲了存放這些文件所需的數據,所以就須要將分區進行格式化,以成爲操做系統可以利用的文件系統格式
這與操做系統的文件數據有關。較新的操做系統的文件數據除了文件實際內容外, 一般含有很是多的屬性
例如 Linux 操做系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。 文件系統一般會將這兩部份的數據分別存放在不一樣的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中
另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的總體信息,包括 inode 與 block 的總量、使用量、剩餘量等
屬性 | 含義 |
---|---|
inode | 記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的 block 號碼 |
block | 實際記錄文件的內容,若文件太大時,會佔用多個 block |
superblock | 記錄此 filesystem 的總體信息,包括inode/block的總量、使用量、剩餘量, 以及文件系統的格式與相關信息等 |
inode 的內容在記錄文件的權限與相關屬性,至於 block 區塊則是在記錄文件的實際內容
而文件系統一開始就將 inode 與 block 規劃好了,除非從新格式化,不然 inode 與 block 固定後就再也不變更
Ext2 文件系統在格式化的時候基本上是區分爲多個區塊羣組 (block group) 的,每一個區塊羣組都有獨立的 inode/block/superblock 系統
data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了
1 原則上,block 的大小與數量在格式化完就不可以再改變了(除非從新格式化)
2 每一個 block 內最多隻可以放置一個文件的數據
3 承上,若是文件大於 block 的大小,則一個文件會佔用多個 block 數量
4 承上,若文件小於 block ,則該 block 的剩餘容量就不可以再被使用了(磁盤空間會浪費)
Q: 假設你的Ext2文件系統使用 4KB de block ,而該文件系統中有 10000 個小文件,每一個文件大小均爲 50 bytes, 請問此時你的磁盤浪費多少容量?
A:
4kb = 4 * 1024 bytes = 4096 bytes
因此每個會浪費 4096 - 50 bytes
因此公共會是 4046 * 10000 bytes = 38.585666 = 38.6MB
當咱們在 Linux 下的 ext2 文件系統建立一個目錄時, ext2 會分配一個 inode 與至少一塊 block 給該目錄
其中,inode 記錄該目錄的相關權限與屬性,並可記錄分配到的那塊 block 號碼
而 block 則是記錄在這個目錄下的文件名與該文件名佔用的 inode 號碼數據
當咱們在 Linux 下的 ext2 建立一個通常文件時, ext2 會分配一個 inode 與相對於該文件大小的 block 數量給該文件
例如:假設個人一個 block 爲 4 Kbytes ,而我要建立一個 100 KBytes 的文件,那麼 linux 將分配一個 inode 與 25 個 block 來儲存該文件
inode 自己並不記錄文件名,文件名的記錄是在目錄的 block 當中。 所以在第六章文件與目錄的權限說明中, 咱們纔會提到『新增/刪除/改名文件名與目錄的 w 權限有關』
由於文件名是記錄在目錄的 block 當中, 所以當咱們要讀取某個文件時,就務必會通過目錄的 inode 與 block ,而後纔可以找到那個待讀取文件的 inode 號碼, 最終纔會讀到正確的文件的 block 內的數據
全部的數據都得要加載到內存後 CPU 纔可以對該數據進行處理
想想,若是你經常編輯一個好大的文件, 在編輯的過程當中又頻繁的要系統來寫入到磁盤中,因爲磁盤寫入的速度要比內存慢不少, 所以你會經常耗在等待硬盤的寫入/讀取上
爲了解決這個效率的問題, Linux 使用的方式是透過一個稱爲異步處理 (asynchronously) 的方式
當系統加載一個文件到內存後,若是該文件沒有被更動過,則在內存區段的文件數據會被配置爲乾淨(clean)的。 但若是內存中的文件數據被更改過了(例如你用 nano 去編輯過這個文件),此時該內存中的數據會被配置爲髒的 (Dirty)。此時全部的動做都還在內存中運行,並無寫入到磁盤中! 系統會不定時的將內存中配置爲『Dirty』的數據寫回磁盤,以保持磁盤與內存數據的一致性
因爲內存的速度要比硬盤快的多,所以若是可以將經常使用的文件放置到內存當中,這樣就會大大提高系統性能
1 系統會將經常使用的文件數據放置到主存儲器的緩衝區,以加速文件系統的讀/寫
2 承上,所以 Linux 的物理內存最後都會被用光!這是正常的狀況!可加速系統效能
3 你能夠手動使用 sync 來強迫內存中配置爲 Dirty 的文件回寫到磁盤中
4 若正常關機時,關機命令會主動呼叫 sync 來將內存的數據回寫入磁盤內
5 不正常關機(如跳電、死機或其餘不明緣由),因爲數據還沒有回寫到磁盤內, 所以從新啓動後可能會花不少時間在進行磁盤檢驗,甚至可能致使文件系統的損毀(非磁盤損毀)
文件系統與目錄樹的結合操做稱之爲掛載 掛載點必定是目錄 這樣才能使用文件系統
磁盤的總體數據是在 superblock 區塊中,可是每一個各別文件的容量則在 inode 當中記載的
命令 | 含義 |
---|---|
df | 列出文件系統的總體磁盤使用量 |
du | 評估文件系統的磁盤使用量(經常使用在推估目錄所佔容量) |
因爲 df 主要讀取的數據幾乎都是針對一整個文件系統,所以讀取的範圍主要是在 Superblock 內的信息, 因此這個命令顯示結果的速度很是的快速
與 df 不同的是,du 這個命令其實會直接到文件系統內去搜尋全部的文件數據
在默認的狀況下,容量的輸出是以 KB 來設計的, 若是你想要知道目錄佔了多少 MB ,那麼就使用 -m 這個參數便可
新建一個文件名 連接到 某個inode 號碼
Symbolic link 就是在建立一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的文件名
ln [-sf] 源文件 目標文件 // 不添加參數就是 hard link // 添加參數 -s 就是 symbolic link // f 若是目標文件存在 則先刪除後再建立
vi 文本編輯器 vim 程序開發工具
vi 共分爲三種模式,分別是『通常模式』、『編輯模式』與『指令列命令模式』
以 vi 打開一個檔案就直接進入通常模式了(這是默認的模式)
通常模式當中, 按下『i, I, o, O, a, A, r, R』等任何一個字母以後會進入編輯模式
通常模式當中,輸入『 : / ? 』三個中的任何一個按鈕,就能夠將光標移動到最底下那一行
須要計算機輸出音樂,這個過程須要什麼支持呢
1 硬件
須要你的硬件有聲卡芯片
2 內核管理
須要操做系統的內核能夠支持這個芯片組 還有芯片的驅動程序
3 應用程序
須要用戶輸入播放聲音的指令
以上三點是一個簡單的輸出聲音的步驟。就是用戶須要輸出一個命令,硬件纔會執行這個命令來工做。而硬件如何知道你所執行的命令呢,那就是內核的控制工做了
咱們須要經過shell將輸入的命令與內核進行通訊,這樣內核就能夠控制硬件來工做
操做系統是一組軟件,這組軟件在控制硬件與管理系統的活動監測。若是這組軟件能被用戶隨意操做會致使系統崩潰。
因此不能讓用戶隨意去使用。所以產生了一種在操做系統上的應用程序->shell
其實shell的功能只是提供用戶操做系統的一個接口,所以這個shell須要能夠調用其餘軟件。
簡而言之,只要可以操做應用程序的接口,都叫作shell
Linux有多種shell, 能夠看下 /etc/shells
各家的shell功能差很少,可是在某些語法執行方面不一樣。
Linux默認使用的是 bash
爲何咱們系統上合法的 shell 要寫入 /etc/shells 這個文件啊? 這是由於系統某些服務在運行過程當中,會去檢查使用者可以使用的 shells ,而這些 shell 的查詢就是藉由 /etc/shells 這個文件
我這個使用者何時能夠取得 shell 來工做呢?還有, 我這個使用者默認會取得哪個 shell ?
當我登錄的時候,系統就會給我一個 shell 讓我來工做了。 而這個登錄取得的 shell 就記錄在 /etc/passwd 這個文件內
bash 的幾個優勢
1 命令記憶功能
『上下鍵』能夠追溯命令
~/.bash_history 記錄的是前一次登錄之前所運行過的命令, 而至於這一次登錄所運行的命令都被緩存在內存中,當你成功的註銷系統後,該命令記憶纔會記錄到 .bash_history 當中
2 命令與文件補全功能
tab 鍵
3 命名別名設置功能
查詢 alias
設置 alias lm=‘ls -al’
4 做業控制,前臺,後臺控制
5 程序腳本
當登陸到Linux後,會依據/etc/passwd 文件的設置來給一個shell(默認bash) 而後就能夠依據上面的命令操做 shell
內部命令:由 bash 內置的命令
外部命令:來字外部的命令,非 bash 內置
查詢一個命令是外部的仍是bash內置的呢? -- type
能夠看到 cd 這個命令是bash的內置命令
Linux是多用戶,多任務的環境,每一個人在登陸以後都會有一個bash。
顯示當前使用的shell,能夠輸入:
echo $SHELL
那麼因爲在 Linux System 下面,全部的線程都是須要一個運行碼, 『真正以 shell 來跟 Linux 溝通,是在正確的登錄 Linux 以後』這個時候你就有一個 bash 的運行程序,也才能夠真正的經由 bash 來跟系統溝通
而在進入 shell 以前,也正如同上面提到的,因爲系統須要一些變量來提供他數據的存取 (或者是一些環境的配置參數值, 例如是否要顯示彩色等等的) ,因此就有一些所謂的『環境變量』 須要來讀入系統中了!這些環境變量例如 PATH、HOME、MAIL、SHELL 等等
變量在顯示的時候,前面必須帶着 $ 符號
echo $PATH echo ${PATH} cd $work
workdir='workapce/mxx'
變量的設置規則 |
---|
變量名稱只能是字母與數字,但開頭不能爲數字 |
雙引號內的特殊字符能夠保留原特性,好比$ 可正確讀取字符串中的變量,單引號則不會 |
name="my name is $USER" echo $name // mu name is tom <!-- 若是是單引號 --> name='my name is $USER' echo $name // mu name is $USER
unset workdir
Q: 設置一個 變量表明 工做目錄
在父進程中定義的變量是沒法在子進程中使用的,好比你定義了這個變量,而後再從新發開一個進程,是讀不到這個變量的
不過經過export將此變量設置爲環境變量就能夠使用了
好比,定義變量 TRYPATH=/HOME/EORK
寫一個腳本
echo $TRYPATH, 123
而後在當前進程中執行 sh test.sh
控制檯無輸出
若是 export TRYPATH=/HOME/EORK
就有信息輸出了
查詢當前有哪些環境變量,能夠使用兩個命令 env export
查詢到目前shell環境下全部的環境變量
shell不僅是有環境變量,還有各類自定義的變量
set查詢全部的變量
環境變量和自定義變量二者的差別在於 是否能夠被子進程使用
子進程會繼承父級進程的環境變量,不會繼承父進程的自定義變量
export 能夠將自定義變量轉爲環境變量
export // export WORKDIR=$WORKDIR:workspace/blued-shopping/blued-shop
能夠看到目前全部的環境變量
當你登錄 Linux 並取得一個 bash 以後,你的 bash 就是一個獨立的程序,被稱爲 PID 的就是。 接下來你在這個 bash 底下所下達的任何命令都是由這個 bash 所衍生出來的,那些被下達的命令就被稱爲子程序了。
1 當建立一個shell時候,操做系統會分配一個記憶塊給shell使用,此內存的變量能夠給子進程使用
2 在父進程使用了 export ,就能夠將自定義的變量寫到上面的那個記憶塊中
3 當加載另外一個shell的時候(啓動子進程,要離開父進程了)子shell能夠將父shell的那個記憶塊導入本身的環境變量塊中
Linux 主機裏面同時登錄了十我的,這十我的不知怎麼搞的, 同時開啓了 100 個文件,每一個文件的大小約 10MBytes ,
請問一下, 個人 Linux 主機的內存要有多大才夠? 1010010 = 10000 MBytes = 10GBytes ... 內存佔用量很大,因此能夠限制這個大小
bash 能夠限制用戶的某些系統資源,好比文件打開數量,可用的CPU時間,可用內存總量等 ,這些經過 ulimit 進行設置
參數解析 | 含義 |
---|---|
unlimited | 無限制 |
0 | 無限制 |
查看歷史命令
history history 10 history -w // 寫入 ~./bash_history
歷史命令的讀取與記錄是這樣的:
以 bash 登錄 Linux 主機以後,系統會主動的由家目錄的 ~/.bash_history 讀取之前曾經下過的命令,那麼 ~/.bash_history 會記錄幾筆數據呢?這就與你 bash 的 HISTFILESIZE 這個變量配置值有關了!
假設我此次登錄主機後,共下達過 100 次命令,『等我註銷時, 系統就會將 101~1100 這總共 1000 筆歷史命令升級到 ~/.bash_history 當中。』 也就是說,歷史命令在我註銷時,會將最近的 HISTFILESIZE 筆記錄到個人紀錄文件當中啦!
固然,也能夠用 history -w 強制馬上寫入的!那爲什麼用『升級』兩個字呢? 由於 ~/.bash_history 記錄的筆數永遠都是 HISTFILESIZE 那麼多,舊的信息會被主動的拿掉! 僅保留最新的!
在咱們系統中存在多個名字相同的名字,那麼 bash shell 究竟使用的是哪一個命令呢?其遵循的順序以下
1.以相對/絕對路徑來執行命令
2.由 alias 找到命令來執行
3.由 bash 內置命令來執行
4.經過$PATH 的順序找到的第一個命令來執行
[root@localhost ~]# alias echo='echo -n' [root@localhost ~]# type -a echo echo is aliased to `echo -n' echo is a shell builtin echo is /bin/echo
能夠看到先找alias在內置命令 最後PATH
這些均可以進行配置的
怎麼咱們什麼動做都沒有進行,可是一進入 bash 就取得一堆有用的變量了?
這是由於系統有一些環境配置文件案的存在,讓 bash 在啓動時直接讀取這些配置文件,以規劃好 bash 的操做環境
這些配置文件又能夠分爲全體系統的配置文件以及用戶我的偏好配置文件。
咱們前幾個小節談到的命令別名啦、自定義的變量啦,在你註銷 bash 後就會失效,因此你想要保留你的配置, 就得要將這些配置寫入配置文件才行。
以 login shell 方式
1 /etc/profile 系統最主要的shell配置文件,每次login,bash都要讀取 /etc/profile文件
PATH:會依據 UID 決定 PATH 變量要不要含有 sbin 的系統命令目錄;
MAIL:依據帳號配置好使用者的 mailbox 到 /var/spool/mail/帳號名;
USER:根據用戶的帳號配置此一變量內容;
HOSTNAME:依據主機的 hostname 命令決定此一變量內容;
HISTSIZE:歷史命令記錄數
2 我的配置文件
bash 在讀完了總體環境配置的 /etc/profile 以及其餘配置文件後,接下來則是會讀取使用者的我的配置文件
其實 bash 的 login shell 配置只會讀取上面三個文件的其中一個, 而讀取的順序則是依照上面的順序。也就是說,若是 ~/.bash_profile 存在,那麼其餘兩個文件不論有無存在,都不會被讀取。 若是 ~/.bash_profile 不存在纔會去讀取 ~/.bash_login,而前二者都不存在纔會讀取 ~/.profile 的意思
在 login shell 的 bash 環境中,所讀取的我的偏好配置文件其實主要有三個,依序分別是:
~/.bash_profile
~/.bash_login
~/.profile
~/.bash_profile 是我的的bash配置文件,存在每位用戶的$HOME
~/.bash_login 用戶登錄時 bash會讀取這個文件。一般把登錄就要執行的指令放在這
以 non-login shell 方式
~/.bashrc 每次打開shell,shell都會讀取的文件。每次打開shell,執行一次
其他的配置文件爲
4 ~/.bash_logout 是退出系統時bash在退出時執行的
5 ~/.bash_history 是歷史功能的記錄文件
數據流重定向 就是把某些要出如今屏幕上的數據傳輸到其餘地方
輸入數據流:以寫文件爲例,從鍵盤輸入的字符就輸入數據流
輸出數據流:以讀文件爲例,將文件內容顯示到屏幕上,顯示的內容就是輸出字符流
輸出數據流又可分爲:標準輸出 標準錯誤輸出
標準輸入 < 或者 <<
標準輸出 > 或者 >>
標準錯誤輸出 2> 或者 2>>
( 一個< 表示覆蓋 二個<< 表示進行追加 )
echo config.js > copy.js
本應該出如今屏幕上的全部的config的信息 會被 導入到copy.js文件
這個copy文件的建立方式爲
1 該文件若不存在,系統會自動的將他建立起來
2 當這個文件存在的時候,那麼系統就會先將這個文件內容清空,而後再將數據寫入
也就是若以 > 輸出到一個已存在的文件中,那個文件就會被覆蓋掉
若是不想被覆蓋,而是繼續追加信息,使用 >>
ls tmp/info && touch tmp/info/a
bash 命令運行的時候有輸出的數據會出現! 那麼若是這羣數據必須要通過幾道手續以後才能獲得咱們所想要的格式,應該如何來配置?
就是在 shell 上運行的 script 腳本
以 #!/bin/bash 開頭 用以聲明文件內語法使用bash語法
if [ 條件判斷式 ]; then 當條件判斷式成立時,能夠進行的命令工做內容; fi <==將 if 反過來寫,就成爲 fi 啦!結束 if 之意!
sh base.sh
bash base.sh
/bin/bash base.sh
/bin/sh base.sh
source x.sh
source 能夠回傳變量
// 定義變量 export 到全局 export TRYPATH='trypath' // 定義 test.sh 內容爲 // echo $TRYPATH // TRYPATH='changepath' sh test.sh // -> trypath echo $TRYPATH // -> trypath // 使用source執行 source test.sh // trypath echo $TRYPATH // -> changepath
也就是 source 能夠修改父進程的變量
登錄 Linux 主機的時候,輸入的是咱們的帳號, ID 與帳號的對應就在 /etc/passwd 當中
每一個登錄的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、一個是羣組 ID (Group ID ,簡稱 GID)
每個文件都會有所謂的擁有者 ID 與擁有羣組 ID ,當咱們有要顯示文件屬性的需求時,系統會依據 /etc/passwd 與 /etc/group 的內容, 找到 UID / GID 對應的帳號與組名再顯示出來
1 先找尋 /etc/passwd 裏面是否有你輸入的帳號
若是沒有則跳出,若是有的話則將該帳號對應的 UID 與 GID (在 /etc/group 中) 讀出來,另外,該帳號的主文件夾與 shell 配置也一併讀出
2 再來則是覈對密碼錶啦!
這時 Linux 會進入 /etc/shadow 裏面找出對應的帳號與 UID,而後覈對一下你剛剛輸入的密碼與裏頭的密碼是否相符
3 若是一切都 OK 的話,就進入 Shell 控管的階段
每一行都表明一個帳號,有幾行就表明有幾個帳號在你的系統中
按照 : 分爲 7個部分
[用戶名]:[密碼]:[UID]:[GID]:[身份描述]:[主目錄]:[登陸shell]
咱們知道不少程序的運行都與權限有關,而權限與 UID/GID 有關!所以各程序固然須要讀取 /etc/passwd 來了解不一樣帳號的權限。 所以 /etc/passwd 的權限需配置爲 -rw-r--r-- 這樣的狀況, 雖然早期的密碼也有加密過,但卻放置到 /etc/passwd 的第二個字段上!這樣一來很容易被有心人士所竊取的, 加密過的密碼也可以透過暴力破解法去 try and error (試誤) 找出來
由於這樣的關係,因此後來發展出將密碼移動到 /etc/shadow 這個文件分隔開來的技術
testuser:!!:17854:0:99999:7:::
[帳號名稱] [密碼] [最近更動密碼的日期] [密碼不可被更動的天數] [密碼須要從新變動的天數] [密碼須要變動期限前的警告天數] [密碼過時後的帳號寬限時間(密碼失效日)] [帳號失效日期] [保留]
通過編碼的密碼 (加密) 只會看到有一些特殊符號的字母
是以 1970 年 1 月 1 日做爲 1 而累加的日期,1971 年 1 月 1 日則爲 366
記錄GID 和用戶組組名對應
這個文件每一行表明一個羣組
它總共分四個部分:[組名]:[密碼域]:[GID]:[組員列表]
看下這三者的關係
每一個使用者在他的 /etc/passwd 裏面的第四欄有所謂的 GID,就是『初始羣組 (initial group) 』。也就是說,當用戶一登錄系統,馬上就擁有這個羣組的相關權限
可是一個用戶能夠被加入到多個用戶組去,好比 USERA 能夠同時屬於 group1 (初始用戶組) 與 group2 (手動添加)
那麼當這個用戶在新建一個文件的時候,新文件所屬組是哪個
這個取決於當時的有效用戶組
查詢當前用戶所屬的用戶組
groups
第一個輸出的羣組即爲 有效用戶組 (effective group) 了
以這個用戶身份去新建一個文件,則文件的用戶組就是這個 有效用戶組
newgrp newGrooup
可是使用newgrp 是有限制的,那就是你想要切換的羣組必須是你已經有支持的羣組,也就是說,只要個人用戶有支持的羣組就是可以切換成爲有效羣組
// 新增一個用戶 usersadd newName // 刪除一個用戶 userdel newName
CentOS 系統主要會幫咱們處理幾個項目
1 在 /etc/passwd 裏面建立一行與帳號相關的數據,包括建立 UID/GID/家目錄等
2 在 /etc/shadow 裏面將此帳號的密碼相關參數填入,可是還沒有有密碼
3 在 /etc/group 裏面加入一個與帳號名稱如出一轍的組名
4 在 /home 底下建立一個與帳號同名的目錄做爲用戶家目錄,且權限爲 700
此時在 /etc/shadow 內僅會有密碼參數而不會有加密過的密碼數據,所以還須要使用『 passwd 帳號 』來給予密碼纔算是完成了用戶建立的流程
passwd g1
爲什麼『 useradd vbird1 』會主動在 /home/vbird1 建立起用戶的家目錄?家目錄內有什麼數據且來自哪裏?爲什麼默認使用的是 /bin/bash 這個 shell ?爲什麼密碼字段已經都規範好了 (0:99999:7 那一串)? ---- 取決於 useradd 所使用的參考文件
useradd -D // GROUP=100 <==默認的羣組 // HOME=/home <==默認的家目錄所在目錄 // INACTIVE=-1 <==密碼失效日,在 shadow 內的第 7 欄 // EXPIRE= <==帳號失效日,在 shadow 內的第 8 欄 // SHELL=/bin/bash <==默認的 shell // SKEL=/etc/skel <==用戶家目錄的內容數據參考目錄 // CREATE_MAIL_SPOOL=yes <==是否主動幫使用者建立郵件信箱(mailbox)
// 新增一個用戶組 groupadd newName // 刪除一個用戶組 r 表示連同用戶主文件夾一塊兒刪除 groupdel -r newName // 將用戶加入到組和從組中刪除 gpasswd –a 用戶名 組名 //添加用戶 gpasswd –d 用戶名 組名 //刪除用戶 // 查看用戶屬於某組 #groups 用戶名 // 新建用戶加入某組 useradd –g 某組名 用戶
將 g3 設置爲 girls 組的管理員, 管理員能夠控制 那些帳號能夠 移入 移除 用戶組
gpasswd -A g3 girls
當忘記了密碼怎麼辦
root管理員處理
passwd usertest
安全模式?? 太複雜了
echo 123456 | passwd --stdin testuser2
直接變動密碼,不須要重複確認
// 使用戶密碼失效 passwd -S xxx // 使用戶密碼解鎖 passwd -u xxx
su 須要新用戶的密碼 (若是原來的是root 切換到哪個都不須要密碼 )
本來的變量不會改變, 好比PATH變量 mail 變量 還會是以前用戶的
// 使用 - 能夠處理這個問題 su -
exit
退出 第二個 用戶狀態 恢復到原始用戶環境
sudo 切換須要本身的密碼,有時候還不須要
sudo 可讓你以其餘用戶的身份運行命令 (一般是使用 root 的身份來運行命令), 只有在 /etc/sudoers 中的用戶 才能夠執行此命令
將用戶添加到 /etc/sudoers
visudo
添加角色
查詢某人或者本身的uid/gid等信息
id // uid=1006(g1) gid=1007(girls) 組=1007(girls) id g2 // uid=1007(g2) gid=1007(girls) 組=1007(girls)
當前誰登錄在系統上
能夠理解爲node中的定時任務(node-schedule)
有兩種任務性質,週期性,一次性
週期性: 好比天天要睡覺
一次性: 好比偶爾會撿到錢
at 命令用於處理 一次性 的工做
crontab 命令用於處理週期性的工做,循環工做
某些軟件在運行中會產生一些緩存文件,可是當這個軟件關閉時,這些緩存文件可能並不會主動的被移除。
系統透過例行性工做排程運行名爲 tmpwatch 的命令來刪除這些緩存文件
atd 用於負責處理 這些一次的工做,可是並不是全部的 Linux distributions 都默認會把他打開的
/etc/init.d/atd restart
使用 at 這個命令來產生所要運行的工做,並將這個工做以文字檔的方式寫入 /var/spool/at/ 目錄內,該工做便能等待 atd 這個服務的取用與運行了
這兩個文件限制了誰有權利去調用 at
1 /etc/at.allow
寫在這個文件中的使用者才能使用 at ,沒有在這個文件中的使用者則不能使用 at (即便沒有寫在 at.deny 當中)
2 若是 /etc/at.allow 不存在,就尋找 /etc/at.deny 這個文件 凡是被寫入的都不能使用at了(沒有被寫的就能夠使用)
3 若是兩個文件都不存在,那麼只有 root 能夠使用 at 這個命令
atq
atrm [jobnumber]
batch 就是另外一種 at, 可是batch會在 CPU 工做負載 低於 0.8 的時候,才進行你所下達的工做任務
若是某一個程序他須要一直使用 CPU 的運算功能,那麼此時 CPU 的使用率可能到達 100% 可是 CPU 的工做負載則是趨近1,由於 CPU 僅負責一個工做
若是同時運行2個這樣的程序 CPU 的使用率仍是 100% ,可是工做負載則變成 2
crontab 用來處理週期性的工做,爲了安全考慮,能夠限制哪些身份是能夠使用 crontab
當使用者使用 crontab 這個命令來建立工做排程以後,該項工做就會被紀錄到 /var/spool/cron/ 裏面, 並且是以賬號來做爲判別
好比 dmtsai 使用 crontab 後, 他的工做會被記錄到 /var/spool/cron/dmtsai 裏頭去
默認狀況下,只要用戶沒有被放入 /etc/cron.deny 就能夠直接執行 crontab -e 去編輯本身的例行性命令了
時間位置是五個數字 * 分別表明 分鐘 小時 日期 月份 周幾
編寫
crontab -e
咱們寫一個每一分鐘輸出當前時間的
*/1 * * * * echo $(date) > /tmp/test.txt
查看當前用的 crontab 工做
crontab -l
重啓
/bin/systemctl start crond.service
crontab -e 是對於用戶的,若是是系統的例行性任務,就須要另外處理了
須要編輯 /etc/crontab 這個文件了
cron 這個服務的最低偵測限制是『分鐘』,因此『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裏面的數據內容 』,所以,只要編輯完 /etc/crontab 這個文件,而且將他儲存以後,那麼 cron 的配置就自動運行
手動重啓crond服務
/etc/init.d/crond restart
當 /etc/crontab 這個文件中的例行性工做的命令發生錯誤時,或者是該工做的運行結果有 STDOUT/STDERR 時,會將錯誤信息或者是螢幕顯示的信息傳給誰(默認是由系統直接寄發一封 mail 給 root)
命令路徑
anacron 並不能指定什麼時候運行某項任務, 而是以天爲單位或者是在啓動後馬上進行 anacron 的動做,他會去偵測停機期間應該進行可是並無進行的 crontab 任務,並將該任務運行一遍後,anacron 就會自動中止了
anacron 會以一天、七天、一個月爲期去偵測系統未進行的 crontab 任務
anacron 運行的時間一般有兩個,一個是系統啓動期間運行,一個是寫入 crontab 的排程中。 這樣纔可以在特定時間分析系統未進行的 crontab 工做
觸發任何一個事件時,系統都會將其定義爲一個進程,並給與此進程一個ID,爲PID. 同時依據啓發這個程序的使用者與相關屬性關係,給予這個 PID 一組有效的權限配置
程序通常是放置在實體磁碟中,而後透過使用者的運行來觸發。觸發後會加載到內存中成爲一個個體,那就是進程。 爲了操做系統可管理這個程序,所以程序有給予運行者的權限/屬性等參數,幷包括程序所須要的命令碼與數據或文件數據等, 最後再給予一個 PID 。系統就是透過這個 PID 來判斷該 process 是否具備權限進行工做
系統須要啓動的那個二進制的文件
一般爲二進制程序放置在存儲媒介中,以物理文件形式存在
程序觸發以後,被加載到內存中成爲一個個體,這就是進程
程序被觸發後,執行者的權限與屬性,程序的程序代碼與所需數據會被加載到內存,操做系統會給與這個內存單元一個標識符PID
程序彼此之間是有相關性的。以上面的圖示來看,連續運行兩個 bash 後,第二個 bash 的父程序就是前一個 bash
某些命令產生的進程很快就會被終止,好比ls顯示文件 touch 建立文件等。可是有些進程會一直在執行,好比系統每一分鐘會去掃描 /etc/crontab 來進行工做調度, 是 crond 這個程序所管理的,他啓動後就在後臺一直持續不斷的運行。 這個就是一直存在內存中的進程
常駐在內存當中的程序一般都是負責一些系統所提供的功能以服務使用者各項任務,所以這些常駐程序就會被咱們稱爲:服務 (daemon)。系統的服務很是的多, 不過主要大體分紅系統自己所須要的服務,例如剛剛提到的 crond 及 atd
網絡服務會啓動一個能夠負責網絡監聽的端口 (port) ,以提供外部用戶端 (client) 的連線要求
Q: 爲何 Linux 這麼多用戶,可是卻每一個用戶均可以擁有本身的環境?
其實在 Linux 下運行一個命令時,系統會將相關的權限、屬性、程序碼與數據等均加載內存, 並給予這個單元一個程序識別碼 (PID),最終該命令能夠進行的任務則與這個 PID 的權限有關
// 文件目錄 const dir = {} // 一些內存 const Memory = {} function linux1 () { // 用戶1登陸的環境 function crontab(){...} function pm2(){...} } function linux2 () { // 用戶2 登陸的環境 function crontab(){...} function pm2(){...} }
Linux 可讓CPU在各個工做進行切換,也就是說,每個工做僅僅佔用CPU幾個命令次數,因此CPU每秒可以在各個進程之間進行切換
目前的 CPU 速度可高達幾個 GHz。 這表明 CPU 每秒鐘能夠運行 109 這麼屢次命令。Linux 可讓 CPU 在各個工做間進行切換, 也就是說,其實每一個工做都僅佔去 CPU 的幾個命令次數,因此 CPU 每秒就可以在各個程序之間進行切換
Linux能夠在任什麼時候候, 將某個被困住的程序殺掉,而後再從新運行該程序而不用從新啓動
登錄 bash 以後, 就是取得一個名爲 bash 的 PID 了,而在這個環境底下所運行的其餘命令, 就幾乎都是子進程了
在這個單一的 bash 界面下,能夠處理多個工做
當登陸系統取得 bash shell 以後,在單一終端機界面下同時進行多個工做的行爲管理
能夠出現提示字節讓你操做的環境就稱爲前景 (foreground),其餘工做就可讓你放入背景 (background) 去暫停或運行
好比啓動一個項目
node index.js
這個就是一直在前臺啓動,咱們能夠將這個放在後臺處理
node index.js &
添加的這個 & 會將命令放到後臺處理,此時bash會輸出一個 工做號碼 1 和 PID 90328
jobs
參數 | 含義 |
---|---|
l | 除了列出 job number 與命令串以外,同時列出 PID 的號碼 |
r | 僅列出正在背景 run 的工做 |
s | 僅列出正在背景當中暫停 (stop) 的工做 |
能夠看到有一個 + - 號展現
fg // 默認將 + 的工做取出來 fg- // 取出來 - 的工做 fg %工做號碼 // 取出來這個工做號碼的對應工做
kill -signal %jobnumber
signal參數 | 含義 |
---|---|
1 | 從新讀取一次參數的配置檔 (相似 reload) |
2 | 表明與由鍵盤輸入 [ctrl]-c 一樣的動做 |
9 | 馬上強制刪除一個工做 |
15 | 以正常的程序方式終止一項工做。與 -9 是不同的 |
爲何須要進程管理
1 Linux 系統是個很忙碌的系統,那麼當整個系統資源快要被使用光時, 您是否可以找出最耗系統的那個程序,而後刪除該程序,讓系統恢復正常呢
2 此外,若是由於某個程序寫的很差,致使產生一個有問題的程序在內存當中,您又該如何找出他,而後將他移除呢?
3 若是同時有五六項工做在您的系統當中運行,但其中有一項工做纔是最重要的, 該如何讓那一項重要的工做被最優先運行呢
命令 | 含義 |
---|---|
ps -l | 查詢只和本身bash相關的進程 |
ps aux | 當前內存全部進程 |
ps 是靜態的結果輸出 是某一個時間點的進程狀態
top 能夠監測整個系統的進程工做狀態
top [-d 數字] | top [-bnp]
-d 後面能夠接秒數,默認是 5 秒, 表示每次更新進程資源的時間
在 top 運行過程中能夠使用的按鍵命令
? :顯示在 top 當中能夠輸入的按鍵命令
P :以 CPU 的使用資源排序顯示
M :以 Memory 內存 的使用資源排序顯示 (默認)
N :以 PID 來排序
T :由該 Process 使用的 CPU 時間累積 (TIME+) 排序
k :給予某個 PID 一個訊號 (signal)
r :給予某個 PID 從新制訂一個 nice 值
q :離開 top 軟件的按鍵
如何查找最消耗CPU的進程
使用 top 而後 按P
實際上是透過給予該程序一個信號 (signal) 去告知該程序如何操做
查詢全部的可用的singal
kill -l
經常使用的一些 信號
數值 | 名稱 | 含義 |
---|---|---|
1 | SIGHUP | 啓動被終止的程序,可以讓該 PID 從新讀取本身的配置檔,相似從新啓動 |
根據進程名稱刪除此進程
好比咱們經過 node index.js & 啓動這個服務到後臺
那麼刪除就能夠是 killall -9 node
要刪除某個程序,咱們能夠使用 PID 或者是啓動該程序的命令名稱,
而若是要刪除某個服務呢?呵呵!最簡單的方法就是利用 killall , 由於他能夠將系統當中全部以某個命令名稱啓動的程序所有刪除。
Linux 給予程序一個所謂的『優先運行序 (priority, PRI)』, 這個 PRI 值越低表明越優先的意思
以前咱們查看一個進程 ps -l
能夠看到 PRI 這個參數
PRI 是內核動態調整的,使用者無權去幹涉 PRI
想要調整程序的優先運行序時,就得要透過 Nice 值了!Nice 值就是上表的 NI
通常來講, PRI 與 NI 的相關性以下:
PRI(new) = PRI(old) + nice
可是,若是本來的 PRI 是 50 ,並非咱們給予一個 nice = 5 ,就會讓 PRI 變成 55 。
由於 PRI 是系統『動態』決定的,因此,雖然 nice 值是能夠影響 PRI ,不過, 最終的 PRI 還是要通過系統分析後纔會決定的。
另外, nice 值是有正負的,而既然 PRI 越小越早被運行, 因此,當 nice 值爲負值時,那麼該程序就會下降 PRI 值,亦即會變的較優先被處理
新執行的命令處理nice
nice [-n 數字] command
nice -n 5 vi
數字範圍在 -20 - 19
已經存在的進程nice從新調整
free [-b|-k|-m|-g] [-t]
選項與參數
-b :直接輸入 free 時,顯示的單位是 Kbytes,咱們能夠使用 b(bytes), m(Mbytes) k(Kbytes), 及 g(Gbytes) 來顯示單位
-t :在輸出的最終結果,顯示實體內存與 swap 的總量
Mem 那一行顯示的是實體內存的量, Swap 則是虛擬內存的量。 total 是總量, used 是已被使用的量, free 則是剩餘可用的量。 後面的 shared/buffers/cached 則是在已被使用的量當中,用來做爲緩衝及緩存的量。
Linux 測試用主機是很平凡的,根本沒有什麼工做, 可是實體內存是幾乎被用光
不過,至少有 132MB 用在緩衝記憶 (buffers) 工做, 287MB 則用在緩存 (cached) 工做,也就是說,系統是『頗有效率的將全部的內存用光』, 目的是爲了讓系統的存取效能加速
不少朋友都會問到這個問題『個人系統明明很輕鬆,爲什麼內存會被用光光?』被用光是正常的!而須要注意的反而是 swap 的量
通常來講, swap 最好不要被使用,尤爲 swap 最好不要被使用超過 20% 以上, 若是您發現 swap 的用量超過 20% ,那麼,最好仍是買實體內存
系統會使用到 swap , 絕對是由於實體內存不足了纔會這樣作的
Linux 系統爲了要加速系統效能,因此會將最常使用到的或者是最近使用到的文件數據緩存 (cache) 下來, 這樣將來系統要使用該文件時,就直接由內存中搜尋取出,而不須要從新讀取硬盤,速度上面固然就加快了! 所以,實體內存被用光是正常的
netstart -tlnp
系統爲了某些功能必需要提供一些服務 (不管是系統自己仍是網絡方面),這個服務就稱爲 service
可是 service 的老是須要程序的運行吧!達成這個 service 的程序咱們就稱呼他爲 daemon
舉例來講,達成循環型例行性工做排程服務 (service) 的程序爲 crond 這個 daemon
Linux 開發商先在固定的硬件平臺與操做系統平臺上面將須要安裝或升級的軟件編譯好, 而後將這個軟件的全部相關文件打包成爲一個特殊格式的文件,在這個軟件文件內還包含了預先偵測系統與相依軟件的腳本, 並提供記載該軟件提供的全部文件資訊等。最終將這個軟件文件發佈。
用戶端取得這個文件後,只要透過特定的命令來安裝, 那麼該軟件文件就會依照內部的腳原本偵測相依的前驅軟件是否存在,若安裝的環境符合需求,那就會開始安裝, 安裝完成後還會將該軟件的資訊寫入軟件管理機制中,以達成將來能夠進行升級、移除等動做
目前Linux經常使用的兩大安裝方式爲 dpkg rpm
不論 dpkg/rpm 這些機制或多或少都會有軟件屬性相依的問題,那該如何解決呢?
其實前面不是談到過每一個軟件文件都有提供相依屬性的檢查嗎?那麼若是咱們將相依屬性的數據作成列表, 等到實際軟件安裝時,若發生有相依屬性的軟件情況時,管理機制自動去取得其依賴來同時安裝, 就解決了屬性相依的問題
目前新的 Linux 開發商都有提供這樣的『線上升級』機制,透過這個機制, 原版光盤就只有第一次安裝時須要用到而已,其餘時候只要有網絡,你就可以取得本來開發商所提供的任何軟件了
CentOS 系統嘛!因此說:使用的軟件管理機制爲 RPM 機制,而用來做爲線上升級的方式則爲 yum
RPM是RedHat Package Manager(RedHat軟件包管理工具)的縮寫,這一文件格式名稱雖然打上了RedHat的標誌,可是其原始設計理念是開放式的,如今包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分發版本都有采用,能夠算是公認的行業標準了。
最大的特色就是將你要安裝的軟件先編譯過, 而且打包成爲 RPM 機制的包裝文件,透過包裝好的軟件裏頭默認的數據庫記錄, 記錄這個軟件要安裝的時候必須具有的相依屬性軟件,當安裝在你的 Linux 主機時, RPM 會先依照軟件裏頭的數據查詢 Linux 主機的相依屬性軟件是否知足, 若知足則予以安裝,若不知足則不予安裝。那麼安裝的時候就將該軟件的資訊整個寫入 RPM 的數據庫中,以便將來的查詢、驗證與反安裝!這樣一來的優勢是:
由於已經編譯完成而且打包完畢,因此軟件傳輸與安裝上很方便 (不須要再從新編譯);
由於軟件的資訊都已經記錄在 Linux 主機的數據庫上,很方便查詢、升級與反安裝
缺點
由於 RPM 文件是已經包裝好的數據,也就是說, 裏面的數據已經都『編譯完成』了!因此,該軟件文件幾乎只能安裝在本來默認的硬件與操做系統版本中。 也就是說,你的主機系統環境必需要與當初建立這個軟件文件的主機環境相同才行
有的時候相同 distribution 的不一樣版本之間也沒法互通,例如 CentOS 4.x 的 RPM 文件就沒法直接套用在 CentOS 5.x !所以,這樣能夠發現這些軟件管理機制的問題是:
軟件文件安裝的環境必須與打包時的環境需求一致或至關;
須要知足軟件的相依屬性需求;
反安裝時須要特別當心,最底層的軟件不可先移除,不然可能形成整個系統的問題!
(1)查詢系統中安裝的全部rpm包 #rpm –qa
(2)查詢軟件包是否安裝 #rpm –q 軟件包名稱
(3)查詢軟件包信息 #rpm –qi 軟件包名稱
(4)查詢軟件包中的文件 #rpm –ql 軟件包名稱
(5)查詢系統中文件所屬的軟件包#rpm –qf 文件全路徑名
(6)查詢rpm包文件中的信息#rpm –qp rpm包文件全路徑
rpm –ivh rpm包全路徑文件名
rpm –e rpm包名稱
rpm –U rpm軟件包全路徑名
基本的網絡配置
一、主機名
二、ip地址
三、網關地址
四、DNS服務器地址
DNS
DNS客戶配置文件 /etc/resolv.conf 該文件中指定系統所使用的DNS服務器的IP地址
網絡相關命令
// 顯示當前系統的主機名稱 hostname // 設置系統主機名 hostname 主機名稱
ping
Ping [–c 發出的報文數 ]目的主機地址
Ping命令經過向被測試的目的主機地址發送ICMP報文並收取回應報文,來測試當前主機到目的主機的網絡鏈接狀態
nslookup
用於使用系統設定的DNS服務器解析域名,用該命令能夠測試NDS服務器是否工做正常
Nslookup命令有交互方式查詢和命令行方式查詢
#nslookup #nslookup 主機域名 | ip地址
nslookup www.webmxx.com