玩轉Linux作業系統
作業系統發展史
只有硬體沒有軟體的計算機系統被稱之為“裸機”,我們很難用“裸機”來完成計算機日常的工作(如儲存和運算),所以必須用特定的軟體來控制硬體的工作。最靠近計算機硬體的軟體是系統軟體,其中最為重要的就是“作業系統”。“作業系統”是控制和管理整個計算機硬體和軟體資源、實現資源分配和任務調配、為系統使用者以及其他軟體提供介面和環境的程式的集合。
沒有作業系統(手工操作)
在計算機誕生之初沒有作業系統的年代,人們先把程式紙帶(或卡片)裝上計算機,然後啟動輸入機把程式送入計算機,接著通過控制檯開關啟動程式執行。當程式執行完畢,印表機輸出計算的結果,使用者卸下並取走紙帶(或卡片)。第二個使用者上機,重複同樣的步驟。在整個過程中使用者獨佔機器,CPU等待手工操作,資源利用率極低。
批處理系統
首先啟動計算機上的一個監督程式,在監督程式的控制下,計算機能夠自動的、成批的處理一個或多個使用者的作業。完成一批作業後,監督程度又從輸入機讀取作業存入磁帶機。按照上面的步驟重複處理任務。監督程式不停的處理各個作業,實現了作業的自動轉接,減少了作業的建立時間和手工操作時間,提高了計算機資源的利用率。 批處理系統又可以分為單道批處理系統、多道批處理系統、聯機批處理系統、離線批處理系統。
分時系統和實時系統
分時系統是把處理器的執行時間分成很短的時間片,按時間片輪流把處理機分配給各聯機作業使用。 若某個作業在分配給它的時間片內不能完成其計算,則該作業暫時中斷,把處理機讓給另一作業使用,等待下一輪排程時再繼續其執行。由於計算機速度很快,作業執行輪轉得很快,給每個使用者的感覺是他獨佔了一臺計算機。而每個使用者可以通過自己的終端向系統發出各種操作控制命令,在充分的人機互動情況下,完成作業的執行。為了解決分時系統不能及時響應使用者指令的情況,又出現了能夠在在嚴格的時間範圍內完成事件處理,及時響應隨機外部事件的實時系統。
通用作業系統
-
1960s:IBM的System/360系列的機器有了統一的作業系統OS/360。
-
1965年:AT&T的貝爾實驗室加入GE和MIT的合作計劃開始開發MULTICS。
-
1969年:MULTICS專案失敗,Ken Tompson賦閒在家,為了玩“Space Travel”遊戲用匯編語言在當時已經被淘汰的PDP-7上開發了Unics。
-
1970年~1971年:Ken Tompson和Dennis Ritchie用B語言在PDP-11上重寫了Unics,並在Brian Kernighan的建議下將其更名為Unix。
-
1972年~1973年:Dennis Ritchie發明了C語言來取代可移植性較差的B語言,並開啟了用C語言重寫Unix的工作。
-
1974年:Unix推出了里程碑意義的第5版,幾乎完全用C語言來實現。
-
1979年:從Unix第7版開始,AT&T釋出新的使用條款,將Unix私有化。
-
1987年:Andrew S. Tanenbaum教授為了能在課堂上為學生講解作業系統運作的細節,決定在不使用任何AT&T的原始碼前提下,自行開發與Unix相容的作業系統以避免版權上的爭議,該系統被命名為Minix。
-
1991年:Linus Torvalds就讀於芬蘭赫爾辛基大學期間,嘗試在Minix上做一些開發工作,但因為Minix只是作為教學用途的作業系統,功能並不強大,為了方便在學校的新聞組和郵件系統中讀寫和下載檔案,Linus編寫了磁碟驅動程式和檔案系統,這些東西形成了Linux系統核心的雛形。
Linux概述
Linux是一個通用作業系統。一個作業系統要負責任務排程、記憶體分配、處理外圍裝置I/O等操作。作業系統通常由核心(執行其他程式,管理像磁碟、印表機等硬體裝置的核心程式)和系統程式(裝置驅動、底層庫、shell、服務程式等)兩部分組成。
Linux核心是芬蘭人Linus Torvalds開發的,於1991年9月釋出。而Linux作業系統作為Internet時代的產物,它是由全世界許多開發者共同合作開發的,是一個自由的作業系統(注意自由和免費並不是同一個概念,想了解二者的差別可以點選這裡)。
Linux系統優點
- 通用作業系統,不跟特定的硬體繫結。
- 用C語言編寫,可移植性強,有核心程式設計介面。
- 支援多使用者和多工,支援安全的分層檔案系統。
- 大量的實用程式,完善的網路功能以及強大的支援文件。
- 可靠的安全性和良好的穩定性,對開發者更友好。
Linux系統發行版本
- Redhat
- Ubuntu
- CentOS
- Fedora
- Debian
- openSUSE
基礎命令
Linux系統的命令通常都是如下所示的格式:
命令名稱 [命名引數] [命令物件]
-
獲取登入資訊 - w / who / last/ lastb。
[root ~]# w 23:31:16 up 12:16, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 182.139.66.250 23:03 4.00s 0.02s 0.00s w jackfrue pts/1 182.139.66.250 23:26 3:56 0.00s 0.00s -bash [root ~]# who root pts/0 2018-04-12 23:03 (182.139.66.250) jackfrued pts/1 2018-04-12 23:26 (182.139.66.250) [root ~]# who am i root pts/0 2018-04-12 23:03 (182.139.66.250) [root ~]# who mom likes root pts/0 2018-04-12 23:03 (182.139.66.250) [root ~]# last root pts/0 117.136.63.184 Sun May 26 18:57 still logged in reboot system boot 3.10.0-957.10.1. Mon May 27 02:52 - 19:10 (-7:-42) root pts/4 117.136.63.184 Sun May 26 18:51 - crash (08:01) root pts/4 117.136.63.184 Sun May 26 18:49 - 18:49 (00:00) root pts/3 117.136.63.183 Sun May 26 18:35 - crash (08:17) root pts/2 117.136.63.183 Sun May 26 18:34 - crash (08:17) root pts/0 117.136.63.183 Sun May 26 18:10 - crash (08:42)
-
檢視自己使用的Shell - ps。
Shell也被稱為“殼”或“殼程式”,它是使用者與作業系統核心交流的翻譯官,簡單的說就是人與計算機互動的介面和介面。目前很多Linux系統預設的Shell都是bash(Bourne Again SHell),因為它可以使用tab鍵進行命令和路徑補全、可以儲存歷史命令、可以方便的配置環境變數以及執行批處理操作。
[root ~]# ps PID TTY TIME CMD 3531 pts/0 00:00:00 bash 3553 pts/0 00:00:00 ps
-
檢視命令的說明和位置 - whatis / which / whereis。
[root ~]# whatis ps ps (1) - report a snapshot of the current processes. [root ~]# whatis python python (1) - an interpreted, interactive, object-oriented programming language [root ~]# whereis ps ps: /usr/bin/ps /usr/share/man/man1/ps.1.gz [root ~]# whereis python python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz [root ~]# which ps /usr/bin/ps [root ~]# which python /usr/bin/python
-
清除螢幕上顯示的內容 - clear。
-
檢視幫助文件 - man / info / –help / apropos。
[root@izwz97tbgo9lkabnat2lo8z ~]# ps --help Usage: ps [options] Try 'ps --help <simple|list|output|threads|misc|all>' or 'ps --help <s|l|o|t|m|a>' for additional help text. For more details see ps(1). [root@izwz97tbgo9lkabnat2lo8z ~]# man ps PS(1) User Commands PS(1) NAME ps - report a snapshot of the current processes. SYNOPSIS ps [options] DESCRIPTION ...
-
檢視系統和主機名 - uname / hostname。
[root@izwz97tbgo9lkabnat2lo8z ~]# uname Linux [root@izwz97tbgo9lkabnat2lo8z ~]# hostname izwz97tbgo9lkabnat2lo8z [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat /etc/centos-release CentOS Linux release 7.6.1810 (Core)
說明:
cat
是連線檔案內容並列印到標準輸出的命令,後面會講到該命令;/etc
是Linux系統上的一個非常重要的目錄,它儲存了很多的配置檔案;centos-release
是該目錄下的一個檔案,因為我自己使用的Linux發行版本是CentOS 7.6,因此這裡會有一個這樣的檔案。 -
時間和日期 - date / cal。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# date Wed Jun 20 12:53:19 CST 2018 [root@iZwz97tbgo9lkabnat2lo8Z ~]# cal June 2018 Su Mo Tu We Th Fr Sa 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 [root@iZwz97tbgo9lkabnat2lo8Z ~]# cal 5 2017 May 2017 Su Mo Tu We Th Fr Sa 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
-
重啟和關機 - reboot / shutdown。
[root ~]# shutdown -h +5 Shutdown scheduled for Sun 2019-05-26 19:34:27 CST, use 'shutdown -c' to cancel. [root ~]# Broadcast message from root (Sun 2019-05-26 19:29:27 CST): The system is going down for power-off at Sun 2019-05-26 19:34:27 CST! [root ~]# shutdown -c Broadcast message from root (Sun 2019-05-26 19:30:22 CST): The system shutdown has been cancelled at Sun 2019-05-26 19:31:22 CST! [root ~]# shutdown -r 23:58 Shutdown scheduled for Sun 2019-05-26 23:58:00 CST, use 'shutdown -c' to cancel. [root ~]# shutdown -c Broadcast message from root (Sun 2019-05-26 19:31:06 CST): The system shutdown has been cancelled at Sun 2019-05-26 19:32:06 CST!
說明:在執行
shutdown
命令時會向登入系統的使用者發出警告,可以在命令後面跟上警告訊息來替換預設的警告訊息,也可以在-h
引數後通過now
來表示立刻關機。 -
退出登入 - exit / logout。
-
檢視歷史命令 - history。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# history
...
452 ls
453 cd Python-3.6.5/
454 clear
455 history
[root@iZwz97tbgo9lkabnat2lo8Z ~]# !454
說明:檢視到歷史命令之後,可以用
!歷史命令編號
來重新執行該命令;通過history -c
可以清除歷史命令。
實用程式
檔案和資料夾操作
-
建立/刪除空目錄 - mkdir / rmdir。
[root ~]# mkdir abc [root ~]# mkdir -p xyz/abc [root ~]# rmdir abc
-
建立/刪除檔案 - touch / rm。
[root ~]# touch readme.txt [root ~]# touch error.txt [root ~]# rm error.txt rm: remove regular empty file ‘error.txt’? y [root ~]# rm -rf xyz
touch
命令用於建立空白檔案或修改檔案時間。在Linux系統中一個檔案有三種時間:- 更改內容的時間 - mtime。
- 更改許可權的時間 - ctime。
- 最後訪問時間 - atime。
rm
的幾個重要引數:-i
:互動式刪除,每個刪除項都會進行詢問。-r
:刪除目錄並遞迴的刪除目錄中的檔案和目錄。-f
:強制刪除,忽略不存在的檔案,沒有任何提示。
-
切換和檢視當前工作目錄 - cd / pwd。
說明:
cd
命令後面可以跟相對路徑(以當前路徑作為參照)或絕對路徑(以/
開頭)來切換到指定的目錄,也可以用cd ..
來返回上一級目錄。請大家想一想,如果要返回到上上一級目錄應該給cd
命令加上什麼樣的引數呢? -
檢視目錄內容 - ls。
-l
:以長格式檢視檔案和目錄。-a
:顯示以點開頭的檔案和目錄(隱藏檔案)。-R
:遇到目錄要進行遞迴展開(繼續列出目錄下面的檔案和目錄)。-d
:只列出目錄,不列出其他內容。-S
/-t
:按大小/時間排序。
-
檢視檔案內容 - cat / tac / head / tail / more / less / rev / od。
[root ~]# wget http://www.sohu.com/ -O sohu.html --2018-06-20 18:42:34-- http://www.sohu.com/ Resolving www.sohu.com (www.sohu.com)... 14.18.240.6 Connecting to www.sohu.com (www.sohu.com)|14.18.240.6|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 212527 (208K) [text/html] Saving to: ‘sohu.html’ 100%[==================================================>] 212,527 --.-K/s in 0.03s 2018-06-20 18:42:34 (7.48 MB/s) - ‘sohu.html’ saved [212527/212527] [root ~]# cat sohu.html ... [root ~]# head -10 sohu.html <!DOCTYPE html> <html> <head> <title>搜狐</title> <meta name="Keywords" content="搜狐,入口網站,新媒體,網路媒體,新聞,財經,體育,娛樂,時尚,汽車,房產,科技,圖片,論壇,微博,部落格,視訊,電影,電視劇"/> <meta name="Description" content="搜狐網為使用者提供24小時不間斷的最新資訊,及搜尋、郵件等網路服務。內容包括全球熱點事件、突發新聞、時事評論、熱播影視劇、體育賽事、行業動態、生活服務資訊,以及論壇、部落格、微博、我的搜狐等互動空間。" /> <meta name="shenma-site-verification" content="1237e4d02a3d8d73e96cbd97b699e9c3_1504254750"> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/> [root ~]# tail -2 sohu.html </body> </html> [root ~]# less sohu.html ... [root ~]# cat -n sohu.html | more ...
說明:上面用到了一個名為
wget
的命令,它是一個網路下載器程式,可以從指定的URL下載資源。 -
拷貝/移動檔案 - cp / mv。
[root ~]# mkdir backup [root ~]# cp sohu.html backup/ [root ~]# cd backup [root backup]# ls sohu.html [root backup]# mv sohu.html sohu_index.html [root backup]# ls sohu_index.html
-
檔案重新命名 - rename。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# rename .htm .html *.htm
-
查詢檔案和查詢內容 - find / grep。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# find / -name "*.html" /root/sohu.html /root/backup/sohu_index.html [root@izwz97tbgo9lkabnat2lo8z ~]# find . -atime 7 -type f -print [root@izwz97tbgo9lkabnat2lo8z ~]# find . -type f -size +2k [root@izwz97tbgo9lkabnat2lo8z ~]# find . -type f -name "*.swp" -delete [root@iZwz97tbgo9lkabnat2lo8Z ~]# grep "<script>" sohu.html -n 20:<script> [root@iZwz97tbgo9lkabnat2lo8Z ~]# grep -E \<\/?script.*\> sohu.html -n 20:<script> 22:</script> 24:<script src="//statics.itc.cn/web/v3/static/js/es5-shim-08e41cfc3e.min.js"></script> 25:<script src="//statics.itc.cn/web/v3/static/js/es5-sham-1d5fa1124b.min.js"></script> 26:<script src="//statics.itc.cn/web/v3/static/js/html5shiv-21fc8c2ba6.js"></script> 29:<script type="text/javascript"> 52:</script> ...
說明:
grep
在搜尋字串時可以使用正規表示式,如果需要使用正規表示式可以用grep -E
或者直接使用egrep
。 -
建立連結和檢視連結 - ln / readlink。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html -rw-r--r-- 1 root root 212131 Jun 20 19:15 sohu.html [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln /root/sohu.html /root/backup/sohu_backup [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html -rw-r--r-- 2 root root 212131 Jun 20 19:15 sohu.html [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln /root/sohu.html /root/backup/sohu_backup2 [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html -rw-r--r-- 3 root root 212131 Jun 20 19:15 sohu.html [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln -s /etc/centos-release sysinfo [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sysinfo lrwxrwxrwx 1 root root 19 Jun 20 19:21 sysinfo -> /etc/centos-release [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat sysinfo CentOS Linux release 7.4.1708 (Core) [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat /etc/centos-release CentOS Linux release 7.4.1708 (Core)
說明:連結可以分為硬連結和軟連結(符號連結)。硬連結可以認為是一個指向檔案資料的指標,就像Python中物件的引用計數,每新增一個硬連結,檔案的對應連結數就增加1,只有當檔案的連結數為0時,檔案所對應的儲存空間才有可能被其他檔案覆蓋。我們平常刪除檔案時其實並沒有刪除硬碟上的資料,我們刪除的只是一個指標,或者說是資料的一條使用記錄,所以類似於“檔案粉碎機”之類的軟體在“粉碎”檔案時除了刪除檔案指標,還會在檔案對應的儲存區域填入資料來保證檔案無法再恢復。軟連結類似於Windows系統下的快捷方式,當軟連結連結的檔案被刪除時,軟連結也就失效了。
-
壓縮/解壓縮和歸檔/解歸檔 - gzip / gunzip / xz。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz
--2018-06-20 19:29:59-- http://download.redis.io/releases/redis-4.0.10.tar.gz
Resolving download.redis.io (download.redis.io)... 109.74.203.151
Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1738465 (1.7M) [application/x-gzip]
Saving to: ‘redis-4.0.10.tar.gz’
100%[==================================================>] 1,738,465 70.1KB/s in 74s
2018-06-20 19:31:14 (22.9 KB/s) - ‘redis-4.0.10.tar.gz’ saved [1738465/1738465]
[root@iZwz97tbgo9lkabnat2lo8Z ~]# ls redis*
redis-4.0.10.tar.gz
[root@iZwz97tbgo9lkabnat2lo8Z ~]# gunzip redis-4.0.10.tar.gz
[root@iZwz97tbgo9lkabnat2lo8Z ~]# ls redis*
redis-4.0.10.tar
- 歸檔和解歸檔 - tar。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# tar -xvf redis-4.0.10.tar
redis-4.0.10/
redis-4.0.10/.gitignore
redis-4.0.10/00-RELEASENOTES
redis-4.0.10/BUGS
redis-4.0.10/CONTRIBUTING
redis-4.0.10/COPYING
redis-4.0.10/INSTALL
redis-4.0.10/MANIFESTO
redis-4.0.10/Makefile
redis-4.0.10/README.md
redis-4.0.10/deps/
redis-4.0.10/deps/Makefile
redis-4.0.10/deps/README.md
...
說明:歸檔(也稱為建立歸檔)和解歸檔都使用
tar
命令,通常建立歸檔需要-cvf
三個引數,其中c
表示建立(create),v
表示顯示建立歸檔詳情(verbose),f
表示指定歸檔的檔案(file);解歸檔需要加上-xvf
引數,其中x
表示抽取(extract),其他兩個引數跟建立歸檔相同。
- 將標準輸入轉成命令列引數 - xargs。
下面的命令會將查詢當前路徑下的html檔案,然後通過xargs
將這些檔案作為引數傳給rm
命令,實現查詢並刪除檔案的操作。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# find . -type f -name "*.html" | xargs rm -f
下面的命令將a.txt檔案中的多行內容變成一行輸出到b.txt檔案中,其中<
表示從a.txt中讀取輸入,>
表示將命令的執行結果輸出到b.txt中。
[root@iZwz97tbgo9lkabnat2lo8Z ~]# xargs < a.txt > b.txt
說明:這個命令就像上面演示的那樣常在管道(實現程式間通訊的一種方式)和重定向(重新指定輸入輸出的位置)操作中用到,後面的內容中會講到管道操作和輸入輸出重定向操作。
-
顯示檔案或目錄 - basename / dirname。
-
其他相關工具。
- sort - 對內容排序
- uniq - 去掉相鄰重複內容
- tr - 替換指定內容為新內容
- cut / paste - 剪下/黏貼內容
- split - 拆分檔案
- file - 判斷檔案型別
- wc - 統計檔案行數、單詞數、位元組數
- iconv - 編碼轉換
[root ~]# cat foo.txt
grape
apple
pitaya
[root ~]# cat bar.txt
100
200
300
400
[root ~]# paste foo.txt bar.txt
grape 100
apple 200
pitaya 300
400
[root ~]# paste foo.txt bar.txt > hello.txt
[root ~]# cut -b 4-8 hello.txt
pe 10
le 20
aya 3
0
[root ~]# cat hello.txt | tr '\t' ','
grape,100
apple,200
pitaya,300
,400
[root ~]# split -l 100 sohu.html hello
[root ~]# wget https://www.baidu.com/img/bd_logo1.png
[root ~]# file bd_logo1.png
bd_logo1.png: PNG image data, 540 x 258, 8-bit colormap, non-interlaced
[root ~]# wc sohu.html
2979 6355 212527 sohu.html
[root ~]# wc -l sohu.html
2979 sohu.html
[root ~]# wget http://www.qq.com -O qq.html
[root ~]# iconv -f gb2312 -t utf-8 qq.html
管道和重定向
-
管道的使用 - |。
例子:查詢當前目錄下檔案個數。
[root ~]# find ./ | wc -l 6152
例子:列出當前路徑下的檔案和資料夾,給每一項加一個編號。
[root ~]# ls | cat -n 1 dump.rdb 2 mongodb-3.6.5 3 Python-3.6.5 4 redis-3.2.11 5 redis.conf
例子:查詢record.log中包含AAA,但不包含BBB的記錄的總數
[root ~]# cat record.log | grep AAA | grep -v BBB | wc -l
-
輸出重定向和錯誤重定向 - > / >> / 2>。
[root ~]# cat readme.txt banana apple grape apple grape watermelon pear pitaya [root ~]# cat readme.txt | sort | uniq > result.txt [root ~]# cat result.txt apple banana grape pear pitaya watermelon
-
輸入重定向 - <。
[root ~]# echo 'hello, world!' > hello.txt [root ~]# wall < hello.txt [root ~]# Broadcast message from root (Wed Jun 20 19:43:05 2018): hello, world! [root ~]# echo 'I will show you some code.' >> hello.txt [root ~]# wall < hello.txt [root ~]# Broadcast message from root (Wed Jun 20 19:43:55 2018): hello, world! I will show you some code.
-
多重定向 - tee。
下面的命令除了在終端顯示命令
ls
的結果之外,還會追加輸出到ls.txt
檔案中。[root ~]# ls | tee -a ls.txt
別名
-
alias
[root ~]# alias ll='ls -l' [root ~]# alias frm='rm -rf' [root ~]# ll ... drwxr-xr-x 2 root root 4096 Jun 20 12:52 abc ... [root ~]# frm abc
-
unalias
[root ~]# unalias frm [root ~]# frm sohu.html -bash: frm: command not found
文字處理
-
字元流編輯器 - sed。
sed是操作、過濾和轉換文字內容的工具。假設有一個名為fruit.txt的檔案,內容如下所示。
[root ~]# cat -n fruit.txt 1 banana 2 grape 3 apple 4 watermelon 5 orange
接下來,我們在第2行後面新增一個pitaya。
[root ~]# sed '2a pitaya' fruit.txt banana grape pitaya apple watermelon orange
注意:剛才的命令和之前我們講過的很多命令一樣並沒有改變fruit.txt檔案,而是將新增了新行的內容輸出到終端中,如果想儲存到fruit.txt中,可以使用輸出重定向操作。
在第2行前面插入一個waxberry。
[root ~]# sed '2i waxberry' fruit.txt banana waxberry grape apple watermelon orange
刪除第3行。
[root ~]# sed '3d' fruit.txt banana grape watermelon orange
刪除第2行到第4行。
[root ~]# sed '2,4d' fruit.txt banana orange
將文字中的字元a替換為@。
[root ~]# sed 's#a#@#' fruit.txt b@nana gr@pe @pple w@termelon or@nge
將文字中的字元a替換為@,使用全域性模式。
[root ~]# sed 's#a#@#g' fruit.txt b@n@n@ gr@pe @pple w@termelon or@nge
-
模式匹配和處理語言 - awk。
awk是一種程式語言,也是Linux系統中處理文字最為強大的工具,它的作者之一和現在的維護者就是之前提到過的Brian Kernighan(ken和dmr最親密的夥伴)。通過該命令可以從文字中提取出指定的列、用正規表示式從文字中取出我們想要的內容、顯示指定的行以及進行統計和運算,總之它非常強大。
假設有一個名為fruit2.txt的檔案,內容如下所示。
[root ~]# cat fruit2.txt 1 banana 120 2 grape 500 3 apple 1230 4 watermelon 80 5 orange 400
顯示檔案的第3行。
[root ~]# awk 'NR==3' fruit2.txt 3 apple 1230
顯示檔案的第2列。
[root ~]# awk '{print $2}' fruit2.txt banana grape apple watermelon orange
顯示檔案的最後一列。
[root ~]# awk '{print $NF}' fruit2.txt 120 500 1230 80 400
輸出末尾數字大於等於300的行。
[root ~]# awk '{if($3 >= 300) {print $0}}' fruit2.txt 2 grape 500 3 apple 1230 5 orange 400
上面展示的只是awk命令的冰山一角,更多的內容留給讀者自己在實踐中去探索。
使用者管理
-
建立和刪除使用者 - useradd / userdel。
[root home]# useradd hellokitty [root home]# userdel hellokitty
-d
- 建立使用者時為使用者指定使用者主目錄-g
- 建立使用者時指定使用者所屬的使用者組
-
建立和刪除使用者組 - groupadd / groupdel。
說明:使用者組主要是為了方便對一個組裡面所有使用者的管理。
-
修改密碼 - passwd。
[root ~]# passwd hellokitty New password: Retype new password: passwd: all authentication tokens updated successfully.
說明:輸入密碼和確認密碼沒有回顯且必須一氣呵成的輸入完成(不能使用退格鍵),密碼和確認密碼需要一致。如果使用
passwd
命令時沒有指定命令作用的物件,則表示要修改當前使用者的密碼。如果想批量修改使用者密碼,可以使用chpasswd
命令。-l
/-u
- 鎖定/解鎖使用者。-d
- 清除使用者密碼。-e
- 設定密碼立即過期,使用者登入時會強制要求修改密碼。-i
- 設定密碼過期多少天以後禁用該使用者。
-
檢視和修改密碼有效期 - chage。
設定hellokitty使用者100天后必須修改密碼,過期前15天通知該使用者,過期後15天禁用該使用者。
chage -M 100 -W 15 -I 15 hellokitty
-
切換使用者 - su。
[root ~]# su hellokitty [hellokitty root]$
-
以管理員身份執行命令 - sudo。
[hellokitty ~]$ ls /root ls: cannot open directory /root: Permission denied [hellokitty ~]$ sudo ls /root [sudo] password for hellokitty:
說明:如果希望使用者能夠以管理員身份執行命令,使用者必須要出現在sudoers名單中,sudoers檔案在
/etc
目錄下,如果希望直接編輯該檔案也可以使用下面的命令。 -
編輯sudoers檔案 - visudo。
這裡使用的編輯器是vi,關於vi的知識在後面有講解。該檔案的部分內容如下所示:
## Allow root to run any commands anywhere root ALL=(ALL) ALL ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL ## Allows members of the users group to mount and unmount the ## cdrom as root # %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom ## Allows members of the users group to shutdown this system # %users localhost=/sbin/shutdown -h now
-
顯示使用者與使用者組的資訊 - id。
-
給其他使用者發訊息 -write / wall。
傳送方:
[root ~]# write hellokitty Dinner is on me. Call me at 6pm.
接收方:
[hellokitty ~]$ Message from root on pts/0 at 17:41 ... Dinner is on me. Call me at 6pm. EOF
-
檢視/設定是否接收其他使用者傳送的訊息 - mesg。
[hellokitty ~]$ mesg
is y
[hellokitty ~]$ mesg n
[hellokitty ~]$ mesg
is n
檔案系統
檔案和路徑
- 命名規則:檔名的最大長度與檔案系統型別有關,一般情況下,檔名不應該超過255個字元,雖然絕大多數的字元都可以用於檔名,但是最好使用英文大小寫字母、數字、下劃線、點這樣的符號。檔名中雖然可以使用空格,但應該儘可能避免使用空格,否則在輸入檔名時需要用將檔名放在雙引號中或者通過
\
對空格進行轉義。 - 副檔名:在Linux系統下檔案的副檔名是可選的,但是使用副檔名有助於對檔案內容的理解。有些應用程式要通過副檔名來識別檔案,但是更多的應用程式並不依賴檔案的副檔名,就像
file
命令在識別檔案時並不是依據副檔名來判定檔案的型別。 - 隱藏檔案:以點開頭的檔案在Linux系統中是隱藏檔案(不可見檔案)。
目錄結構
- /bin - 基本命令的二進位制檔案。
- /boot - 引導載入程式的靜態檔案。
- /dev - 裝置檔案。
- /etc - 配置檔案。
- /home - 普通使用者主目錄的父目錄。
- /lib - 共享庫檔案。
- /lib64 - 共享64位庫檔案。
- /lost+found - 存放未連結檔案。
- /media - 自動識別裝置的掛載目錄。
- /mnt - 臨時掛載檔案系統的掛載點。
- /opt - 可選外掛軟體包安裝位置。
- /proc - 核心和程式資訊。
- /root - 超級管理員使用者主目錄。
- /run - 存放系統執行時需要的東西。
- /sbin - 超級使用者的二進位制檔案。
- /sys - 裝置的偽檔案系統。
- /tmp - 臨時資料夾。
- /usr - 使用者應用目錄。
- /var - 變數資料目錄。
訪問許可權
-
chmod - 改變檔案模式位元。
[root ~]# ls -l ... -rw-r--r-- 1 root root 211878 Jun 19 16:06 sohu.html ... [root ~]# chmod g+w,o+w sohu.html [root ~]# ls -l ... -rw-rw-rw- 1 root root 211878 Jun 19 16:06 sohu.html ... [root ~]# chmod 644 sohu.html [root ~]# ls -l ... -rw-r--r-- 1 root root 211878 Jun 19 16:06 sohu.html ...
說明:通過上面的例子可以看出,用
chmod
改變檔案模式位元有兩種方式:一種是字元設定法,另一種是數字設定法。除了chmod
之外,可以通過umask
來設定哪些許可權將在新檔案的預設許可權中被刪除。長格式檢視目錄或檔案時顯示結果及其對應許可權的數值如下表所示。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Rc0ma4yM-1611237558252)(./res/file-mode.png)]
-
chown - 改變檔案所有者。
[root ~]# ls -l ... -rw-r--r-- 1 root root 54 Jun 20 10:06 readme.txt ... [root ~]# chown hellokitty readme.txt [root ~]# ls -l ... -rw-r--r-- 1 hellokitty root 54 Jun 20 10:06 readme.txt ...
-
chgrp - 改變使用者組。
磁碟管理
-
列出檔案系統的磁碟使用狀況 - df。
[root ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 5.0G 33G 14% / devtmpfs 486M 0 486M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 356K 496M 1% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup tmpfs 100M 0 100M 0% /run/user/0
-
磁碟分割槽表操作 - fdisk。
[root ~]# fdisk -l Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000a42f4 Device Boot Start End Blocks Id System /dev/vda1 * 2048 83884031 41940992 83 Linux Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
-
磁碟分割槽工具 - parted。
-
格式化檔案系統 - mkfs。
[root ~]# mkfs -t ext4 -v /dev/sdb
-t
- 指定檔案系統的型別。-c
- 建立檔案系統時檢查磁碟損壞情況。-v
- 顯示詳細資訊。
-
檔案系統檢查 - fsck。
-
轉換或拷貝檔案 - dd。
-
掛載/解除安裝 - mount / umount。
-
建立/啟用/關閉交換分割槽 - mkswap / swapon / swapoff。
說明:執行上面這些命令會帶有一定的風險,如果不清楚這些命令的用法,最好不用隨意使用,在使用的過程中,最好對照參考資料進行操作,並在操作前確認是否要這麼做。
編輯器 - vim
-
啟動vim。可以通過
vi
或vim
命令來啟動vim,啟動時可以指定檔名來開啟一個檔案,如果沒有指定檔名,也可以在儲存的時候指定檔名。[root ~]# vim guess.py
-
命令模式、編輯模式和末行模式:啟動vim進入的是命令模式(也稱為Normal模式),在命令模式下輸入英文字母
i
會進入編輯模式(Insert模式),螢幕下方出現-- INSERT --
提示;在編輯模式下按下Esc
會回到命令模式,此時如果輸入英文:
會進入末行模式,在末行模式下輸入q!
可以在不儲存當前工作的情況下強行退出vim;在命令模式下輸入v
會進入可視模式(Visual模式),可以用游標選擇一個區域再完成對應的操作。 -
儲存和退出vim:在命令模式下輸入
:
進入末行模式,輸入wq
可以實現儲存退出;如果想放棄編輯的內容輸入q!
強行退出,這一點剛才已經提到過了;在命令模式下也可以直接輸入ZZ
實現儲存退出。如果只想儲存檔案不退出,那麼可以在末行模式下輸入w
;可以在w
後面輸入空格再指定要儲存的檔名。 -
游標操作。
- 在命令模式下可以通過
h
、j
、k
、l
來控制游標向左、下、上、右的方向移動,可以在字母前輸入數字來表示移動的距離,例如:10h
表示向左移動10個字元。 - 在命令模式下可以通過
Ctrl+y
和Ctrl+e
來實現向上、向下滾動一行文字的操作,可以通過Ctrl+f
和Ctrl+b
來實現向前和向後翻頁的操作。 - 在命令模式下可以通過輸入英文字母
G
將游標移到檔案的末尾,可以通過gg
將游標移到檔案的開始,也可以通過在G
前輸入數字來將游標移動到指定的行。
- 在命令模式下可以通過
-
文字操作。
- 刪除:在命令模式下可以用
dd
來刪除整行;可以在dd
前加數字來指定刪除的行數;可以用d$
來實現刪除從游標處刪到行尾的操作,也可以通過d0
來實現從游標處刪到行首的操作;如果想刪除一個單詞,可以使用dw
;如果要刪除全文,可以在輸入:%d
(其中:
用來從命令模式進入末行模式)。 - 複製和貼上:在命令模式下可以用
yy
來複制整行;可以在yy
前加數字來指定複製的行數;可以通過p
將複製的內容貼上到游標所在的地方。 - 撤銷和恢復:在命令模式下輸入
u
可以撤銷之前的操作;通過Ctrl+r
可以恢復被撤銷的操作。 - 對內容進行排序:在命令模式下輸入
%!sort
。
- 刪除:在命令模式下可以用
-
查詢和替換。
- 查詢操作需要輸入
/
進入末行模式並提供正規表示式來匹配與之對應的內容,例如:/doc.*\.
,輸入n
來向前搜尋,也可以輸入N
來向後搜尋。 - 替換操作需要輸入
:
進入末行模式並指定搜尋的範圍、正規表示式以及替換後的內容和匹配選項,例如::1,$s/doc.*/hello/gice
,其中:g
- global:全域性匹配。i
- ignore case:忽略大小寫匹配。c
- confirm:替換時需要確認。e
- error:忽略錯誤。
- 查詢操作需要輸入
-
引數設定:在輸入
:
進入末行模式後可以對vim進行設定。-
設定Tab鍵的空格數:
set ts=4
-
設定顯示/不顯示行號:
set nu
/set nonu
-
設定啟用/關閉高亮語法:
syntax on
/syntax off
-
設定顯示標尺(游標所在的行和列):
set ruler
-
設定啟用/關閉搜尋結果高亮:
set hls
/set nohls
說明:如果希望上面的這些設定在每次啟動vim時都能自動生效,需要將這些設定寫到使用者主目錄下的.vimrc檔案中。
-
-
高階技巧
-
比較多個檔案。
[root ~]# vim -d foo.txt bar.txt
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-gSQ8zSxR-1611237558253)(./res/vim-diff.png)]
-
開啟多個檔案。
[root ~]# vim foo.txt bar.txt hello.txt
啟動vim後只有一個視窗顯示的是foo.txt,可以在末行模式中輸入
ls
檢視到開啟的三個檔案,也可以在末行模式中輸入b <num>
來顯示另一個檔案,例如可以用:b 2
將bar.txt顯示出來,可以用:b 3
將hello.txt顯示出來。 -
拆分和切換視窗。
可以在末行模式中輸入
sp
或vs
來實現對視窗的水平或垂直拆分,這樣我們就可以同時開啟多個編輯視窗,通過按兩次Ctrl+w
就可以實現編輯視窗的切換,在一個視窗中執行退出操作只會關閉對應的視窗,其他的視窗繼續保留。[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-zrjOYT8V-1611237558253)(./res/vim-multi-window.png)]
-
對映快捷鍵:在vim下可以將一些常用操作對映為快捷鍵來提升工作效率。
-
例子1:在命令模式下輸入
F4
執行從第一行開始刪除10000行程式碼的操作。:map <F4> gg10000dd
。例子2:在編輯模式下輸入
__main
直接補全為if __name__ == '__main__':
。:inoremap __main if __name__ == '__main__':
說明:上面例子2的
inoremap
中的i
表示對映的鍵在編輯模式使用,nore
表示不要遞迴,這一點非常重要,否則如果鍵對應的內容中又出現鍵本身,就會引發遞迴(相當於進入了死迴圈)。如果希望對映的快捷鍵每次啟動vim時都能生效,需要將對映寫到使用者主目錄下的.vimrc檔案中。 -
-
錄製巨集。
-
在命令模式下輸入
qa
開始錄製巨集(其中a
是暫存器的名字,也可以是其他英文字母或0-9的數字)。 -
執行你的操作(游標操作、編輯操作等),這些操作都會被錄製下來。
-
如果錄製的操作已經完成了,按
q
結束錄製。 -
通過
@a
(a
是剛才使用的暫存器的名字)播放巨集,如果要多次執行巨集可以在前面加數字,例如100@a
表示將巨集播放100次。 -
可以試一試下面的例子來體驗錄製巨集的操作,該例子來源於Harttle Land網站,該網站上提供了很多關於vim的使用技巧,有興趣的可以瞭解一下。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Mjtvd84m-1611237558254)(./res/vim-macro.png)]
-
-
軟體安裝和配置
使用包管理工具
- yum - Yellowdog Updater Modified。
yum search
:搜尋軟體包,例如yum search nginx
。yum list installed
:列出已經安裝的軟體包,例如yum list installed | grep zlib
。yum install
:安裝軟體包,例如yum install nginx
。yum remove
:刪除軟體包,例如yum remove nginx
。yum update
:更新軟體包,例如yum update
可以更新所有軟體包,而yum update tar
只會更新tar。yum check-update
:檢查有哪些可以更新的軟體包。yum info
:顯示軟體包的相關資訊,例如yum info nginx
。
- rpm - Redhat Package Manager。
- 安裝軟體包:
rpm -ivh <packagename>.rpm
。 - 移除軟體包:
rpm -e <packagename>
。 - 查詢軟體包:
rpm -qa
,例如可以用rpm -qa | grep mysql
來檢查是否安裝了MySQL相關的軟體包。
- 安裝軟體包:
下面以Nginx為例,演示如何使用yum安裝軟體。
[root ~]# yum -y install nginx
...
Installed:
nginx.x86_64 1:1.12.2-2.el7
Dependency Installed:
nginx-all-modules.noarch 1:1.12.2-2.el7
nginx-mod-http-geoip.x86_64 1:1.12.2-2.el7
nginx-mod-http-image-filter.x86_64 1:1.12.2-2.el7
nginx-mod-http-perl.x86_64 1:1.12.2-2.el7
nginx-mod-http-xslt-filter.x86_64 1:1.12.2-2.el7
nginx-mod-mail.x86_64 1:1.12.2-2.el7
nginx-mod-stream.x86_64 1:1.12.2-2.el7
Complete!
[root ~]# yum info nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name : nginx
Arch : x86_64
Epoch : 1
Version : 1.12.2
Release : 2.el7
Size : 1.5 M
Repo : installed
From repo : epel
Summary : A high performance web server and reverse proxy server
URL : http://nginx.org/
License : BSD
Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
: IMAP protocols, with a strong focus on high concurrency, performance and low
: memory usage.
[root ~]# nginx -v
nginx version: nginx/1.12.2
移除Nginx。
[root ~]# yum -y remove nginx
下面以MySQL為例,演示如何使用rpm安裝軟體。要安裝MySQL需要先到MySQL官方網站下載對應的RPM檔案,當然要選擇和你使用的Linux系統對應的版本。MySQL現在是Oracle公司旗下的產品,在MySQL被收購後,MySQL的作者重新制作了一個MySQL的分支MariaDB,可以通過yum進行安裝。
[root mysql]# ls
mysql-community-client-5.7.22-1.el7.x86_64.rpm
mysql-community-common-5.7.22-1.el7.x86_64.rpm
mysql-community-libs-5.7.22-1.el7.x86_64.rpm
mysql-community-server-5.7.22-1.el7.x86_64.rpm
[root mysql]# yum -y remove mariadb-libs
[root mysql]# yum -y install libaio
[root mysql]#rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
...
[root mysql]#rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
...
[root mysql]#rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
...
[root mysql]#rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
...
說明:由於MySQL和MariaDB的底層依賴庫是有衝突的,所以上面我們首先用
yum
移除了名為mariadb-libs的依賴庫並安裝了名為libaio支援非同步I/O操作的依賴庫。關於MySQL和MariaDB之間的關係,可以閱讀維基百科上關於MariaDB的介紹。
移除安裝的MySQL。
[root ~]# rpm -qa | grep mysql | xargs rpm -e
下載解壓配置環境變數
下面以安裝MongoDB為例,演示這類軟體應該如何安裝。
[root ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
--2018-06-21 18:32:53-- https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
Resolving fastdl.mongodb.org (fastdl.mongodb.org)... 52.85.83.16, 52.85.83.228, 52.85.83.186, ...
Connecting to fastdl.mongodb.org (fastdl.mongodb.org)|52.85.83.16|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 100564462 (96M) [application/x-gzip]
Saving to: ‘mongodb-linux-x86_64-rhel70-3.6.5.tgz’
100%[==================================================>] 100,564,462 630KB/s in 2m 9s
2018-06-21 18:35:04 (760 KB/s) - ‘mongodb-linux-x86_64-rhel70-3.6.5.tgz’ saved [100564462/100564462]
[root ~]# gunzip mongodb-linux-x86_64-rhel70-3.6.5.tgz
[root ~]# tar -xvf mongodb-linux-x86_64-rhel70-3.6.5.tar
mongodb-linux-x86_64-rhel70-3.6.5/README
mongodb-linux-x86_64-rhel70-3.6.5/THIRD-PARTY-NOTICES
mongodb-linux-x86_64-rhel70-3.6.5/MPL-2
mongodb-linux-x86_64-rhel70-3.6.5/GNU-AGPL-3.0
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongodump
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongorestore
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoexport
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoimport
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongostat
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongotop
mongodb-linux-x86_64-rhel70-3.6.5/bin/bsondump
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongofiles
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoreplay
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoperf
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongod
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongos
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongo
mongodb-linux-x86_64-rhel70-3.6.5/bin/install_compass
[root ~]# vim .bash_profile
...
PATH=$PATH:$HOME/bin:$HOME/mongodb-linux-x86_64-rhel70-3.6.5/bin
export PATH
...
[root ~]# source .bash_profile
[root ~]# mongod --version
db version v3.6.5
git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
distmod: rhel70
distarch: x86_64
target_arch: x86_64
[root ~]# mongo --version
MongoDB shell version v3.6.5
git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
distmod: rhel70
distarch: x86_64
target_arch: x86_64
說明:當然也可以通過yum來安裝MongoDB,具體可以參照官方網站上給出的說明。
原始碼構建安裝
-
安裝Python 3.6。
[root ~]# yum install gcc [root ~]# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz [root ~]# gunzip Python-3.6.5.tgz [root ~]# tar -xvf Python-3.6.5.tar [root ~]# cd Python-3.6.5 [root ~]# ./configure --prefix=/usr/local/python36 --enable-optimizations [root ~]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel [root ~]# make && make install ... [root ~]# ln -s /usr/local/python36/bin/python3.6 /usr/bin/python3 [root ~]# python3 --version Python 3.6.5 [root ~]# python3 -m pip install -U pip [root ~]# pip3 --version
說明:上面在安裝好Python之後還需要註冊PATH環境變數,將Python安裝路徑下bin資料夾的絕對路徑註冊到PATH環境變數中。註冊環境變數可以修改使用者主目錄下的.bash_profile或者/etc目錄下的profile檔案,二者的區別在於前者相當於是使用者環境變數,而後者相當於是系統環境變數。
-
安裝Redis-3.2.12。
[root ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz [root ~]# gunzip redis-3.2.12.tar.gz [root ~]# tar -xvf redis-3.2.12.tar [root ~]# cd redis-3.2.12 [root ~]# make && make install [root ~]# redis-server --version Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=5bc5cd3c03d6ceb6 [root ~]# redis-cli --version redis-cli 3.2.12
配置服務
我們可以Linux系統下安裝和配置各種服務,也就是說我們可以把Linux系統打造成資料庫伺服器、Web伺服器、快取伺服器、檔案伺服器、訊息佇列伺服器等等。Linux下的大多數服務都被設定為守護程式(駐留在系統後臺執行,但不會因為服務還在執行而導致Linux無法停止執行),所以我們安裝的服務通常名字後面都有一個字母d
,它是英文單詞daemon
的縮寫,例如:防火牆服務叫firewalld,我們之前安裝的MySQL服務叫mysqld,Apache伺服器叫httpd等。在安裝好服務之後,可以使用systemctl
命令或service
命令來完成對服務的啟動、停止等操作,具體操作如下所示。
-
啟動防火牆服務。
[root ~]# systemctl start firewalld
-
終止防火牆服務。
[root ~]# systemctl stop firewalld
-
重啟防火牆服務。
[root ~]# systemctl restart firewalld
-
檢視防火牆服務狀態。
[root ~]# systemctl status firewalld
-
設定/禁用防火牆服務開機自啟。
[root ~]# systemctl enable firewalld Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service. Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service. [root ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
計劃任務
-
在指定的時間執行命令。
- at - 將任務排隊,在指定的時間執行。
- atq - 檢視待執行的任務佇列。
- atrm - 從佇列中刪除待執行的任務。
指定3天以後下午5點要執行的任務。
[root ~]# at 5pm+3days at> rm -f /root/*.html at> <EOT> job 9 at Wed Jun 5 17:00:00 2019
檢視待執行的任務佇列。
[root ~]# atq 9 Wed Jun 5 17:00:00 2019 a root
從佇列中刪除指定的任務。
[root ~]$ atrm 9
-
計劃任務表 - crontab。
[root ~]# crontab -e * * * * * echo "hello, world!" >> /root/hello.txt 59 23 * * * rm -f /root/*.log
說明:輸入
crontab -e
命令會開啟vim來編輯Cron表示式並指定觸發的任務,上面我們定製了兩個計劃任務,一個是每分鐘向/root目錄下的hello.txt中追加輸出hello, world!
;另一個是每天23時59分執行刪除/root目錄下以log為字尾名的檔案。如果不知道Cron表示式如何書寫,可以參照/etc/crontab檔案中的提示(下面會講到)或者用搜尋引擎找一下“Cron表示式線上生成器”來生成Cron表示式。和crontab相關的檔案在
/etc
目錄下,通過修改/etc
目錄下的crontab檔案也能夠定製計劃任務。[root ~]# cd /etc [root etc]# ls -l | grep cron -rw-------. 1 root root 541 Aug 3 2017 anacrontab drwxr-xr-x. 2 root root 4096 Mar 27 11:56 cron.d drwxr-xr-x. 2 root root 4096 Mar 27 11:51 cron.daily -rw-------. 1 root root 0 Aug 3 2017 cron.deny drwxr-xr-x. 2 root root 4096 Mar 27 11:50 cron.hourly drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.monthly -rw-r--r-- 1 root root 493 Jun 23 15:09 crontab drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.weekly [root etc]# vim crontab 1 SHELL=/bin/bash 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 3 MAILTO=root 4 5 # For details see man 4 crontabs 6 7 # Example of job definition: 8 # .---------------- minute (0 - 59) 9 # | .------------- hour (0 - 23) 10 # | | .---------- day of month (1 - 31) 11 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 12 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 13 # | | | | | 14 # * * * * * user-name command to be executed
網路訪問和管理
-
安全遠端連線 - ssh。
[root ~]$ ssh root@120.77.222.217 The authenticity of host '120.77.222.217 (120.77.222.217)' can't be established. ECDSA key fingerprint is SHA256:BhUhykv+FvnIL03I9cLRpWpaCxI91m9n7zBWrcXRa8w. ECDSA key fingerprint is MD5:cc:85:e9:f0:d7:07:1a:26:41:92:77:6b:7f:a0:92:65. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '120.77.222.217' (ECDSA) to the list of known hosts. root@120.77.222.217's password:
-
通過網路獲取資源 - wget。
- -b 後臺下載模式
- -O 下載到指定的目錄
- -r 遞迴下載
-
傳送和接收郵件 - mail。
-
網路配置工具(舊) - ifconfig。
[root ~]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.61.250 netmask 255.255.240.0 broadcast 172.18.63.255 ether 00:16:3e:02:b6:46 txqueuelen 1000 (Ethernet) RX packets 1067841 bytes 1296732947 (1.2 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 409912 bytes 43569163 (41.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions
-
網路配置工具(新) - ip。
[root ~]# ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:16:3e:02:b6:46 brd ff:ff:ff:ff:ff:ff inet 172.18.61.250/20 brd 172.18.63.255 scope global eth0 valid_lft forever preferred_lft forever
-
網路可達性檢查 - ping。
[root ~]# ping www.baidu.com -c 3 PING www.a.shifen.com (220.181.111.188) 56(84) bytes of data. 64 bytes from 220.181.111.188 (220.181.111.188): icmp_seq=1 ttl=51 time=36.3 ms 64 bytes from 220.181.111.188 (220.181.111.188): icmp_seq=2 ttl=51 time=36.4 ms 64 bytes from 220.181.111.188 (220.181.111.188): icmp_seq=3 ttl=51 time=36.4 ms --- www.a.shifen.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 36.392/36.406/36.427/0.156 ms
-
顯示或管理路由表 - route。
-
檢視網路服務和埠 - netstat / ss。
[root ~]# netstat -nap | grep nginx
-
網路監聽抓包 - tcpdump。
-
安全檔案拷貝 - scp。
[root ~]# scp root@1.2.3.4:/root/guido.jpg hellokitty@4.3.2.1:/home/hellokitty/pic.jpg
-
檔案同步工具 - rsync。
說明:使用
rsync
可以實現檔案的自動同步,這個對於檔案伺服器來說相當重要。關於這個命令的用法,我們在後面講專案部署的時候為大家詳細說明。 -
安全檔案傳輸 - sftp。
[root ~]# sftp root@1.2.3.4 root@1.2.3.4's password: Connected to 1.2.3.4. sftp>
-
help
:顯示幫助資訊。 -
ls
/lls
:顯示遠端/本地目錄列表。 -
cd
/lcd
:切換遠端/本地路徑。 -
mkdir
/lmkdir
:建立遠端/本地目錄。 -
pwd
/lpwd
:顯示遠端/本地當前工作目錄。 -
get
:下載檔案。 -
put
:上傳檔案。 -
rm
:刪除遠端檔案。 -
bye
/exit
/quit
:退出sftp。
-
程式管理
-
檢視程式 - ps。
[root ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jun23 ? 00:00:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0 0 Jun23 ? 00:00:00 [kthreadd] ... [root ~]# ps -ef | grep mysqld root 4943 4581 0 22:45 pts/0 00:00:00 grep --color=auto mysqld mysql 25257 1 0 Jun25 ? 00:00:39 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
-
顯示程式狀態樹 - pstree。
[root ~]# pstree systemd─┬─AliYunDun───18*[{AliYunDun}] ├─AliYunDunUpdate───3*[{AliYunDunUpdate}] ├─2*[agetty] ├─aliyun-service───2*[{aliyun-service}] ├─atd ├─auditd───{auditd} ├─dbus-daemon ├─dhclient ├─irqbalance ├─lvmetad ├─mysqld───28*[{mysqld}] ├─nginx───2*[nginx] ├─ntpd ├─polkitd───6*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─tuned───4*[{tuned}]
-
查詢與指定條件匹配的程式 - pgrep。
[root ~]$ pgrep mysqld 3584
-
通過程式號終止程式 - kill。
[root ~]$ 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 [root ~]# kill 1234 [root ~]# kill -9 1234
例子:用一條命令強制終止正在執行的Redis程式。
ps -ef | grep redis | grep -v grep | awk '{print $2}' | xargs kill
-
通過程式名終止程式 - killall / pkill。
結束名為mysqld的程式。
[root ~]# pkill mysqld
結束hellokitty使用者的所有程式。
[root ~]# pkill -u hellokitty
說明:這樣的操作會讓hellokitty使用者和伺服器斷開連線。
-
將程式置於後臺執行。
Ctrl+Z
- 快捷鍵,用於停止程式並置於後臺。&
- 將程式置於後臺執行。
[root ~]# mongod & [root ~]# redis-server ... ^Z [4]+ Stopped redis-server
-
查詢後臺程式 - jobs。
[root ~]# jobs [2] Running mongod & [3]- Stopped cat [4]+ Stopped redis-server
-
讓程式在後臺繼續執行 - bg。
[root ~]# bg %4 [4]+ redis-server & [root ~]# jobs [2] Running mongod & [3]+ Stopped cat [4]- Running redis-server &
-
將後臺程式置於前臺 - fg。
[root ~]# fg %4 redis-server
說明:置於前臺的程式可以使用
Ctrl+C
來終止它。 -
調整程式/程式執行時優先順序 - nice / renice。
-
使用者登出後程式繼續工作 - nohup。
[root ~]# nohup ping www.baidu.com > result.txt &
-
跟蹤程式系統呼叫情況 - strace。
[root ~]# pgrep mysqld 8803 [root ~]# strace -c -p 8803 strace: Process 8803 attached ^Cstrace: Process 8803 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 99.18 0.005719 5719 1 restart_syscall 0.49 0.000028 28 1 mprotect 0.24 0.000014 14 1 clone 0.05 0.000003 3 1 mmap 0.03 0.000002 2 1 accept ------ ----------- ----------- --------- --------- ---------------- 100.00 0.005766 5 total
說明:這個命令的用法和引數都比較複雜,建議大家在真正用到這個命令的時候再根據實際需要進行了解。
-
檢視當前執行級別 - runlevel。
[root ~]# runlevel N 3
-
實時監控程式佔用資源狀況 - top。
[root ~]# top top - 23:04:23 up 3 days, 14:10, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 65 total, 1 running, 64 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1016168 total, 191060 free, 324700 used, 500408 buff/cache KiB Swap: 0 total, 0 free, 0 used. 530944 avail Mem ...
-c
- 顯示程式的整個路徑。-d
- 指定兩次刷屏之間的間隔時間(秒為單位)。-i
- 不顯示閒置程式或殭屍程式。-p
- 顯示指定程式的資訊。
系統診斷
-
系統啟動異常診斷 - dmesg。
-
檢視系統活動資訊 - sar。
[root ~]# sar -u -r 5 10 Linux 3.10.0-957.10.1.el7.x86_64 (izwz97tbgo9lkabnat2lo8z) 06/02/2019 _x86_64_ (2 CPU) 06:48:30 PM CPU %user %nice %system %iowait %steal %idle 06:48:35 PM all 0.10 0.00 0.10 0.00 0.00 99.80 06:48:30 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 06:48:35 PM 1772012 2108392 54.33 102816 1634528 784940 20.23 793328 1164704 0
-A
- 顯示所有裝置(CPU、記憶體、磁碟)的執行狀況。-u
- 顯示所有CPU的負載情況。-d
- 顯示所有磁碟的使用情況。-r
- 顯示記憶體的使用情況。-n
- 顯示網路執行狀態。
-
檢視記憶體使用情況 - free。
[root ~]# free total used free shared buff/cache available Mem: 1016168 323924 190452 356 501792 531800 Swap: 0 0 0
-
虛擬記憶體統計 - vmstat。
[root ~]# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 204020 79036 667532 0 0 5 18 101 58 1 0 99 0 0
-
CPU資訊統計 - mpstat。
[root ~]# mpstat Linux 3.10.0-957.5.1.el7.x86_64 (iZ8vba0s66jjlfmo601w4xZ) 05/30/2019 _x86_64_ (1 CPU) 01:51:54 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 01:51:54 AM all 0.71 0.00 0.17 0.04 0.00 0.00 0.00 0.00 0.00 99.07
-
檢視程式使用記憶體狀況 - pmap。
[root ~]# ps PID TTY TIME CMD 4581 pts/0 00:00:00 bash 5664 pts/0 00:00:00 ps [root ~]# pmap 4581 4581: -bash 0000000000400000 884K r-x-- bash 00000000006dc000 4K r---- bash 00000000006dd000 36K rw--- bash 00000000006e6000 24K rw--- [ anon ] 0000000001de0000 400K rw--- [ anon ] 00007f82fe805000 48K r-x-- libnss_files-2.17.so 00007f82fe811000 2044K ----- libnss_files-2.17.so ...
-
報告裝置CPU和I/O統計資訊 - iostat。
[root ~]# iostat Linux 3.10.0-693.11.1.el7.x86_64 (iZwz97tbgo9lkabnat2lo8Z) 06/26/2018 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.79 0.00 0.20 0.04 0.00 98.97 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn vda 0.85 6.78 21.32 2106565 6623024 vdb 0.00 0.01 0.00 2088 0
-
顯示所有PCI裝置 - lspci。
[root ~]# lspci 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) 00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] 00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] 00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) 00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03) 00:02.0 VGA compatible controller: Cirrus Logic GD 5446 00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device 00:04.0 Communication controller: Red Hat, Inc. Virtio console 00:05.0 SCSI storage controller: Red Hat, Inc. Virtio block device 00:06.0 SCSI storage controller: Red Hat, Inc. Virtio block device 00:07.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
-
顯示程式間通訊設施的狀態 - ipcs。
[root ~]# ipcs ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status ------ Semaphore Arrays -------- key semid owner perms nsems
Shell程式設計
之前我們提到過,Shell是一個連線使用者和作業系統的應用程式,它提供了人機互動的介面(介面),使用者通過這個介面訪問作業系統核心的服務。Shell指令碼是一種為Shell編寫的指令碼程式,我們可以通過Shell指令碼來進行系統管理,同時也可以通過它進行檔案操作。總之,編寫Shell指令碼對於使用Linux系統的人來說,應該是一項標配技能。
網際網路上有大量關於Shell指令碼的相關知識,我不打算再此對Shell指令碼做一個全面系統的講解,我們通過下面的程式碼來感性的認識下Shell指令碼就行了。
例子1:輸入兩個整數m和n,計算從m到n的整數求和的結果。
#!/usr/bin/bash
printf 'm = '
read m
printf 'n = '
read n
a=$m
sum=0
while [ $a -le $n ]
do
sum=$[ sum + a ]
a=$[ a + 1 ]
done
echo '結果: '$sum
例子2:自動建立資料夾和指定數量的檔案。
#!/usr/bin/bash
printf '輸入資料夾名: '
read dir
printf '輸入檔名: '
read file
printf '輸入檔案數量(<1000): '
read num
if [ $num -ge 1000 ]
then
echo '檔案數量不能超過1000'
else
if [ -e $dir -a -d $dir ]
then
rm -rf $dir
else
if [ -e $dir -a -f $dir ]
then
rm -f $dir
fi
fi
mkdir -p $dir
index=1
while [ $index -le $num ]
do
if [ $index -lt 10 ]
then
pre='00'
elif [ $index -lt 100 ]
then
pre='0'
else
pre=''
fi
touch $dir'/'$file'_'$pre$index
index=$[ index + 1 ]
done
fi
例子3:自動安裝指定版本的Redis。
#!/usr/bin/bash
install_redis() {
if ! which redis-server > /dev/null
then
cd /root
wget $1$2'.tar.gz' >> install.log
gunzip /root/$2'.tar.gz'
tar -xf /root/$2'.tar'
cd /root/$2
make >> install.log
make install >> install.log
echo '安裝完成'
else
echo '已經安裝過Redis'
fi
}
install_redis 'http://download.redis.io/releases/' $1
相關資源
-
Linux命令列常用快捷鍵
快捷鍵 功能說明 tab 自動補全命令或路徑 Ctrl+a 將游標移動到命令列行首 Ctrl+e 將游標移動到命令列行尾 Ctrl+f 將游標向右移動一個字元 Ctrl+b 將游標向左移動一個字元 Ctrl+k 剪下從游標到行尾的字元 Ctrl+u 剪下從游標到行首的字元 Ctrl+w 剪下游標前面的一個單詞 Ctrl+y 複製剪下命名剪下的內容 Ctrl+c 中斷正在執行的任務 Ctrl+h 刪除游標前面的一個字元 Ctrl+d 退出當前命令列 Ctrl+r 搜尋歷史命令 Ctrl+g 退出歷史命令搜尋 Ctrl+l 清除螢幕上所有內容在螢幕的最上方開啟一個新行 Ctrl+s 鎖定終端使之暫時無法輸入內容 Ctrl+q 退出終端鎖定 Ctrl+z 將正在終端執行的任務停下來放到後臺 !! 執行上一條命令 !數字 執行數字對應的歷史命令 !字母 執行最近的以字母打頭的命令 !$ / Esc+. 獲得上一條命令最後一個引數 Esc+b 移動到當前單詞的開頭 Esc+f 移動到當前單詞的結尾 -
man查閱命令手冊的內容說明
手冊中的標題 功能說明 NAME 命令的說明和介紹 SYNOPSIS 使用該命令的基本語法 DESCRIPTION 使用該命令的詳細描述,各個引數的作用,有時候這些資訊會出現在OPTIONS中 OPTIONS 命令相關引數選項的說明 EXAMPLES 使用該命令的參考例子 EXIT STATUS 命令結束的退出狀態碼,通常0表示成功執行 SEE ALSO 和命令相關的其他命令或資訊 BUGS 和命令相關的缺陷的描述 AUTHOR 該命令的作者介紹