超有用的linux筆記

itbsl發表於2021-01-11

名詞解釋

根目錄說明

tree -L 1

.
├── bin -> usr/bin # 英語binary的縮寫,表示”二進位制檔案“,bin目錄包含了會被所有使用者使用的可執行程式
├── boot # 英語boot表示”啟動“,boot目錄包含與Linux啟動密切相關的檔案
├── dev # 英語device的縮寫, 表示”裝置“,包含外設,它裡面的子目錄,每一個對應一個外設
├── etc # etc目錄包含系統的配置檔案,按照原始Unix的說法,這下面都是一堆零零碎碎的東西,就叫etc好了,是歷史遺留問題
├── home # 英語home表示”家“,使用者的私人目錄,在home目錄中,我們放置私人的檔案
├── lib -> usr/lib # 英語library的縮寫,表示”庫“,目錄包含被程式所呼叫的庫檔案,以.so結尾的檔案
├── lib64 -> usr/lib64
├── media # 英語media表示”媒體“,可移動的外設(USB盤,SD卡,DVD,光碟等)插入電腦時可以讓我們通過media的子目錄來訪問這些外設的內容
├── mnt # mnt是英語mount的縮寫,表示”掛載“,有點類似media目錄,但一般用於臨時掛載一些裝置
├── opt # 英語 optional application software package的縮寫,表示”可選的軟體包“,用於安裝多數第三方軟體和外掛
├── proc
├── root
├── run
├── sbin -> usr/sbin # 英語system binary的縮寫, 表示”系統二進位制檔案“ ,包含系統級的重要可執行程式
├── srv # 英語service的縮寫,表示”服務“,包含一些網路服務啟動之後所需要取用的資料
├── sys
├── tmp # 英語temporary的縮寫,表示”臨時的“,普通使用者和程式存放臨時檔案的地方
├── usr # 是英語Unix Software Resource的縮寫,表示”Unix作業系統軟體資源“,目錄裡安裝了大部分使用者需要呼叫的程式
└── var # 英語variable的縮寫,表示”動態的,可變的“,var通常包含程式的資料,比如log(日誌)檔案,記錄電腦了發生了什麼事

掛載

所謂的掛載就是利用一個目錄當成進入點,將磁碟分割槽的資料放置在該目錄下;也就是說進入該目錄就可以讀取該分割槽的意思。這個操作我們稱為掛載,那個進入點的目錄我們稱為掛載點

shell

當談到命令時,我們實際上指的是shellshell是一個接收由鍵盤輸入的命令,並將其傳遞給作業系統來執行的程式。幾乎所有的Linux發行版都提供shell程式,該程式來自於稱之為bash的GNU專案。bash是Bourne Again Shell的首字母縮寫,Bourne Again Shell基於這樣一個事實,即bash是sh的增強版本,而sh是最初的UNIX shell程式,由Steve Bourne編寫。

終端

當使用圖形使用者介面時,需要另一種叫做終端模擬器(terminal emulator)的程式與shell進行互動。如果我們仔細檢視桌面選單,那麼很可能會找到一個款終端模擬器。在KDE環境下使用的是konsole,而在GNOME環境下使用的是gonme-terminal,但在桌面選單上很可能將它們簡單地統稱為終端。在Linux系統中,還有許多其他的終端模擬器可以使用,但是它們基本上都做同樣的事情:讓使用者訪問shell

硬體相關

修改主機名

檢視當前主機名

hostname

臨時修改主機名:

hostname new_name(新主機名)

上面的修改方式屬於臨時修改,系統重啟後失效,如果想要永久性修改主機名,那麼就需要修改配置檔案

  • 在CentOS6中,需要修改 /etc/sysconfig/network檔案
  • 在CentOS7中,需要修改 /etc/hostname檔案

檢視CentOS版本

cat /etc/redhat-release

檢視CPU總核數

# 表示一顆CPU四核
grep processor /proc/cpuinfo |wc -l
grep -c processor /proc/cpuinfo

校正CentOS7時間

GPS系統中有兩種時間區分,UTC就0時區的時間,CST為本地時間,如北京為早上八點(東八區),UTC時間比北京時晚八小時;
CST:Central Standard Time,UTC+8:00 中央標準時間
UTC:Universal Time Coordinated 世界協調時間

# 安裝ntp軟體包
sudo yum -y install ntp

# 設定ntp開機自啟
systemctl enable ntpd.service

# 啟動ntp服務
sudo service ntpd.service restart

如果需要配置CTS時間,需要建立如下軟連結

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

如果需要配置UTC時間,需要建立如下軟連結

ln -sf /usr/share/zoneinfo/Universal /etc/localtime

修改檔案最大開啟數

linux修改檔案最大開啟數量的方法,預設情況下是1024的。

我們可以使用 ulimit -n命令檢視

如果我們想臨時修改,可以使用 ulimit -n 數量來修改,不過系統重啟後修改會丟失

如果想永久修改,需要修改/etc/security/limits.conf檔案

修改系統埠最大監聽佇列的長度

在linux中,/proc/sys/net/core/somaxconn這個引數,定義了系統中每一個埠最大的監聽佇列的長度,這是個全域性的引數,預設值為128。

somaxconn限制了接收新 TCP 連線偵聽佇列的大小。對於一個經常處理新連線的高負載 web服務環境來說,預設的 128 太小了。大多數環境這個值建議增加到 1024 或者更多。 服務程式會自己限制偵聽佇列的大小(例如 sendmail(8) 或者 Apache),常常在它們的配置檔案中有設定佇列大小的選項。大的偵聽佇列對防止拒絕服務 DoS 攻擊也會有所幫助。

vim /etc/sysctl.conf
# 新增
net.core.somaxconn = 1024

然後執行sysctl -p使配置生效。

修改核心記憶體分配策略

overcommit_memory是一個核心對記憶體分配的一種策略。 具體可見/proc/sys/vm/overcommit_memory下的值

overcommit_memory取值又三種分別為0,1,2

  • overcommit_memory=0,表示核心將檢查是否有足夠的可用記憶體供應用程式使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程式。
  • overcommit_memory=1,表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
  • overcommit_memory=2, 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體。

當我們啟動redis服務時,會報警告,翻譯為【“警告超限”記憶體設定為0!在記憶體不足的情況下,後臺儲存可能會失敗。若要解決此問題,請將“vm.overcommit_memory=1”新增到/etc/sysctl.conf,然後重新啟動或執行命令“sysctl vm.overcommit_memory=1”以使其生效。】

vim /etc/sysctl.conf
# 新增
vm.overcommit_memory = 1

然後執行sysctl -p使配置生效。

vim編輯器

基本上vi共分為3種模式,分別是一般命令模式、編輯模式與命令列模式

一般命令模式(command mode)

以vi開啟一個檔案就直接進入一般命令模式了(這是預設的模式,也成為一般模式)。在這個模式中,你可以使用【上下左右】按鍵來移動游標,你可以使用【刪除字元】或【刪除整行】來處理檔案內容,也可以使用【複製、貼上】來處理你的檔案內容。

編輯模式(insert mode)

在一般命令模式中可以進行刪除、複製、貼上等的操作,但是卻無法編輯檔案的內容。要等到你按下【i、I、o、O、a、A、r、R】等任何一個字母之後才會進入編輯模式。注意了,通常在Linux中,按下這些按鍵時,在介面的左下方會出現【INSERT】或【REPLACE】的字樣,此時才可以進行編輯,而如果要回到一般命令模式時,則必須要按下【Esc】這個按鍵即可退出編輯模式。

命令列模式(command-line mode)

在一般模式當中,輸入【??】三個中的任何一個按鈕,就可以將游標移動到最下面的一行。在這個模式當中,可以提供你【查詢資料】的操作,而讀取、儲存、批量字元替換、退出vi、顯示行號等的操作則是在此模式中完成。

一般命令模式可與編輯模式及命令列模式切換,但編輯模式與命令列模式之間不可互相切換。

常用vim命令:

插入命令:

命令 說明
i 當前位置插入
I 行首插入
a 當前位置後插入
A 行尾插入
o 下一新行插入
O 上一新行插入
s 刪除游標所在的字元,當前位置插入
S 刪除游標所在行,當前行插入

移動游標:

命令 說明
h 游標左移
j 游標下移
k 游標上移
l 游標右移
^ 游標移動到行首
$ 游標移動到行尾
gg 游標移動到檔案首行
G 游標移動到檔案尾行
ngg n為數字,移動到這個檔案的第n行
nG n為數字,移動到這個檔案的第n行

查詢與替換:

命令 說明
/word 向游標之下尋找一個名稱為word的字串。例如要在檔案內查詢itbsl這個字串,就輸入/itbsl即可(常用)
?word 向游標之上尋找一個字元名稱為word的字串
n 這個n是英文按鍵,代表【重複前一個查詢的操作】。舉例來說,如果剛剛我們執行/itbsl去向下查詢itbsl這個字串,則按下n後,會向下繼續查詢下一個名稱為itbsl的字串,如果是執行?itbsl的話,那麼按下n則會向上繼續查詢名稱為itbsl的字串
N 這個N是英文按鍵,與n剛好相反,為【反向】進行前一個查詢操作,例如/itbsl後,按下N則表示【向上】查詢itbsl
:n1,n2s/word1/word2/g n1與n2為數字,在第n1與n2行之間尋找word1這個字串,並將該字串替換為word2,舉例來說,在100到200行之間查詢itbsl並替換為ITBSL,則 :100,200s/itbsl/ITBSL/g(常用)
:1,$s/word1/word2/g 從第一行到最後一行尋找word1字串,並將該字串替換為word2(常用)
:1,$s/word1/word2/gc 從第一行到最後一行尋找word1字串,並將該字串替換為word2,且在替換前顯示提示字元給使用者確認(confirm)是否需要替換(常用)

刪除、複製與貼上:

命令 說明
xX 在一行當中,x為向後刪除一個字元(相當於[del]按鍵),X為向前刪除一個字元(相當於[Backspace]即退格鍵)(常用)
nx n為數字,連續向後刪除n個字元。舉例來說,我要連續刪除10個字元,【10x】
dd 刪除(剪下)游標所在的那一整行(常用)
ndd n為數字,刪除(剪下)游標所在的向下n行,例如20dd則是刪除(剪下)20行(常用)
d1G 刪除(剪下)游標所在到第一行的所有資料
dG 刪除(剪下)游標所在到最後一行的所有資料
d$ 刪除(剪下)游標所在處,到該行的最後一個字元
d0 刪除(剪下)游標所在處,到該行的最前面的一個字元
yy 複製游標所在的那一行(常用)
nyy n為數字,複製游標所在的向下n行,例如20yy則是複製20行(常用)
y1G 複製游標所在行到第一行的所有資料
yG 複製游標所在行到最後一樣的所有資料
y0 複製游標所在的那個字元到該行行首的所有資料
y$ 複製游標所在的那個字元到該行行尾的所有資料
yw 拷貝一個單詞
nyw 拷貝n個單詞(n表示數字)
p 後置貼上
P 前置貼上

儲存:

命令 說明
:w 直接儲存
:w file 儲存成新檔案

退出:

命令 說明
:q 退出

強制執行:

命令 說明
:wq! 強制儲存退出
:q! 強制退出

顯示行號:

命令 說明
:set nu 顯示行號

配置系統:

  • 全域性配置
    /etc/virc
  • 使用者級別
    ~/vimrc

vim搜尋

命令 說明
/字串 比如搜尋user,輸入/user

按下回車之後,可以看到vim已經把游標移動到該字元處和高亮了匹配的字串
檢視下一個匹配,按下n(小寫n)
跳轉到上一個匹配,按下N(大寫N)
搜尋後,我們開啟別的檔案,發現也被高亮了,怎麼關閉高亮?
命令模式下,輸入:nohlsearch 也可以:set nohlsearch; 當然,可以簡寫,noh或者 set noh

Linux檔案操作

實用快捷鍵

Ctrl+L:清理終端的內容,就是清屏的作用。同clear命令

Ctrl+D:給終端傳遞EOF(End Of File,檔案結束符)

Shift+PgUp:用於向上滾屏,與滑鼠的滾輪向上滾屏是一個效果

Shift+PgDn:用於向下滾屏,與滑鼠的滾輪向下滾屏是一個效果

Ctrl+A:游標跳到一行命令的開頭。Home鍵有相同的效果

Ctr+E:游標跳到一行命令的結尾。End鍵具有相同的效果

Ctrl+U:刪除所有游標左側的命令字元

Ctrl+K:刪除所有在游標右側的命令字元

Ctrl+W:刪除游標左側的一個”單詞“

Ctrl+Y:貼上,用Ctrl+U,Ctrl+K

locate:快速查詢

locate命令用於定位要查詢的檔案,而且此命令很快,”locate“是英語”定位“的意思

用法:

終端會列出所有包含了search_content的檔案和目錄

locate search_content

在使用locate命令查詢檔案時,大家可能會遇到這樣的問題

我剛建立的檔案,為什麼用locate命令查詢不到呢?

這正好是locate命令的缺陷,locate命令不會對你實際的整個硬碟進行查詢,而是在檔案的資料庫裡查詢記錄,locate命令的原理如下圖所示

對於剛建立不就的檔案,因為它們還沒有被收錄進檔案資料庫,因此locate命令就找不到其索引,自然就不會反悔任何結果

linux系統一般每天會更新一次檔案資料庫,因此,只要你隔24小時再用locate查詢,應該就能找到你剛建立的檔案了,但是,你可能不想等這麼久,因此也提供了updatedb命令強制系統立即更新檔案資料庫,updatedb命令只能由root使用者執行,這個命令執行需要一點時間,一旦執行成功,就可以使用locate命令查詢剛剛建立的檔案了,locate命令會列出所有在檔案資料庫中找到的內容,有時候結果太多了,太繁雜了,而且locate命令還不能找到一天之內建立的檔案,所以系統提供了另一個查詢的命令find

find:深入查詢

find命令是查詢檔案的利器,find是英語”找到“的意思,而且它可以讓我們對每個找到的檔案做後續的操作,與locate命令不同,find命令不會在檔案資料庫中查詢檔案的記錄,而是遍歷你的實際硬碟

用法:

# 與locate命令不同的是,find命令只會查詢完全符合名字的檔案
find 查詢目錄(預設當前目錄) -name "檔名"

# 不過也可以用萬用字元 *來匹配多個名稱
# 在/var/log目錄下查詢以syslog開頭的檔案
find /var/log -name "syslog*"

# 根據檔案大小查詢
# 查詢/var/log中大小超過10M的檔案
# -size:size指定查詢檔案的大小(M兆,K千位元組,G千兆位元組)
find /var/log -size +10M

# 查詢小於50M的
find /var/log -size -50M

# 查詢等於20M的
find /var/log -size 20M

# 根據檔案最近訪問時間查詢
# -atime引數:atime是access和time的縮寫,表示訪問時間
# -atime引數後面緊跟的-7表示7天之內,減號的作用表示小於
find /var/log -name "*.txt" -atime -7

# 僅查詢目錄或檔案
# -type d:只查詢目錄型別。d是directory的首字母,表示”目錄“
# -type f:只查詢檔案型別。f是file的首字母,表示“檔案”
# 如果不用-type引數指定型別,那麼find命令預設是查詢目錄和檔案
find /var/log -name "file" -type d

# 刪除查詢到的檔案
# -delete引數:
find /var/log -name "*.jpg" -delete

# 呼叫命令
# -exec引數:使用-exec引數,可以後接一個命令,對每個查詢到的檔案進行操作
# exec是execute的縮寫,是英語“執行”的意思
# 假如要將/var/log目錄下的所有查詢到的txt檔案的訪問許可權都改為600
find /var/log -name "*.txt" -exec chmod 600 {}\;
# 你可以將-exec引數換成-ok引數,用法一樣,只不過-ok引數會對每一個查詢到的檔案都確認提示

ls:列出檔案和目錄

ls是list的縮寫,是英語“列出”的意思,用於列出檔案和目錄

ls -a:列出所有的目錄和檔案,包括隱藏的,包含.和..

ls -A:列出所有的目錄和檔案,包括隱藏的,不包含.和..

ls -l:列出一個顯示檔案和目錄的詳細資訊的列表

ls -lh:h是human readable的縮寫,表示“適合人類閱讀的”

ls -lt:t是time的縮寫,表示時間,按檔案最近一次修改時間排序

du:顯示目錄包含的檔案大小

du是英語disk usage的縮寫,表示“磁碟使用/佔用”,du命令可以讓我們知道檔案和目錄所佔的空間大小

相比ls -l命令,du命令統計的才是真正的檔案大小

du命令會深入遍歷每個目錄的子目錄,統計所有檔案的大小

du -h:以適合人類閱讀的方式展示

預設情況下,du命令只顯示目錄的大小,如果加上-a引數,則會顯示目錄和檔案的大小

du -s:只顯示統計大小

du -sh:顯示統計大小(以適合人類閱讀的方式)

cat:顯示檔案內容

cat命令可以一次性在終端中顯示檔案的所有內容,cat是concatenate的縮寫,表示“連線/串聯”

cat -n:顯示檔案內容時帶上行號

適合檔案內容比較少的檔案如果檔案比較大,更適合用less命令

less:顯示檔案內容

和cat命令最大的區別:less會一頁一頁的顯示檔案內容,還有一個more命令,more是“更多”,less是“更少”

more命令和less命令功能類似,more沒有less那麼強大,比如more命令不能往後翻頁,只能往前

less命令中最基本最常用的快捷鍵

空格鍵:檔案內容讀取下一個終端螢幕的行數,相當於前進一個螢幕(頁),與鍵盤上的PageDown(下一頁)效果一樣

Enter鍵:讀取下一行檔案內容,也就是前進一行

d鍵:前進半頁(半個螢幕)

b鍵:後退一頁。與鍵盤上的PageUp(上一頁)效果一樣

y鍵:後退一行。與鍵盤上的向上效果是一樣的

u鍵:後退半頁(半個螢幕)

q鍵:停止讀取檔案,終止less命令

=鍵:顯示你在檔案的什麼位置,會顯示當前頁面的內容是檔案中第幾行到第幾行,整個檔案所含行數,所含字元數

h鍵:顯示幫助文件。按q鍵退出幫助文件

/:進入搜尋模式,在斜槓後面輸入你要搜尋的檔案,按下Enter鍵,就會把所有符合的結果都標識出來,要在搜尋所得結果中跳轉,可以按n鍵,跳到下一個符合專案,按N鍵跳到上一個符合專案

head:顯示檔案的開頭

head在英語中是“頭部”的意思,顧名思義,這個命令用於顯示檔案的開頭,預設情況下,head會顯示檔案的頭10行

head -n 數字:指定顯示的行數

tail:顯示檔案的結尾

tail在英語中是“尾部”的意思,顧名思義,這個命令用於顯示檔案的結尾,預設情況下,tail會顯示檔案結尾的最後10行內容

tail -n 數字:指定顯示的行數

tail命令還可以配合-f引數來實時追蹤檔案的更新,可以用快捷鍵Ctrl+c來終止tail -f命令

預設地,tail -f會每過1秒檢查一下檔案是否有新內容

可以指定間隔檢查的秒數,用-s引數:tail -f -s 4 檔名

touch:建立一個空白檔案

touch命令其實一開始的設計初衷是修改檔案的時間戳,就是可以修改檔案的建立時間或修改時間,讓電腦以為檔案是在那個時候被建立或修改的

如果touch命令後面跟著的檔名是不存在的檔案,它會建立一個

mkdir:建立一個目錄

mkdir命令就是用於建立一個目錄的,mkdir是mk和dir的縮寫。mk是make的縮寫,表示建立

索要建立的目錄的名字裡有空格怎麼辦呢?加上引號

還可以用-p引數來遞迴建立目錄結構:mkdir -p one/two/three

cp:拷貝檔案或目錄

cp是英語copy的縮寫,表示“拷貝”,cp命令不僅可以拷貝單個檔案,還可以拷貝多個檔案,也可以拷貝目錄

拷貝目錄,只要在cp命令之後加上-r或者-R引數,r大寫和小寫作用是一樣的,都表示recursive,也就是遞迴的,拷貝的時候,目錄中的所有內容(子目錄和檔案)都會被拷貝

使用萬用字元*:cp*.txt folder表示把當前目錄下所有以.txt結尾的檔案都拷貝到folder目錄中,cp ha* folder表示把當前目錄所有以ha開頭的檔案都拷貝到folder目錄中

rm:刪除檔案和目錄

rm是英語remove的縮寫,表示“移除”,這個命令就是用來刪除東西的

rm -i:向使用者確認是否刪除,保險起見,用rm命令刪除檔案時,可以加上-i引數,這樣對於每個要刪除的檔案,終端都會詢問我們是否確定刪除

rm -f:慎用,不會詢問是否刪除,強制刪除

rm -rf:遞迴刪除,千萬不要做 rm -rf /*或 rm -rf /

ln:建立連結

ln是link的縮寫,在英語中表示“連結”,ln命令用於在檔案之間建立連結(快捷方式)

在Linux下連結有兩種型別:

  • Physical link:物理連結或硬連結
  • Symbolic link:符號連結或軟連結

在linux中,檔案在硬碟上的儲存分兩部分:檔名和檔案內容,檔名的列表是儲存在硬碟的其它地方的,和檔案內容分開存放,方便linux管理

其實每個檔案有三部分:檔名、許可權和檔案內容,我們這裡簡化地將檔案分為兩部分:檔名和檔案內容

每個檔案的檔案內容被分配到一個標號號碼,就是inode,因此每個檔名都繫結到它的檔案內容(用inode標識)

硬連結

用法:

ln file1 file2

如果我們刪除了file1,那麼對file2沒什麼影響,刪除file2對file1也沒有什麼影響,我們可以理解為用rm命令就是斷開了檔名和檔案內容之間的那根線,

對於硬連結來說,刪除任意一方的檔案,共同指向的檔案內容並不會從硬碟上被刪除

硬連結原理:使連結的兩個檔案共享同樣檔案內容,就是同樣的inode,一旦兩個檔案之間有了硬連結,那麼修改其中一個檔案,修改的是相同的一塊內容,只不過我們可以用兩個檔名來獲取到檔案內容

硬連結缺陷:只能建立指向檔案的硬連結,不能建立指向目錄的(通過一些引數的修改,也可以建立指向目錄的硬連結,但是比較複雜),軟連結可以指向檔案或目錄,對於目錄,一般都是用軟連結

可以用ls -i命令檢視一下(-i引數可以顯示檔案的inode)

軟連線

軟連結才真正像我們在windows下的快捷方式,原理很相似

用法:

ln -s file1 file2

建立硬連結時ln不帶任何引數,建立軟連線需要加上-s引數

軟連結的特點:如果我們刪除了file2,沒什麼大不了的,file1不會受到影響,如果刪除file1,file2會變成“死連結”,因為指向的檔案不見了

grep:篩選資料

grep是Globally search a Regular Expression and Print的縮寫,意思是“全域性搜尋一個正規表示式,並且列印”,grep的功能簡單說是在檔案中查詢關鍵字,並顯示關鍵字所在的行

用法:

grep 搜尋內容 要被搜尋的檔案

# -i引數:忽略大小寫,預設情況下,grep命令是區分大小寫的,i是英語ignore的縮寫,表示“忽略”
grep -i

# -n引數:顯示行號,-n引數的作用很簡單,就是顯示搜尋到的文字所在的行,n是英語number的縮寫,表示“數字,編號”
grep -n
# 示例
grep -n search_content /etc/profile

# -v引數:只顯示文字不在的行,v是invert的縮寫,表示“顛倒,倒置”
grep -v
# 示例
grep -v search_content /etc/profile

# -r引數:在所有子目錄和子檔案中查詢
grep -r
# 示例
grep -r "hello world" /folder

# 正則查詢
# ^匹配行首 
grep -E ^path /etc/profle

# 包含Path和path的會被搜尋到
grep -E [Pp]ath /etc/profile

# 包含a-zA-Z之間任意字母的都可以被搜尋到
grep -E [a-zA-Z] /etc/profile
# 在CentOS中,不加-E也是可以的

wc:檔案統計

wc是word count的縮寫,不僅可以用來統計單詞數目,還可以用來統計行數、字元數、位元組數等

用法:

# wc命令顯示的三個數字分別是 行數 單詞數 位元組數 檔名
wc 檔名
# -l引數:統計行數,l是英語“line”的縮寫,表示“行”
wc -l test.txt

# -w引數:統計單詞數,w是“word”的縮寫,表示“單詞”
wc -w test.txt

# -c引數:統計位元組數,c是“character”的縮寫,表示“字元”
wc -c text.txt

示例:

uniq:刪除檔案中的重複內容

uniq是英語unique的縮寫,表示“獨一無二的”,unique命令有點“呆”,只能將連續的重複行變為一行

用法:

uniq 檔名
# -c引數:統計重複的行數,c是統計count的縮寫,表示“統計,計數”
uniq -c test.txt

# -d引數:只顯示重複的行的值,d是duplicated的縮寫,表示“重複的”
uniq -d test

示例:

scp:網間拷貝

scp是Secure Copy的縮寫,表示”安全拷貝“,scp可以使我們通過網路,把檔案從一臺電腦拷貝到另一臺電腦

scp是基於SSH(Secure Shell)的原理來運作的,SSH會在兩臺通過網路連線的電腦之間建立一條安全通訊的通道,scp就利用這條管道安全地拷貝檔案

用法:

# source_file表示原始檔,destination_file就是目標檔案
# 這兩個檔案都可以用如下方式來表示 user@ip:file_name
# []以及括號內的內容可以省略,預設是22埠,和SSH一樣
scp [-P 埠號] source_file destination_file

rsync:同步備份

rsync是remote synchronize的縮寫,remote表示”遠端“,synchronize表示”同步“

因此rsync命令主要用於”遠端同步檔案“,如果系統沒有rsync命令,可以安裝

sudo yum install rsync

rsync可以使我們同步兩個目錄,不管這兩個目錄位於同一臺電腦還是不同的電腦(用網路連線)

rsync應該是最change用於”增量備份“的命令了,增量備份(incremental backup)是備份的一種型別,指在一次全備份或上一次增量備份後

用法:

# 將images目錄下的所有檔案備份到backups目錄下
rsync -arv images/ backups/

# -a:保留檔案的所有資訊,包括許可權、修改日期等
# -r:遞迴呼叫。表示子目錄下的所有檔案都包括
# -v:冗餘模式。輸出詳細操作資訊,v是verbose的縮寫,是”冗餘“的意思
# 預設地,rsync在同步時並不會刪除目標目錄的檔案
# 例如,你的源目錄(被同步目錄)中刪除了一個檔案,但是rsync同步時,它不會刪除同步目錄中的相同檔案
rsync -arv --delete images/ joey@172.16.147.128:backups/

你可以自己配置rsync,使得它從指定目錄(可以是多個目錄)備份到指定IP地址的目錄下,而且可以指定哪些型別檔案是要備份的,哪些型別不要備份,然後把這一長串命令同意用shell指令碼來寫成一個檔案(例如取名叫backup),使之可執行(用chmod + x命令),再把這個檔案的路徑新增到PATH環境變數中

使用者群組系統

sudo -i:切換到root身份

sudo 是英語Substitute User DO的縮寫,substitute是”替換,代替、替身“的意思,user是”使用者“的意思,do是”做“的意思,連在一起就是”替換使用者來執行...“的意思

終端會提示你輸入密碼,至少第一次會要求輸入密碼,此密碼是你個人的密碼。

useradd:新增新使用者

user是英語”使用者“的意思,add是英語”新增“的意思

useradd用於新增使用者。用法:命令後接要建立的使用者名稱

用法:

useradd joey

passwd:設定/修改密碼

passwd是password這個英語單詞的縮寫,表示”密碼“

用法:

passwd joey

userdel:刪除使用者

單單用userdel命令,不加引數的話,只會刪除使用者,但是不會刪除在/home目錄中的使用者家目錄

如果想要連次使用者的家目錄頁一併刪除的話,可以加上-r或-remove這個引數

用法:

userdel -r joey
userdel -remove joey

groupadd:建立群組

groupadd是group和add的縮寫,group是英語”群組“的意思,add是英語”新增“的意思

groupadd命令用於新增一個新的群組

用法:

groupadd 組名
# 示例:
groupadd friends

usermod:修改使用者

usermod是user和modify的縮寫,user是用於”使用者“的意思,modify是”修改“的意思

usermod命令用於修改使用者的賬戶

用法:

usermod
# -l引數:對使用者重新命名,/home中的家目錄名不改變,需要手動修改
# -g引數:修改使用者所在群組
# 將joey的所屬於組改為friends
usermod -g friends joey

# -G引數:將一個使用者新增到多個群組,群組名之間用逗號分隔,而且沒有空格
usermod -G group1,group2,group3

# -a引數:追加,如果想不離開原先的群組,又想加入新的群組,可以在-G的基礎上加上-a引數
usermod -aG group4,group5

groups:檢視使用者所屬組

用groups(”群組“)命令可以獲知一個使用者屬於哪個(些)群組

groups joey

groupdel:刪除群組

groupdel是group和delete的縮寫,group是英語”群組“的意思,delete是英語”刪除“的意思

groupdel命令用於刪除一個已存在的群組

groupdel group1

chown:改變檔案的所有者

chown命令用於改變檔案的所有者,需要root身份才能執行。chown是change和owner的縮寫。

用法:

chown 使用者 檔案
# chown也可以改變檔案的群組
chown 使用者:組 檔案
# -R引數:遞迴修改檔案所有者,只能是大寫,小寫不起作用,使得被修改的目錄的所有子目錄和檔案都改變所有者
chown -R 使用者 目錄

chgrp:改變檔案的群組

chgrp是change和group的縮寫,使用者改變檔案的群組

用法:

chgrp 群組名 檔名

chomod:修改訪問許可權

linux系統裡,每個檔案和目錄都有一列許可權樹形,訪問許可權知名了誰有讀/寫/執行的權利,chmod命令不需要是root使用者才能執行,只要你是此檔案所有者,就可以使用chmod來修改檔案的訪問許可權

chmod是change和mode的縮寫,change是英語”改變“的意思,mode是”模式“的意思

chmod命令用於修改檔案的各種訪問許可權

linux系統對每種許可權(r,w和x)分配了對應的數字

許可權 數字
r 4
w 2
x 1

要合併這些許可權,就需要做簡單的加法了。

訪問許可權有三組(所有者的許可權,群組的許可權,其它使用者的許可權)

用法:

# text.txt的所屬使用者有讀寫許可權,所屬組和其它使用者沒有任何許可權
chmod 600 text.txt

# -R引數:遞迴地修改訪問許可權
# chmod 配合 -R引數可以遞迴地修改檔案訪問許可權
chmod -R 700 /home/joey

除了使用者,可以用另一種方式來分配檔案的訪問許可權:用字母

u:user的縮寫,表示所有者

g:group的縮寫,表示群組使用者

o:other的縮寫,表示其它使用者

a:all的縮寫,表示所有使用者

+:加號,表示新增許可權

-:減號,表示減去許可權

-:等號,表示分配許可權

示例:

chmod u+rx file 檔案file的所有者增加讀和執行的許可權
chmod g+r file  檔案file的群組使用者增加讀的許可權
chmod o-r file  檔案file的其它使用者移除讀的許可權
chmod g+r o-r file 檔案file的群組使用者增加讀的許可權,其它使用者移除讀的許可權
chmod u=rwx,g=r,o=- file 檔案file的所有者分配讀、寫、執行的許可權,群組分配讀的許可權,其它使用者沒有任何許可權

軟體管理

軟體倉庫

在Red Hat一族裡,軟體包的字尾是.rpm,rpm是Red Hat Package Manager的縮寫,表示”紅帽軟體包管理器“,CentOS作為Red Hat一族的一員,也是用的.rpm的軟體包

用預設的官方版本是最好的,但是會比較卡,所以我們要學習如何切換軟體倉庫,CentOS系統使用的軟體倉庫的列表是記錄在一個檔案中,要編輯的那個包含軟體倉庫的列表的檔案是/etc/yum.repos.d/CentOS-Base.repo,這個檔案時系統檔案,只能被root使用者修改

修改CentOS7預設yum源為mirros.aliyun.com

# 1.備份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 2.下載新的CentOS-Base.repo 到 /etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 3.執行 yum makecache 生成快取
yum makecache

wget:下載檔案

wget可以使我們直接從終端控制檯下載檔案,只需要給出檔案的HTTP或FTP地址

用法:

wget addr
# -c引數:繼續一箇中斷的下載,c是英語continue的縮寫,表示”繼續“
wget -c https://www.php.net/distributions/php-7.4.14.tar.gz
# -O引數:重新命名(大寫字母O)
wget -c https://www.php.net/distributions/php-7.4.14.tar.gz -O php.tar.gz
# -o引數:儲存輸出日誌(小寫字母o)
wget -c https://www.php.net/distributions/php-7.4.14.tar.gz -O php.tar.gz -o wget.log

yum:包管理工具

yum是CentOS中的預設包管理工具

# 搜尋軟體包
sudo yum search

# 安裝軟體包
sudo yum install

# 刪除軟體包
sudo yum remove

# 本地的.rpm軟體包,可以用rpm命令來安裝
sudo rpm -ivh xxx.rpm  # 用於安裝
sudo rpm -e 包名        # 用於解除安裝

# 本地的.rpm軟體包,也可以用yum命令來安裝
sudo yum localinstall xxx.rpm  # 用於安裝
sudo yum remove 包名            # 用於解除安裝

程式和系統監測

w:都有誰,在做什麼?

user:當前登入的使用者

From:登入IP

load average:負載,後面的三個數表示1分鐘、5分鐘、15分鐘之內的平均負載

ps:程式的靜態列表

ps是Process Status的縮寫,process是英語“程式”的意思,status是“狀態”的意思

ps命令使用者顯示當前系統中的程式,ps命令顯示的程式列表不會隨著時間而更新,是靜態的

用法:

# 列出所有的程式
ps -ef

# 以喬木裝列出所有程式
ps -efH

# 列出某個使用者執行的程式
ps -u 使用者名稱

# 通過CPU和記憶體使用來過濾程式
ps -aux | less

# 根據CPU使用率來降序排序
ps -aux --sort -pcpu | less

# 根據記憶體使用率來降序排序
ps -aux --sort -pmem | less

# 以樹形結構顯示程式,和pstree效果類似
ps -axjf

top:程式的動態列表

q:退出top
h:顯示幫助文件,也就是哪些按鍵可以使用,按下任意鍵返回,按q回到top命令的主介面
B:大寫的B,加粗某些資訊
f/F:在程式列表中新增或刪除某些列
u:依照使用者來過濾顯示
k:結束某個程式
s:改變重新整理頁面的時間,預設地,頁面每隔3秒重新整理一次

netstat:網路統計

netstat命令很好記,它由兩部分組成:net和stat,net是network的縮寫,表示”網路“,stat是statistics的縮寫,表示”統計“

# 檢視命令執行的二進位制檔案在哪兒
which netstat
# 檢視這個二進位制屬於哪個rpm包
rpm -qf /usr/bin/netstat

netstat -i:列出電腦的所有網路介面的一些統計資訊

RX是receive(表示”接收“)的縮寫

TX是transmit(表示”傳送“)的縮寫

  • MTU:Maximum Transmission Unit的縮寫,表示”最大傳輸單元“,指一種通訊協議的某一層上能通過的最大資料包大小(單位是位元組)
  • RX-OK:在此介面接收的包中正確的包數,”OK“表示”沒問題的,好的“
  • RX-ERR:在此介面接收的包中錯誤的包數,”ERR“是error的縮寫,表示”錯誤“
  • RX-DRP:在此介面接收的包中丟棄的包數,”DRP“是drop的縮寫,表示”丟棄“
  • RX-OVR:在此介面接收的包中,由於過速而丟失的包數,”OVR“是over的縮寫, 表示”結束“
  • 類似的,TX-OK、TX-ERR、TX-DRP、TX-OVR表示在此介面傳送的包中對應的包數
# 列出所有開啟的連線
netstat -uta

# -u:顯示UDP連線
# -t:顯示TCP連線
# -a:不論連線狀態如何,都顯示

# 列出狀態是LISTEN的統計資訊
netstat -lt

# 列出總結性的統計資訊
netstat -s
#-s:s是summary的縮寫,表示”總結“

kill:殺死程式

有時候,系統會突然卡住。這在Linux中也是會發生的,在Linux中停止程式有幾種方法

kill是英語“殺死”的意思,有點“小暴力”

kill命令後接需要結束的程式號,也就是之前我們看到的PID,可以通過ps命令或top命令來獲知程式的PID

用法:

kill PID
# 殺死一個程式
kill 1024
# 殺死多個程式 程式號之間用空格隔開
kill 1024 2048
# kill -9 表示立即強制結束程式
kill -9 1024

注:Ctrl+C:停止終端中正在執行的程式,Ctrl+C可以比較有好地中止終端中正在執行的程式(程式)

&:在後臺執行程式

讓一個程式在厚愛執行有幾種方法

很簡單的一種:在你要執行的命令最後加上&這個符號

示例:

cp file.txt file-copy.txt &
sudo find / -name "*log" &
sudo find / -name "*log" > output_find &
sudo find / -name "*log" > output_find 2>&1 &

nohup:使程式與終端分離

&符號雖然常用,但卻有一個不可忽視的缺點,就是後臺程式與終端相關聯,一旦終端關閉或者使用者登出,程式就自動結束,想讓程式在以上情況下繼續在後臺執行

需要用到nohup命名,當使用者登出(logout)或者網路斷開時,終端會收到HUP(hangup的縮寫,”結束通話“的意思)訊號從而關閉所有子程式,終端被關閉時也會關閉其子程式,可以使用nohup命令使命令不受HUP訊號影響

man nohup
nohup cp file.txt file-copy.txt

場景:我現在需要跑指令碼批量處理一些資料,但是我又不想盯著控制檯看這個指令碼的輸出結果,想把這些輸出結果記錄到一個日誌檔案裡面

方案:可以使用 Linux 的 nohup 命令,把程式掛起,後臺執行

用法:

nohup XXXXXX.sh >> /runtime/deletedata.log &

執行結果(這個數字是程式號):

[1] 13120

有時候可能會報一個提示:

nohup: ignoring input and redirecting stderr to stdout

這個影響不大,不用緊張,也可以加多一個 2>&1 就不會出現這個問題

用法:

nohup XXXXXX.sh >> /runtime/deletedata.log 2>&1 &

TIPS:命令最後面的 & 符號是切換到後臺去跑,退出終端也不會退出任務程式

執行這個命令之後呢,會輸出一個程式號,類似上面的輸出,可以使用 top 命令檢視執行中的程式,也可以用 ps -aux 檢視程式

想要終止這個程式的話只能殺死這個程式,使用 kill 指令處理

kill -9 程式號

TIPS:如果程式掛不起來,可能是埠被佔用了,自行排查處理便可

killall:結束多個程式

同一個程式執行時可能啟動多個程式,一個更快捷的命令是:killall,all是英語“全部”的意思

killall命令就是用於結束全部要結束的程式,不同於kill命令,killall命令後接程式名,而不是PID

host:檢視域名對應IP

用法:

host www.baidu.com

whois:瞭解有關域名的資訊

sudo yum install whois
whois www.baidu.com

halt:關機

需要以root身份才能關閉系統

sudo halt

reboot:重啟系統

需要以root身份才能重啟系統

sudo reboot

poweroff:關機

poweroff命令也可以用於關機,直接執行即可關機,不需要root身份:poweroff

iproute2對決net-tools

原文地址:iproute2 對決 net-tools

如今很多系統管理員依然通過組合使用諸如ifconfig、route、arp和netstat等命令列工具(統稱為net-tools)來配置網路功能,解決網路故障。net-tools起源於BSD的TCP/IP工具箱,後來成為老版本Linux核心中配置網路功能的工具。但自2001年起,Linux社群已經對其停止維護。同時,一些Linux發行版比如Arch Linux和CentOS/RHEL 7則已經完全拋棄了net-tools,只支援iproute2。

作為網路配置工具的一份子,iproute2的出現旨在從功能上取代net-tools。net-tools通過procfs(/proc)和ioctl系統呼叫去訪問和改變核心網路配置,而iproute2則通過netlink套接字介面與核心通訊。拋開效能而言,iproute2的使用者介面比net-tools顯得更加直觀。比如,各種網路資源(如link、IP地址、路由和隧道等)均使用合適的物件抽象去定義,使得使用者可使用一致的語法去管理不同的物件。更重要的是,到目前為止,iproute2仍處在持續開發中。

如果你仍在使用net-tools,而且尤其需要跟上新版Linux核心中的最新最重要的網路特性的話,那麼是時候轉到iproute2的陣營了。原因就在於使用iproute2可以做很多net-tools無法做到的事情。

對於那些想要轉到使用iproute2的使用者,有必要了解下面有關net-tools和iproute2的眾多對比。

顯示所有已連線的網路介面

使用net-tools:

ifconfig -a

使用iproute2:

ip link show

啟用或停用網路介面

使用這些命令來啟用或停用某個指定的網路介面。

使用net-tools:

sudo ifconfig eth1 up
sudo ifocnfig eth1 down

使用iproute2:

sudo ip link set down eth1
sudo ip link set up   eth1

為網路介面分配IPv4地址

使用這些命令配置網路介面的IPv4地址。

使用net-tools:

sudo ifconfig eth1 10.0.0.1/24 

使用iproute2:

sudo ip addr add 10.0.0.1/24 dev eth1

值得注意的是,可以使用iproute2給同一個介面分配多個IP地址,ifconfig則無法這麼做。使用ifconfig的變通方案是使用IP別名

sudo ip addr add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1
sudo ip addr add 10.0.0.2/24 broadcast 10.0.0.255 dev eth1
sudo ip addr add 10.0.0.3/24 broadcast 10.0.0.255 dev eth1

移除網路介面的IPv4地址

就IP地址的移除而言,除了給介面分配全0地址外,net-tools沒有提供任何合適的方法來移除網路介面的IPv4地址。相反,iproute2則能很好地完全。

使用net-tools:

sudo ifconfig eth1 0 

使用iproute2:

sudo ip addr del 10.0.0.1/24 dev eth1 

顯示網路介面的IPv4地址

按照如下操作可檢視某個指定網路介面的IPv4地址。

使用net-tools:

ifconfig eth1

使用iproute2:

ip addr show dev eth1

同樣,如果介面分配了多個IP地址,iproute2會顯示出所有地址,而net-tools只能顯示一個IP地址。

為網路介面分配IPv6地址

使用這些命令為網路介面新增IPv6地址。net-tools和iproute2都允許使用者為一個介面新增多個IPv6地址。

使用net-tools:

sudo ifconfig eth1 inet6 add 2002:0db5:0:f102::1/64
sudo ifconfig eth1 inet6 add 2003:0db5:0:f102::1/64

使用iproute2:

sudo ip -6 addr add 2002:0db5:0:f102::1/64 dev eth1
sudo ip -6 addr add 2003:0db5:0:f102::1/64 dev eth1

顯示網路介面的IPv6地址

按照如下操作可顯示某個指定網路介面的IPv6地址。net-tools和iproute2都可以顯示出所有已分配的IPv6地址。

使用net-tools:

ifconfig eth1

使用iproute2:

ip -6 addr show dev eth1

移除網路裝置的IPv6地址

使用這些命令可移除介面中不必要的IPv6地址。

使用net-tools:

sudo ifconfig eth1 inet6 del 2002:0db5:0:f102::1/64

使用iproute2:

sudo ip -6 addr del 2002:0db5:0:f102::1/64 dev eth1

改變網路介面的MAC地址

使用下面的命令可篡改網路介面的MAC地址,請注意在更改MAC地址前,需要停用介面。

使用net-tools:

sudo ifconfig eth1 hw ether 08:00:27:75:2a:66

使用iproute2:

sudo ip link set dev eth1 address 08:00:27:75:2a:67

檢視IP路由表

net-tools中有兩個選擇來顯示核心的IP路由表:route和netstat。在iproute2中,使用命令ip route。

使用net-tools:

route -n
netstat -rn

使用iproute2:

ip route show

新增和修改預設路由

這裡的命令用來新增或修改核心IP路由表中的預設路由規則。請注意在net-tools中可通過新增新的預設路由、刪除舊的預設路由來實現修改預設路由。在iproute2使用ip route命令來代替。

使用net-tools:

sudo route add default gw 192.168.1.2 eth0
sudo route del default gw 192.168.1.1 eth0

使用iproute2:

sudo ip route add default via 192.168.1.2 dev eth0
sudo ip route replace default via 192.168.1.2 dev eth0

新增和移除靜態路由

使用下面命令新增或移除一個靜態路由。

使用net-tools:

sudo route add -net 172.16.32.0/24 gw 192.168.1.1 dev eth0
sudo route del -net 172.16.32.0/24

使用iproute2:

sudo ip route add 172.16.32.0/24 via 192.168.1.1 dev eth0
sudo ip route del 172.16.32.0/24

檢視套接字統計資訊

這裡的命令用來檢視套接字統計資訊(比如活躍或監聽狀態的TCP/UDP套接字)。

使用net-tools:

netstat
netstat -l

使用iproute2:

ss
ss -l

檢視ARP表

使用這些命令顯示核心的ARP表。

使用net-tools:

arp -an

使用iproute2:

ip neigh

新增或刪除靜態ARP項

按照如下操作在本地ARP表中新增或刪除一個靜態ARP項

使用net-tools:

sudo arp -s 192.168.1.100 00:0c:29:c0:5a:ef
sudo arp -d 192.168.1.100

使用iproute2:

sudo ip neigh add 192.168.1.100 lladdr 00:0c:29:c0:5a:ef dev eth0
sudo ip neigh del 192.168.1.100 dev eth0

新增、刪除或檢視多播地址

使用下面的命令配置或檢視網路介面上的多播地址。

使用net-tools:

sudo ipmaddr add 33:44:00:00:00:01 dev eth0
sudo ipmaddr del 33:44:00:00:00:01 dev eth0
ipmaddr show dev eth0
netstat -g

使用iproute2:

sudo ip maddr add 33:44:00:00:00:01 dev eth0
sudo ip maddr del 33:44:00:00:00:01 dev eth0
ip maddr list dev eth0 

計劃任務(crontab)

在我們使用CentOS系統的過程中,我們會發現系統常常會主動的執行一些任務,這些任務到底是誰在設定工作的呢?如果你想要讓自己設計的備份程式可以自動地在系統下面執行,而不需要手動地啟動它,又該如何設定?這些計劃型的任務可能又分為【單一】任務與【迴圈】任務,在系統內有時哪些服務在負責?還有還有,如果你想要每年在老婆的生日前一天就發出一封郵件提醒自己不要忘記,可以辦得到嘛?嘿嘿!這些種種要如何處理,接來下我們就來了解了解。

什麼是計劃任務

每個人或多或少都有一些約會或是工作,有的工作是例行性的,例如每年一次的加薪、每個月一次的工作報告、每週一次的午餐彙報、每天需要的打卡等。有的工作則是臨時發生的,例如剛好總公司有高管來訪,需要你準備演講器材等。在生活上也有此類例行或臨時發生的事,例如每年愛人的生日、每天起床的時間等,要有突發性的電子產品大降價(真希望天天都有)等。

那麼Linux的例行性工作是如何實現的呢?我們們的Linux計劃任務是通過crontabat這兩個東西完成的。這兩個工具有啥異同?就讓我們先來看看。

Linux計劃任務的種類: at、cron

從上面的說明當中,我們可以很清楚地發現兩種計劃任務的方式。

  • 一種是例行性的,就是每隔一定的週期要來辦的事項。
  • 一種是突發性的,就是這次做完以後就沒有的那一種。

那麼在Linux下面如何處理這兩個功能?那就得使用atcrontab這兩個好東西。

  • at: at是個可以支援處理僅執行一次就結束的命令,不過要執行at時,必須要有atd這個服務的支援才行。在某些新版的Linux發行版中,atd可能預設並沒有啟動,那麼at這個命令就會失效,不過我們的CentOS預設是啟動的。
  • crontab: crontab這個命令所設定的任務將會迴圈地一直執行下去,可迴圈的時間為分鐘、小時、每週、每月或每年等。crontab除了可以使用命令執行外,亦可編輯/etc/crontab來支援,至於讓crontab可以生效的服務則是crond。

下面我們來談一談Linux的系統到底在做什麼事情,怎麼有若干計劃任務在執行呢?然後再回來談一談at與crontab這兩個好東西。

僅執行一次的計劃任務

首先,我們先來談一談單一計劃任務的執行,那就是at這個命令的執行。

atd的啟動方式

要使用單一計劃任務時,我們的Linux系統上班必須要有負責這類計劃任務的服務,那就是atd這個服務。不過並非所有的Linux發行版都預設啟動,所以,某些時刻我們必須要手動將它啟動才行。啟動的方法很簡單,就是這樣:

systemctl restart atd # 重新啟動atd這個服務
systemctl enable atd  # 讓這個服務開機就自動啟動
systemctl status atd  # 檢視一下atd目前的狀態

at的執行方式

既然是計劃任務,那麼應該會有產生任務的方式,並且將這些任務排進計劃列表中。OK!那麼產生任務的方式是怎麼執行的呢?事實上,我們使用at這個命令來產生所要執行的任務,並將這個任務一文字檔案的方式寫入/var/spool/at/目錄內,該任務便能等待atd這個服務的使用與執行了,就這麼簡單。

不過,並不是所有的人都可以執行at計劃任務。為什麼?因為安全的原因,很多主機被所謂的【劫持】後,最常發現的就是它們的系統當中多了很多的駭客(Cracker)程式,這些程式非常可能使用計劃任務來執行或蒐集系統資訊,並定時地返回給駭客團體。所以,除非是你認可的賬號。否則先不要讓它們使用at目錄。那怎麼實現對at的管控呢?

我麼可以利用/etc/at.allow/etc/at.deny這兩個檔案來實現對at的使用限制。加上這兩個檔案後,at的工作情況其實是這樣的:

  1. 先尋找/etc/at.allow這個檔案,寫在這個檔案中的使用者才能使用at,沒有在這個檔案中的使用者則不能使用at(即使沒有寫在at.deny當中)。
  2. 如果/etc/at.allow不存在,就查詢/etc/at.deny這個檔案,寫在這個at.deny中的使用者則不能使用at,而沒有寫在這個at.deny檔案中的使用者,就可以使用at
  3. 如果兩個檔案都不存在,那麼只有root可以使用at這個命令。

通過這個說明,我們知道/etc/at.allow是管理較為嚴格的方式,而/etc/at.deny則較為鬆散(因為賬號沒有在該檔案中,就能夠執行at了)。在一般的Linux發行版當中,由於假設系統上的所有使用者都是可信任的,因此係統通常會保留一個空的/etc/at.deny檔案,允許所有人使用at命令(您可以自行檢查一下該檔案)。不過,萬一你不希望某些使用者使用at的話,將那個使用者的賬號寫入/etc/at.deny即可,一個賬號寫一行。

迴圈執行的計劃任務

相對於at是僅執行一次的任務,迴圈執行的計劃任務則是由cron(crond)這個系統服務來控制的。剛剛談過Linux系統上面原本就有非常多的例行性計劃任務,因此這個系統服務預設啟動的。另外,由於使用者自己也可可以執行計劃任務,所以,Linux也提供使用者控制計劃任務的命令(crontab)。下面我們分別來聊一聊。

使用者的設定

使用者想要建立迴圈型計劃任務時,使用的是crontab這個命令。不過,為了避免安全性的問題,與at同樣的,我們可以限制使用crontab的使用者賬號。可以使用的配置檔案有:

  • /etc/cron.allow
    將可以使用crontab的賬號寫入其中,不在這個檔案內的使用者則不可使用crontab。
  • /etc/cron.deny
    將不可以使用的crontab的賬號寫入其中,未記錄到這個檔案當中的使用者,就可以使用crontab。

與at很像。同樣的,以優先順序來說,/etc/cron.allow比/etc/cron.deny要優先。而判斷上面,這兩個檔案只選擇一個來限制而已。因此,建議你只要保留一個即可,免得影響自己在設定上面的判斷。一般來說,系統預設保留/etc/cron.deny,你可以將不想讓它執行crontab的那個使用者寫入/etc/cron.deny當中,一個賬號一行。

當使用者使用crontab這個命令來建立計劃任務之後,該項任務就會被記錄到/var/spool/cron中,而且是以賬號來作為根據判斷。舉例來說,kevin使用crontab後,它的任務會被記錄到/var/spool/cron/kevin中。但請注意,不要使用vi直接編輯該檔案,因為可能由於輸入語法錯誤,會導致無法執行cron。另外,cron執行的每一項任務都會被記錄到/var/log/cron這個日誌檔案中,所以,如果你的Linux不知道是否被植入了木馬時,也可以查詢一下/var/log/cron這個日誌檔案。

好了,那麼我們就來聊一聊crontab的語法。

crontab [-u username] [-l|-e|-r]
選項與引數:
-u : 只有root才能執行這個任務,亦即幫其他使用者建立/刪除crontab計劃任務。
-e : 編輯crontab的任務內容
-l : 檢視crontab的任務內容
-r : 刪除所有的crontab的任務內容,若僅要刪除一項,請用-e去編輯。
範例一:用kevin的身份在每天的12:00發信給自己。
crontab -e
# 此時會進入vi的編輯器介面讓您編輯任務,注意到,每項任務都是一行。
 0  12  *  *  * mail -s "at 12:00" kevin # /home/kevin/.bashrc
#分  時  日 月 周 【命令串】

預設情況下,任何使用者只要不被列入/etc/cron.deny當中,那麼它就可以直接執行【crontab -e】去編輯自己的例行性命令。整個過程就如同上面提到的,會進入vi的編輯器介面,然後以一個任務一行來編輯,編輯完畢之後輸入【:wq】並儲存後退出vi即可。而每項任務(每行)的格式都具有六個欄位,這六個欄位的意義為:

代表意義 分鐘 小時 日期 月份 命令
數字範圍 0~59 0~23 1~31 1~12 0~7 需要執行的命令

比較有趣的是那個【周】,周的數字為0或7時,都代表【星期天】的意思。另外,還有下面這些特殊字元:

特殊字元 代表意義
*(星號) 代表任何時刻都接受的意思。舉例來說,範例一內那個日、月、周都是*,就代表著【不論何月、何日的星期幾的12:00都執行後續命令】的意思
,(逗號) 代表分隔時段的意思。舉例來說,如果要執行的任務是3:00與6:00時,就會是:
0 3,6 * * * command
時間引數還是有五欄,不過第二欄是3,6,代表3與6都適合
-(減號) 代表一段時間範圍內,舉例來說,8點到12點之間的每小時的20分都執行一項任務:
20 8-12 * * * command
仔細看到第二欄變成8-12,代表8、9、10、11、12都適用的意思
/n(斜線) 那個n代表數字,亦即【每隔n單位間隔】的意思,例如沒5分鐘執行一次,則:
/5 * * * * command
很簡單吧!用
/5來搭配,也可以寫成0-59/5,相同意思

我們就來搭配幾個例子練習看看。

1.假如你的女朋友生日是5月2日,你想要在5月1日的23:59發一封信給她,這封信的內容已經寫在/home/kevin/lover.txt內了,該如何執行?

答:直接執行crontab -e之後,編輯成為:

59 23 1 5 * mail kiki < /home/kevin/lover.txt

那樣的話,每年kiki都會受到你的這封信。(當然,信的內容就要每年變一變。)

2.假如每五分鐘需要執行/home/kevin/test.sh一次,又該如何?

答:同樣使用crontab -e進入編輯:

*/5 * * * * /home/kevin/test.sh

3.假如你每星期六都與朋友有約,那麼想要每個星期五下午4:30告訴你朋友不要忘記星期六的約會,則:

答:還是crontab -e。

30 16 * * 5 mailfriend@his.server.name < /home/kevin/friend.txt

真的很簡單吧!呵呵!那麼,該如何查詢使用者目前的crontab內容呢?我們可以這樣來看看:

crontab -l
# 注意,若僅要刪除一項任務的話,必須用crontab -e去編輯,如果刪除全部任務,才使用crontab -r。

看到了嗎?如果使用crontab -r,那麼再用crontab -l檢視時發現【整個內容會不見了】,所以請注意,【如果只是要刪除某個crontab的任務選項,那麼請使用crontab -e來重新編輯即可】,如果使用-r的引數,是會將所有的crontab資料內容都刪除掉的,千萬注意了。

壓縮與解壓縮

在Linux下面有相當多的壓縮命令可以執行,這些壓縮命令可以讓我們更方便地從網路上面下載容量較大的檔案。此外,我們知道在Linux下面,副檔名沒有什麼特殊的意義。 不過,針對這些壓縮命令所產生的壓縮檔案,為了方便記憶,還是會有一些特殊的命名方式,就讓我們來看看吧!

檔案壓縮

什麼是檔案壓縮呢?我們稍微談一談它的原理,目前我們使用的計算機系統中都是使用所謂的位元組單位來計量。不過,事實上,計算機最小的計量單位應該是bit才對,此外,我們也知道 1位元組=8位元(1Byte=8bit),但是如果今天我們只是記錄一個數字,即1這個數字,它會如何記錄?假設一個位元組可以看成下面的模樣:

由於 1Byte=8bit,所以每個位元組當中會有8個空格,而每個空格只可以是0、1

由於我們記錄的數字是1,考慮計算機所謂的二進位制,如此一來,1會在最右邊佔據1個位,而其他的7個位將會自動地被填上0.如下圖所示

你看看,其實在這樣的例子中,那7個位應該是空的才對。不過,為了要滿足目前我們的作業系統資料的讀寫,所以就會將該資料轉為位元組的形式來記錄。而一些聰明的計算機工程師就利用一些複雜的計算方式,將這些沒有使用到的空間【丟】出來,以讓檔案佔用的空間變小,這就是壓縮的技術。
另一種壓縮技術也很有趣,它是將重複的資料進行統計記錄。舉例來說,如果你的資料為【111······】共有100個1時,那麼壓縮技術會記錄為【100個1】而不是真的有100個1的位存在。這樣也能夠精簡檔案記錄的容量,非常有趣吧!
簡單地說,你可以將它想成,其實檔案裡面有相當多的空間存在,並不是完全填滿的,而壓縮技術就是將這些空間填滿,以讓整個檔案佔用的容量下降。不過,這些壓縮過的檔案並無法直接被我們的作業系統所使用,因此,若要使用這些被壓縮過的檔案資料,則必須將它還原回未壓縮前的模樣,那就是所謂的解壓縮。而至於壓縮後與壓縮的檔案所佔用的磁碟空間大小,就可以被稱為是壓縮比
這個壓縮與解壓縮的操作有什麼好處呢?
1.最大的好處就是壓縮過的檔案容量變小了,所以你的硬碟無形之中就可以容納更多的資料。
2.此外,在一些網路資料的傳輸中,也會由於資料量的降低,好讓網路頻寬可以用來做更多的工作,而不是老卡在一些大型檔案傳輸上面。

Linux系統常見壓縮命令

在Linux的環境中,壓縮檔案的副檔名大多是: *.tar、*.tar.gz、*.gz、*.Z、*.bz2、*.xz。為什麼會有這樣的副檔名?不是說Linux的副檔名沒有什麼作用嗎?
這是因為Linux支援的壓縮命令非常多,且不同的命令所用的壓縮技術並不相同,當然彼此之間可能就無法互通/解壓縮檔案。所以,當你下載到某個檔案時,自然就需要知道該檔案是由哪種壓縮命令所製作出來的,好用來對照對照著解壓縮,也就是說,雖然Linux檔案的屬性基本上是與檔名沒有絕對關係的,但是為了幫助我們人類小小的腦袋,所以適當的副檔名還是必要的,下面我們就列出幾個常見的壓縮副檔名:

*.gz         gzip程式壓縮的檔案
*.bz2        bzip2程式壓縮的檔案
*.xz         xz程式壓縮的檔案
*.zip        zip程式壓縮的檔案
*.Z          compress程式壓縮的檔案
*.tar        tar程式打包的檔案,並沒有壓縮過
*.tar.gz     tar程式打包的檔案,並且經過gzip的壓縮
*.tar.bz2    tar程式打包的檔案,並且經過bzip2的壓縮
*.tar.xz     tar程式打包的檔案,並且經過xz的壓縮

Linux常見的壓縮命令就是gzip、bzip2以及最新的xz,至於compress已經不流行了。為了支援windows常見的zip,其實Linux也早就有zip命令了。gzip是由GNU計劃所開發出來的壓縮命令,該命令支援已經替換了compress。後臺GNU又開發出了bzip2及xz這幾個壓縮比更好的壓縮命令。不過,這些命令通常僅能針對一個檔案來壓縮與解壓縮,如此一來,每次壓縮與解壓縮都要一大堆檔案,豈不煩人?此時,這個所謂的【打包軟體,tar】就顯得很重要。
這個tar可以將很多檔案打包成一個檔案,甚至是目錄也可以這麼玩。不過,單純的tar功能僅僅是打包而已,即將很多檔案結合為一個檔案,事實上,它並沒有提供壓縮的功能,後臺,GNU計劃中,將整個tar與壓縮的功能結合在一起,如此一來,提供使用者更方便且更強大的壓縮與打包功能,下面我們就來談一談這些在Linux下面基本的壓縮命令。

gzip

gzip可以說是應用最廣的壓縮命令了,目前gzip可以解開compress、zip和gzip等軟體所壓縮的檔案,至於gzip所建立的壓縮檔案為*.gz,讓我們來看看這個命令的語法:

gzip [-cdtvn] 檔名
選項與引數:
-c: 將壓縮的資料輸出到螢幕上,可通過資料流重定向來處理;
-d: 解壓縮的引數;
-t: 可以用來檢驗一個壓縮檔案的一致性,看看檔案有無錯誤;
-v: 可以顯示出原檔案/壓縮檔案的壓縮比等資訊;
-n: n為數字的意思,代表壓縮等級,-1最快,但壓縮比最差,-9最慢,但是壓縮比最好,預設是-6

示例1:壓縮檔案(gzip -v 檔名)

示例2:解壓縮檔案(gzip -d 檔名)

示例3:按照指定壓縮比壓縮(gzip -9 檔名)

示例4:檢視壓縮檔案的內容(zcat 檔名)

示例5:壓縮為指定檔名(gzip -c 檔名 > 指定檔名)

當你使用gzip進行壓縮時,在預設的狀態下原本的檔案會被壓縮成為.gz字尾的檔案,原始檔就不存在了,這點與一般習慣使用Windows做壓縮的朋友所熟悉的情況不同,要注意。cat/more/less可以使用不同的方式來讀取純文字檔案,那麼zcat/zmore/zless則可以對應於cat/more/less的方式來讀取純檔案檔案被壓縮後的壓縮檔案。

bzip2

若說gzip是為了替換compress並提供更好的壓縮比而成立的,那麼bzip2則是為了替換gzip並提供更加的壓縮比而來。bzip2真是很不錯的東西,這玩意的壓縮比竟然比gzip還要好,至於bzip2的用法幾乎與gzip相同,看看下面的用法吧!

bzip2 [-cdkzvn] 檔名
選項與引數:
-c: 將壓縮的資料輸出到螢幕上,可通過資料流重定向來處理;
-d: 解壓縮的引數;
-k: 保留原始檔案,而不是刪除原始檔案;
-z: 壓縮的引數(預設值,可以不加);
-v: 可以顯示出原檔案/壓縮檔案的壓縮比等資訊;
-n: n為數字的意思,代表壓縮等級,-1最快,但壓縮比最差,-9最慢,但是壓縮比最好,預設是-6

示例:

bzip2 -v 待壓縮檔名
bzip2 -d 壓縮後的檔名
bzip2 -9 -c 待壓縮的檔名 > 自定義壓縮檔名

xz

雖然bzip2已經具有很棒的壓縮比,不過顯然某些自由軟體開發者還不滿足,因此後來還推出了xz這個壓縮比更高的軟體。這個軟體的用法也跟gzip/bzip2幾乎一模一樣,那我們就來看一看。

xz [-cdtlkn] 檔名
選項與引數:
-c: 將壓縮的資料輸出到螢幕上,可通過資料流重定向來處理;
-d: 解壓縮的引數;
-k: 保留原始檔案,而不是刪除原始檔案;
-l: 列出壓縮檔案的相關資訊;
-t: 測試壓縮檔案的完整性,看看有沒有錯誤;
-z: 壓縮的引數(預設值,可以不加);
-n: n為數字的意思,代表壓縮等級,-1最快,但壓縮比最差,-9最慢,但是壓縮比最好,預設是-6

示例:

xz -v 待壓縮的檔名
xz -l 壓縮後的檔名
xz -d 壓縮後的檔名
xz -k 待壓縮的檔名

打包命令

前面談到的命令大多僅能針對單一檔案來進行壓縮,雖然gzip、bzip2、xz也能夠針對目錄來進行壓縮,不過,這幾個命令對目錄的壓縮指的是將目錄內的所有檔案【分別】進行壓縮的操作。而不像在Windows的系統,可以使用類似WinRAR這一類的壓縮軟體來將好多資料包成一個檔案的樣式。
這種將多個檔案或目錄包成一個大檔案的命令功能,我們可以稱它是一種打包命令,那Linux有沒有這種打包命令?有,那就是大名鼎鼎的tar,tar可以將多個目錄或檔案打包成一個大檔案,同時還可以通過gzip、bzip2、xz的支援,將該檔案同時進行壓縮。更有趣的是,由於tar的使用太廣泛了,目前Windows的WinRAR也支援.tar.gz檔名的解壓縮。

tar

tar的選項與引數特別多,我們只講幾個常用的選項,更多選項您可以自行man tar查詢。

tar [-z|-j|-J] [cv] [-f 待建立的新檔名] filename... <== 打包與壓縮。
tar [-z|-j|-J] [cv] [-f 既有的tar檔名]  <== 檢視檔名
tar [-z|-j|-J] [xv] [-f 既有的tar檔名]  <== 解壓縮
選項與引數:
-c: 建立打包檔案,可搭配-v來檢視過程中被打包的檔名(filename);
-t: 檢視打包檔案的內容含有那些檔名,重點在檢視【檔名】;
-x: 解包或解壓縮功能,可以搭配-C(大寫)在特定目錄解壓,特別留意的是,-c、-t、-x不可同時出現在一串命令列中;
-z: 通過gzip的支援進行壓縮/解壓縮: 此時檔名最好為*.tar.gz;
-j: 通過bzip2的支援進行壓縮/解壓縮:此時檔名最好為*.tar.bz2;
-J: 通過xz的支援進行壓縮/解壓縮: 此時檔名最好為 *.tar.xz,特別留意,-z、-j、-J不可以同時出現在一串命令列中;
-v: 在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來;
-f filename: -f後面要立刻接要被處理的檔名,建議-f單獨寫一個選項(比較不會忘記)。
-C 目錄: 這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項
-p(小寫): 保留備份資料的原本許可權與屬性,常用於備份(-c)重要的配置檔案;
-P(大寫): 保留絕對路徑,亦即允許備份資料中含有根目錄存在之意

其實最簡單的使用tar就只要記住下面的命令即可:

  • 壓縮: tar -zcv -f filename.tar.gz 要被壓縮的檔案或目錄名稱;
  • 查詢: tar -ztv -f filename.tar.gz
  • 解壓縮: tar -zxv -f filename.tar.gz -C 欲解壓縮的目錄

示例:

tar -zcvf 檔名.tar.gz 檔名(目錄)

tar -ztvf 檔名.tar.gz

tar -zxvf 檔名.tar.gz

原始碼與Tarball

本文主要是為了讓你瞭解如何將開發原始碼的程式設計、加入庫的原理、通過編譯而成為可以執行的二進位制程式,最後該執行檔案可被我們使用的一連串過程。

  • 開放原始碼:就是程式程式碼,寫給人類看的程式語言,但機器並不認識,所以無法執行;
  • 編譯器: 將程式轉譯成為機器看得懂的語言,就類似翻譯者的角色;
  • 可執行檔案: 經過編譯器變成的二進位制程式,機器看得懂所以可以執行。

什麼是make與configure

事實上,使用類似 gcc的編譯器來進行編譯的過程並不簡單,因為一個軟體並不會僅有一個程式檔案,而是有一堆程式程式碼檔案。所以除了每個主程式與子程式均需要寫上一條編譯過程的命令外,還需要寫上最終的連結程式。程式程式碼短的時候還好,如果是類似WWW伺服器軟體(例如Apache),或是類似核心的原始碼,動輒數百MB的資料量,編譯命令會寫到瘋掉,這個時候,我們就可以使用make這個命令的相關功能來進行編譯過程的簡化。
當執行make時,make會在當前的目錄查詢Makefile(or makefile)這個文字檔案,而Makefile裡面則記錄了原始碼如何編譯的詳細資訊。make會自動地判別原始碼是否經過變動了,而自動更新執行檔案,是軟體工程師相當好用的一個輔助工具。

什麼是Tarball的軟體

所謂的Tarball檔案,其實就是將軟體的所有原始碼檔案先以tar打包,然後再以壓縮技術來壓縮,通常最常見的就是以gzip來壓縮。因為利用了tar與gzip的功能,所以Tarball檔案一般的副檔名就會寫成*.tar.gz或是簡寫為*.tgz,不過,近來由於bzip2與xz的壓縮率較佳,所以Tarball漸漸地以bzip2及xz的壓縮技術來替換gzip,因此檔名也會變成*.tar.bz2、*.tar.xz之類的。所以說Tarball是一個軟體包,你將它解壓縮之後,裡面的檔案通常就會有:

  • 原始碼檔案;
  • 檢測程式檔案(可能是configure或config等檔案);
  • 本軟體的簡易說明與安裝說明(INSTALL或README)。

其中最重要的是那個 INSTALL 或是 README 這兩個檔案,通常你只要能夠參考這兩個檔案,Tarball軟體的安裝是很簡單的。

Tarball安裝的基本步驟

以Tarball方式釋出的軟體是需要重新編譯可執行的二進位制程式。而Tarball是以tar這個命令來打包與壓縮的檔案,所以,當然就需要先將Tarball解壓縮,然後到原始碼所在的目錄下進行makefile的建立,再以make來進行編譯與安裝的操作。所以整個安裝的基礎操作大多是這樣的:

  1. 獲取原始檔案:將tarball檔案在/usr/local/src目錄下解壓縮;
  2. 獲取步驟流程:進入新建立的目錄下面,去檢視INSTALL與README等相關檔案內容(很重要的步驟);
  3. 依賴屬性軟體安裝:根據INSTALL/README的內容檢視並安裝好一些依賴的軟體(非必要);
  4. 建立makefile:以自動檢測程式(configure或config)檢測操作環境,並建立Makefile這個檔案;
  5. 編譯:用make這個程式,並使用該目錄下的Makefile作為它的引數配置檔案,來進行make(編譯或其它)的操作;
  6. 安裝:以make這個程式,並以Makefile這個引數配置檔案,根據install這個目錄(target)的指定來安裝到正確的路徑。

注意到上面的第二個步驟,通常每個軟體在釋出的時候,都會附上名為INSTALL或是README的說明檔案,這些說明檔案請【確實詳細地】閱讀過一遍,通常這些檔案會記錄這個軟體的安裝要求、軟體的工作專案與軟體的安裝引數設定及技巧等,只要仔細讀完這些檔案,基本上,要安裝好Tarball的檔案,都不會有什麼大問題。

至於makefile在製作出來之後,裡面會有相當多的目標(target),最常見的就是install與clean,通常【make clean】代表著將目標檔案清除,【make】則是將原始碼進行進行編譯而已。注意,編譯完成的可執行檔案與相關的配置檔案還在原始碼所在的目錄當中。因此,最後要進行【make install】來將編譯完成的所有東西都安裝到正確的路徑中,這樣就可以使用該軟體。
ok,我們下面大概提一下大部分的Tarball軟體安裝的命令執行方式:

  1. ./configure
    這個步驟就是建立Makefile這個檔案。通常程式開發者會寫一個指令碼來檢查你的Linux系統、相關的軟體屬性等,這個步驟相當的重要,因為未來你的安裝資訊都是在這一步驟內完成的。另外,這個步驟的相關資訊應該要參考一下該目錄下的README或INSTALL相關的檔案。
  2. make clean
    make會讀取Makefile中關於clean的工作。這個步驟不一定會有,但是希望執行一下,因為它可以移除目標檔案。因為誰也不確定原始碼裡面到底有沒有包含上次編譯過的目標檔案(*.o)存在,所以當然還是清楚一下比較妥當,至少等一下新編譯出來的執行檔案我們可以確定是自己的機器所編譯完成的嘛!
  3. make
    make會根據Makefile當中的預設設定進行編譯的操作。編譯的操作主要是使用gcc來將原始碼編譯成為可以被執行的目標檔案,但是這些目標檔案通常還需要連結一些函式庫之類後,才能產生一個完整的執行檔案。使用make就是要將原始碼編譯成為可以被執行的檔案,而這個可執行檔案會放置在目前所在的目錄之下,尚未被安裝到預定安裝的目錄中。
  4. make install
    通常這就是最後的安裝步驟了,make會根據Makefile這個檔案裡面關於install的選項,將上一個步驟所編譯完成的內容安裝到預定的目錄中,從而完成安裝。

請注意,上面的步驟是一步一步來進行的,而其中只要一個步驟無法成功,那麼後續的步驟就完全沒有辦法進行,因此,要確定每個步驟都是成功的才可以。舉個例子來說,萬一今天你在./configure就不成功了,那麼就表示Makefile無法被建立起來,要知道,後面的步驟都是根據Makefile來進行的,既然無法建立Makefile,後的步驟當然無法成功。

另外,如果在make無法成功的話,那就表示原始檔無法被編譯成可執行檔案,那麼make install主要是將編譯完成的檔案放置到檔案系統中,既然都沒有可用的執行檔案了,怎麼進行安裝?所以,要每一個步驟都正確無誤才能往下繼續做。此外,如果安裝成功,並且是安裝在獨立的一個目錄中,例如在/usr/local/packages這個目錄中,那麼你就必須手動將這個軟體的man page寫入到/etc/man_db.conf中。

Tarball安裝建議

為什麼Tarball要在/usr/local/src裡面解壓縮?,基本上,在預設的情況下,原本的Linux發行版釋出安裝的軟體大多是在/usr裡面,而使用者自行安裝的軟體則建議放置在/usr/local裡面,這是考慮到管理使用者所安裝軟體的便利性。

為什麼?我們知道幾乎每個軟體都會提供聯機幫助的服務,那就是info與man的功能。在預設的情況下,man會去查詢/usr/local/man裡面的說明檔案,因此,如果我們將軟體安裝在/usr/local下面的話,那麼自然安裝完成之後,該軟體的說明檔案就可以被找到了。所以,通常我們會建議大家將自己安裝的軟體放置在/usr/local下,至於原始碼(Tarball)則建議防止在/usr/local/src(src為source的縮寫)下面。

但是,如果將軟體直接安裝在/usr/local下,由於/usr/local原本就預設就有/etc、/bin、/lib、/man,所以安裝其它軟體產生的一些檔案也會在上述幾個目錄裡面,因此,如果你都安裝在這個目錄下的話,那麼未來再想要升級或刪除的時候,就會比較難以查詢檔案的來源。所以建議如果你的軟體名是software,建議安裝在/usr/local/softwsare目錄下,這樣單一軟體的檔案都在同一個目錄下,那麼刪除該軟體就簡單的多了,只要將該目錄刪除即可視為該軟體已經被刪除

由於Tarball在升級與安裝上面具有這些特色,亦即Tarball在反安裝上面具有比較高的難度(如果你沒有好好規劃的話),所以,為了方便Tarball的管理,通常鳥哥會這樣建議使用者:

  1. 最好將Tarball的原始資料解壓到/usr/local/src當中;
  2. 安裝時,最好安裝到/usr/local這個預設路徑下;
  3. 考慮到未來的反安裝步驟,最好可以將每個軟體單獨安裝在/usr/local下面;
  4. 為安裝到單獨目錄的軟體的man page加入man path查詢:
    如果你安裝的軟體放置到/usr/local/software/,那麼在man page查詢的設定中,可能就要在/etc/man_db.conf內的40~50行左右處,寫入如下的一行:
    MANPATH_MAP /usr/local/software/bin /usr/local/software/man
    這樣才可以使用man來查詢該軟體的線上檔案。

相關文章