第十一章 進程
Ps |
報告當前進程快照 |
Top |
顯示任務 |
Jobs |
列出活躍的任務 |
Bg |
把一個任務放到後臺執行 |
Fg |
把一個任務放到前臺執行 |
Kill |
給一個進程發送信號 |
Killall |
殺死指定名字的進程 |
Shutdown |
關機或重啓系統 |
當系統啓動的時候,內核先把一些它自己的活動初始化爲進程,然後運行一個叫做 init 的程序。
init 再依次運行一系列 叫做init 腳本的 shell 腳本(位於/etc),它們可以啓動所有的系統服務。
其中許多系統服務以守護(daemon)程序的形式實現,守護程序僅在後臺運行,沒有任何用戶界面。 這樣,即使我們沒有登錄系統,至少系統也在忙於執行一些例行事務。
init的PID總是1。剩下的進程升序排列。
PS
只使用ps命令本身的話只會返回和當前終端相關的進程。
TTY代表teletype,指進程的終端。
[me@linuxbox ~]$ ps
PID TTY TIME CMD
5198 pts/1 00:00:00 bash
10129 pts/1 00:00:00 ps
在後面加上x可以返回更多的進程。會返回很多很多結果。
STAT代表進程的狀態。
狀態 |
含義 |
R |
運行中。這意味着,進程正在運行或準備運行。 |
S |
正在睡眠。進程沒有運行,而是,正在等待一個事件, 比如說,一個按鍵或者網絡分組。 |
D |
不可中斷睡眠。進程正在等待 I/O,比方說,一個磁盤驅動器的 I/O。 |
T |
已停止. 已經指示進程停止運行。稍後介紹更多。 |
Z |
一個死進程或“殭屍”進程。這是一個已經終止的子進程,但是它的父進程還沒有清空它。 (父進程沒有把子進程從進程表中刪除) |
< |
一個高優先級進程。這可能會授予一個進程更多重要的資源,給它更多的 CPU 時間。 進程的這種屬性叫做 niceness。具有高優先級的進程據說是不好的(less nice), 因爲它佔用了比較多的 CPU 時間,這樣就給其它進程留下很少時間。 |
N |
低優先級進程。 一個低優先級進程(一個“好”進程)只有當其它高優先級進程被服務了之後,纔會得到處理器時間。 |
大寫字母之後的其他字符代表各種外來進程的特性。
另外一個流行(真的很流行)的組合是aux。輸出BSD(Berkeley Software Distribution)風格的結果。
標題 |
含義 |
USER |
用戶 ID. 進程的所有者。 |
%CPU |
以百分比表示的 CPU 使用率 |
%MEM |
以百分比表示的內存使用率 |
VSZ |
虛擬內存大小 |
RSS |
進程佔用的物理內存的大小,以千字節爲單位。 |
START |
進程啓動的時間。若它的值超過24小時,則用天表示。 |
top
top命令類似windwos的“任務管理器”,輸出的結果三秒刷新一次。
輸出結果中上面是系統概要,下面是進程列表,以CPU佔用率排序。
~實例說明系統概要:
行號 |
字段 |
意義 |
1 |
top |
程序名。 |
|
14:59:20 |
當前時間。 |
|
up 6:30 |
這是正常運行時間。它是計算機從上次啓動到現在所運行的時間。 在這個例子裏,系統已經運行了六個半小時。 |
|
2 users |
有兩個用戶登錄系統。 |
|
load average: |
加載平均值是指,等待運行的進程數目,也就是說,處於可以運行狀態並共享 CPU 的進程個數。 這裏展示了三個數值,每個數值對應不同的時間段。第一個是最後60秒的平均值, 下一個是前5分鐘的平均值,最後一個是前15分鐘的平均值。若平均值低於1.0,則指示計算機 工作不忙碌。 |
2 |
Tasks: |
總結了進程數目和這些進程的各種狀態。 |
3 |
Cpu(s): |
這一行描述了 CPU 正在進行的活動的特性。 |
|
0.7%us |
0.7% 的 CPU 被用於用戶進程。這意味着進程在內核之外。 |
|
1.0%sy |
1.0%的 CPU 時間被用於系統(內核)進程。 |
|
0.0%ni |
0.0%的 CPU 時間被用於"nice"(低優先級)進程。 |
|
98.3%id |
98.3%的 CPU 時間是空閒的。 |
|
0.0%wa |
0.0%的 CPU 時間來等待 I/O。 |
4 |
Mem: |
展示物理內存的使用情況。 |
5 |
Swap: |
展示交換分區(虛擬內存)的使用情況。 |
Top接受鍵盤指令。直接按h顯示幫助,直接按q退出top。
控制進程
輸入xlogo,獲取一個示例程序。
中斷進程
首先xlogo一下,此時linux命令行沒有返回;按下Ctrl-c,中斷。
後臺執行
輸入xlogo &
會返回任務號和PID。並且可以輸入下一條指令了。
此時可以在ps裏看到xlogo。
通過命令jobs可以看到任務。
返回前臺
使用fg %【任務序號】
~
[me@linuxbox ~]$ fg %1
xlogo
停止(而非終止)一個進程
輸入xlogo,之後ctrl-z
之後你調整xlogo窗口的大小,會發現X不動了。
使用fg可以讓它復活
使用bg再次把它移到後臺
Signals
首先啓動xlogo &
此時打印出了PID和jobspec
使用kill 【PID】
或者
kill %【jobspec】終止。
kill並不能是用來“殺死”程序,而是給它發送信號。例如ctrl-c其實是發送INT(中斷)的信號,ctrl-z其實是發送TSTP(終端停止)的信號。
KILL真正的語法形式:
kill [-signal] PID...
如果沒有填入可選項,那麼默認是TERM(終止)。
編號 |
名字 |
含義 |
1 |
HUP |
掛起。這是美好往昔的殘留部分,那時候終端機通過電話線和調制解調器連接到 遠端的計算機。這個信號被用來告訴程序,控制的終端機已經“掛起”。 通過關閉一個終端會話,可以展示這個信號的作用。在當前終端運行的前臺程序將會收到這個信號並終止。 許多守護進程也使用這個信號,來重新初始化。這意味着,當一個守護進程收到這個信號後, 這個進程會重新啓動,並且重新讀取它的配置文件。Apache 網絡服務器守護進程就是一個例子。 |
2 |
INT |
中斷。實現和 Ctrl-c 一樣的功能,由終端發送。通常,它會終止一個程序。 |
9 |
KILL |
殺死。這個信號很特別。儘管程序可能會選擇不同的方式來處理髮送給它的 信號,其中也包含忽略信號,但是 KILL 信號從不被髮送到目標程序。而是內核立即終止 這個進程。當一個進程以這種方式終止的時候,它沒有機會去做些“清理”工作,或者是保存工作。 因爲這個原因,把 KILL 信號看作最後一招,當其它終止信號失敗後,再使用它。 |
15 |
TERM |
終止。這是 kill 命令發送的默認信號。如果程序仍然“活着”,可以接受信號,那麼 這個它會終止。 |
18 |
CONT |
繼續。在一個停止信號後,這個信號會恢復進程的運行。 |
19 |
STOP |
停止。這個信號導致進程停止運行,而不是終止。像 KILL 信號,它不被 發送到目標進程,因此它不能被忽略。 |
其他常用信號
編號 |
名字 |
含義 |
3 |
QUIT |
退出 |
11 |
SEGV |
段錯誤。如果一個程序非法使用內存,就會發送這個信號。也就是說, 程序試圖寫入內存,而這個內存空間是不允許此程序寫入的。 |
20 |
TSTP |
終端停止。當按下 Ctrl-z 組合鍵後,終端發送這個信號。不像 STOP 信號, TSTP 信號由目標進程接收,且可能被忽略。 |
28 |
WINCH |
改變窗口大小。當改變窗口大小時,系統會發送這個信號。 一些程序,像 top 和 less 程序會響應這個信號,按照新窗口的尺寸,刷新顯示的內容。 |
KILALL
基本格式
killall [-u user] [-signal] name...
一看就懂的實例
[me@linuxbox ~]$ xlogo &
[1] 18801
[me@linuxbox ~]$ xlogo &
[2] 18802
[me@linuxbox ~]$ killall xlogo
[1]- Terminated xlogo
[2]+ Terminated xlogo
其他進程相關指令
命令名 |
命令描述 |
pstree |
輸出一個樹型結構的進程列表,這個列表展示了進程間父/子關係。 |
vmstat |
輸出一個系統資源使用快照,包括內存,交換分區和磁盤 I/O。 爲了看到連續的顯示結果,則在命令名後加上更新操作延時的時間(以秒爲單位)。例如,“vmstat 5”。 ,按下 Ctrl-c 組合鍵, 終止輸出。 |
xload |
一個圖形界面程序,可以畫出系統負載隨時間變化的圖形。 |
tload |
與 xload 程序相似,但是在終端中畫出圖形。使用 Ctrl-c,來終止輸出。 |
第十二章 shell環境
Printenv |
打印部分或所有的環境變量 |
Set |
設置 shell 選項 |
Export |
導出環境變量,讓隨後執行的程序知道。 |
Alias |
創建命令別名 |
shell 在環境中存儲了兩種基本類型的數據,環境變量和 shell 變量。
shell 變量是 bash 存放的少量數據,剩下的都是 環境變量。
除此之外,還存儲了一些shell函數。
printenv打印所有環境變量
會返回很長的結果。
[me@linuxbox ~]$ printenv USER
Me
使用alias來查看別名。
[me@linuxbox ~]$ alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
這是爲什麼ls會帶顏色。
環境變量列表
DISPLAY |
如果你正在運行圖形界面環境,那麼這個變量就是你顯示器的名字。通常,它是 ":0", 意思是由 X 產生的第一個顯示器。 |
EDITOR |
文本編輯器的名字。 |
SHELL |
shell 程序的名字。 |
HOME |
用戶家目錄。 |
LANG |
定義了字符集以及語言編碼方式。 |
OLD_PWD |
先前的工作目錄。 |
PAGER |
頁輸出程序的名字。這經常設置爲/usr/bin/less。 |
PATH |
由冒號分開的目錄列表,當你輸入可執行程序名後,會搜索這個目錄列表。 |
PS1 |
Prompt String 1. 這個定義了你的 shell 提示符的內容。隨後我們可以看到,這個變量 內容可以全面地定製。 |
PWD |
當前工作目錄。 |
TERM |
終端類型名。類 Unix 的系統支持許多終端協議;這個變量設置你的終端仿真器所用的協議。 |
TZ |
指定你所在的時區。大多數類 Unix 的系統按照協調時間時 (UTC) 來維護計算機內部的時鐘 ,然後應用一個由這個變量指定的偏差來顯示本地時間。 |
USER |
你的用戶名 |
如何建立shell環境
當我們登錄系統後, bash 程序啓動,並且會讀取一系列稱爲啓動文件的配置腳本, 這些文件定義了默認的可供所有用戶共享的 shell 環境。
然後是讀取更多位於我們自己家目錄中 的啓動文件,這些啓動文件定義了用戶個人的 shell 環境。
有兩種 shell 會話類型:一個是登錄 shell 會話,另一個是非登錄 shell 會話。
登錄shell會話會提示輸入用戶名和密碼,非shell會話通常是用GUI啓動。
登錄shell會話啓動的文件
/etc/profile |
應用於所有用戶的全局配置腳本。 |
~/.bash_profile |
用戶個人的啓動文件。可以用來擴展或重寫全局配置腳本中的設置。 |
~/.bash_login |
如果文件 ~/.bash_profile 沒有找到,bash 會嘗試讀取這個腳本。 |
~/.profile |
如果文件 ~/.bash_profile 或文件 ~/.bash_login 都沒有找到,bash 會試圖讀取這個文件。 這是基於 Debian 發行版的默認設置,比方說 Ubuntu。 |
非shell會話
/etc/bash.bashrc |
應用於所有用戶的全局配置文件。 |
~/.bashrc |
用戶個人的啓動文件。可以用來擴展或重寫全局配置腳本中的設置。 |
看一下.bash_profile文件的內容:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
#export PATH讓這個shell的子進程也可以使用PATH變量的內容
文本編輯器
Nano
保存:ctrl-o
例如我們可以修改.bashrc,在最後加上這麼幾行:
umask 0002
export HISTCONTROL=ignoredups
export HISTSIZE=1000
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
它們的意思是:
文本行 |
含義 |
umask 0002 |
設置掩碼來解決共享目錄的問題。 |
export HISTCONTROL=ignoredups |
使得 shell 的歷史記錄功能忽略一個命令,如果相同的命令已被記錄。 |
export HISTSIZE=1000 |
增加命令歷史的大小,從默認的 500 行擴大到 1000 行。 |
alias l.='ls -d .* --color=auto' |
創建一個新命令,叫做'l.',這個命令會顯示所有以點開頭的目錄項。 |
alias ll='ls -l --color=auto' |
創建一個叫做'll'的命令,這個命令會顯示長格式目錄列表。 |
.bashrc文件只會在剛啓動終端會話時讀取。爲了使我們剛纔的操作生效,需要使用source強迫bash重新讀取剛纔的文件
source .bashrc
第十三章 vi簡介
vi讀作vee-eye,來源於visual。
一般來說,vi就是vim。(improved),但是有時一些老系統會運行在vim的兼容模式下,就很煩。這時你需要
echo “set nocp” >> ~/.vimrc
創建新文件: 直接
[me@linuxbox ~]$ vi foo.txt
每行開頭的波浪線代表那一行沒有文本。
默認我們處於命令模式。按下i或者insert進入插入模式。
插入模式下可以使用:w或者:q來保存或退出。
又是令人噁心的大表了:
按鍵 |
移動光標 |
l or 右箭頭 |
向右移動一個字符 |
h or 左箭頭 |
向左移動一個字符 |
j or 下箭頭 |
向下移動一行 |
k or 上箭頭 |
向上移動一行 |
0 (零按鍵) |
移動到當前行的行首。 |
^ |
移動到當前行的第一個非空字符。 |
$ |
移動到當前行的末尾。 |
w |
移動到下一個單詞或標點符號的開頭。 |
W |
移動到下一個單詞的開頭,忽略標點符號。 |
b |
移動到上一個單詞或標點符號的開頭。 |
B |
移動到上一個單詞的開頭,忽略標點符號。 |
Ctrl-f or Page Down |
向下翻一頁 |
Ctrl-b or Page Up |
向上翻一頁 |
numberG |
移動到第 number 行。例如,1G 移動到文件的第一行。 |
G |
移動到文件末尾。 |
類似G,很多命令都可以在前面加數字。例如5j表示向下移動5行。
在命令模式下,按下大寫A在行尾(本行)添加文本。(等於i+$)
撤銷:直接按u
大寫A:在當前行尾insert
刪除命令:
命令 |
刪除的文本 |
x |
當前字符 |
3x |
當前字符及其後的兩個字符。 |
dd |
當前行。 |
5dd |
當前行及隨後的四行文本。 |
複製:
命令 |
複製的內容 |
yy |
當前行。 |
5yy |
當前行及隨後的四行文本。 |
y$ |
從當前光標位置到當前行的末尾。 |
yG |
從當前行到文件末尾。 |
$和G的使用,對刪除命令同樣有效。
粘貼時,p粘貼到下一行,大寫P粘貼到上一行。
由於vi不能直接刪除行尾的換行符來鏈接兩行,所以vi提供了大寫 J 來連接本行和下一行。
替換文本
:%s/Line/line/g
看起來很難,其實很簡單,實際上,只要知道%的意思是匹配全部文本,s是指定替換操作,g是指定每行的每個匹配項,就都知道了。
條目 |
含義 |
: |
冒號字符運行一個 ex 命令。 |
% |
指定要操作的行數。% 是一個快捷方式,表示從第一行到最後一行。另外,操作範圍也 可以用 1,5 來代替(因爲我們的文件只有5行文本),或者用 1,$ 來代替,意思是 “ 從第一行到文件的最後一行。” 如果省略了文本行的範圍,那麼操作只對當前行生效。 |
s |
指定操作。在這種情況下是,替換(查找與替代)。 |
/Line/line |
查找類型與替代文本。 |
g |
這是“全局”的意思,意味着對文本行中所有匹配的字符串執行查找和替換操作。如果省略 g,則 只替換每個文本行中第一個匹配的字符串。 |
在g後加c,將在每次替換是詢問是否真的要替換。
在文件之間切換:
:n |
下一個文件 |
:N |
上一個文件 |
或者,使用:buffers 展示所有文件
找到對應文件的編號。使用:buffers 3 跳到第三號文件。
我們知道可以用e來附加打開文件。此時無法使用:n來切換,只能使用buffers。
將整個文件插入(拷貝)到另一個文件中:
打開一個文件,輸入:r +文件名。
第十四章 自定製 shell 提示符
[me@linuxbox ~]$
這個東西就是shell提示符。它是由環境變量$PS1決定的。(是“prompt string one” 的簡寫)
echo可以看到其內容:
[me@linuxbox ~]$ echo $PS1
[\u@\h \W]\$
序列 |
顯示值 |
\a |
以 ASCII 格式編碼的鈴聲 . 當遇到這個轉義序列時,計算機會發出嗡嗡的響聲。 |
\d |
以日,月,天格式來表示當前日期。例如,“Mon May 26.” |
\h |
本地機的主機名,但不帶末尾的域名。 |
\H |
完整的主機名。 |
\j |
運行在當前 shell 會話中的工作數。 |
\l |
當前終端設備名。 |
\n |
一個換行符。 |
\r |
一個回車符。 |
\s |
shell 程序名。 |
\t |
以24小時制,hours:minutes:seconds 的格式表示當前時間. |
\T |
以12小時製表示當前時間。 |
\@ |
以12小時制,AM/PM 格式來表示當前時間。 |
\A |
以24小時制,hours:minutes 格式表示當前時間。 |
\u |
當前用戶名。 |
\v |
shell 程序的版本號。 |
\V |
Version and release numbers of the shell. |
\w |
當前工作目錄名。 |
\W |
當前工作目錄名的最後部分。 |
\! |
當前命令的歷史號。 |
\# |
當前 shell 會話中的命令數。 |
\$ |
這會顯示一個"$"字符,除非你擁有超級用戶權限。在那種情況下, 它會顯示一個"#"字符。 |
\[ |
標誌着一系列一個或多個非打印字符的開始。這被用來嵌入非打印 的控制字符,這些字符以某種方式來操作終端仿真器,比方說移動光標或者是更改文本顏色。 |
\] |
標誌着非打印字符序列結束。 |
知道了這個表,就可以隨便幹你想幹的事情了:
~
$ PS1="\A \h \$ "
17:33 linuxbox $
也可以改變其顏色:
Sequence |
Text Color |
Sequence |
Text Color |
\033[0;30m |
Black |
\033[1;30m |
Dark Gray |
\033[0;31m |
Red |
\033[1;31m |
Light Red |
\033[0;32m |
Green |
\033[1;32m |
Light Green |
\033[0;33m |
Brown |
\033[1;33m |
Yellow |
\033[0;34m |
Blue |
\033[1;34m |
Light Blue |
\033[0;35m |
Purple |
\033[1;35m |
Light Purple |
\033[0;36m |
Cyan |
\033[1;36m |
Light Cyan |
\033[0;37m |
Light Gray |
\033[1;37m |
White |
怎麼使用這些鬼畫符呢?只需要將它們用 [] 標記出來就好了。注意方括號要加轉義,最後結果是包含2個左方括號和一個右方括號。
<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$'
<me@linuxbox ~>$
這樣,命令也會是紅色的。使用以下命令將我們輸入的命令改回黑色:
<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]'
設置背景顏色:
\033[0;40m |
藍色 |
\033[1;44m |
黑色 |
\033[0;41m |
紅色 |
\033[1;45m |
紫色 |
\033[0;42m |
綠色 |
\033[1;46m |
青色 |
\033[0;43m |
棕色 |
\033[1;47m |
淺灰色 |
剩下的移動光標實在是沒用。不看了。
第十五章 軟件包管理
主要的包管理系統家族
包管理系統 |
發行版 (部分列表) |
Debian Style (.deb) |
Debian, Ubuntu, Xandros, Linspire |
Red Hat Style (.rpm) |
Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS |
linux的大多數軟件由發行商以包文件的形式提供,剩下的則以源碼形式存在,可以手動安裝。
在包管理系統中軟件的基本單元是包文件。
包文件是一個構成軟件包的文件壓縮集合。
一個軟件包可能由大量程序以及支持這些程序的數據文件組成。
依賴:
程序很少獨立工作;他們需要依靠其他程序的組件來完成他們的工作。程序所共有的活動,如輸入/輸出, 就是由一個被多個程序調用的子例程處理的。
這些子例程存儲在動態鏈接庫中。動態鏈接庫爲多個程 序提供基本服務。
如果一個軟件包需要一些共享的資源,如一個動態鏈接庫,它就被稱作有一個依賴。
現代的軟件包管理系統都提供了一些依賴項解析方法,以確保安裝軟件包時,其所有的依賴也被安裝。
#【動態鏈接】提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。
windows下是.dll文件,linux下是.so文件。
分爲底層和上層工具:我理解就是底層用來執行下載的包,上層就是直接安裝。
發行版 |
底層工具 |
上層工具 |
Debian-Style |
dpkg |
apt-get, aptitude |
Fedora, Red Hat Enterprise Linux, CentOS |
rpm |
yum |
查找:
風格 |
命令 |
Debian |
apt-get update; apt-cache search search_string |
Red Hat |
yum search search_string |
安裝:
風格 |
命令 |
Debian |
apt-get update; apt-get install package_name |
Red Hat |
yum install package_name |
直接通過底層工具安裝的話,就是沒有通過依賴解析直接安裝。
Style |
Command(s) |
Debian |
dpkg --install package_file |
Red Hat |
rpm -i package_file |
若發現依賴不存在,會報錯退出。
刪除
風格 |
命令 |
Debian |
apt-get remove package_name |
Red Hat |
yum erase package_name |
更新:
風格 |
命令 |
Debian |
apt-get update; apt-get upgrade |
Red Hat |
yum update |
底層軟件包升級
風格 |
命令 |
Debian |
dpkg --install package_file |
Red Hat |
rpm -U package_file |
列出所有軟件包
風格 |
命令 |
Debian |
dpkg --list |
Red Hat |
rpm -qa |
查看是否已經安裝了:
風格 |
命令 |
Debian |
dpkg --status package_name |
Red Hat |
rpm -q package_name |
查看哪個軟件包應該爲某個文件負責:
風格 |
命令 |
Debian |
dpkg --search file_name |
Red Hat |
rpm -qf file_name |
第十六章 存儲媒介
使用vim /etc/fstab 就可以看到啓動時會掛在的設備(硬盤分區)。
其內容類似:
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
字段 |
內容 |
說明 |
1 |
設備名 |
傳統上,這個字段包含與物理設備相關聯的設備文件的實際名字,比如說/dev/hda1(第一個 IDE 通道上第一個主設備分區)。然而今天的計算機,有很多熱插拔設備(像 USB 驅動設備),許多 現代的 Linux 發行版用一個文本標籤和設備相關聯。當這個設備連接到系統中時, 這個標籤(當儲存媒介格式化時,這個標籤會被添加到存儲媒介中)會被操作系統讀取。 那樣的話,不管賦給實際物理設備哪個設備文件,這個設備仍然能被系統正確地識別。 |
2 |
掛載點 |
設備所連接到的文件系統樹的目錄。 |
3 |
文件系統類型 |
Linux 允許掛載許多文件系統類型。大多數本地的 Linux 文件系統是 ext3, 但是也支持很多其它的,比方說 FAT16 (msdos), FAT32 (vfat),NTFS (ntfs),CD-ROM (iso9660),等等。 |
4 |
選項 |
文件系統可以通過各種各樣的選項來掛載。有可能,例如,掛載只讀的文件系統, 或者掛載阻止執行任何程序的文件系統(一個有用的安全特性,避免刪除媒介。) |
5 |
頻率 |
一位數字,指定是否和在什麼時間用 dump 命令來備份一個文件系統。 |
6 |
次序 |
一位數字,指定 fsck 命令按照什麼次序來檢查文件系統。 |
Mount
mount命令被用來掛載文件系統。執行這個不帶參數的命令,將會顯示 一系列當前掛載的文件系統。
[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,
uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)
使用umount來卸載設備。
卸載一個設備需要把所有剩餘的數據寫入這個設備,所以設備可以被安全地移除。
如沒有卸載設備,就移除了它,就有可能沒有把註定要發送到設備中的數據輸送完畢。
在某些情況下, 這些數據可能包含重要的目錄更新信息,這將導致文件系統損壞,這是發生在計算機中的最壞的事情之一。
使用
ls /dev
命令,來查看本機上的設備。Dev for devices.
[me@linuxbox ~]$ sudo tail -f /var/log/messages
查看系統日誌。tail將文件輸出到標準輸出。-f可以循環讀取(實時查看變化)。
Fdisk
fdisk用來操作分區。
[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb
首先卸載一個設備,並調用fdisk程序。
程序啓動後會出現提示。
每個字母代表了不同的操作。
P |
打印分區表 |
l |
查看可用的分區類型列表 |
t |
更改一個分區的id號碼 |
w |
將此前修改應用。 |
/dev/sdb 指整個設備,/dev/sdb1指這個設備的第一分區
mkfs
創建新的文件系統。
sudo mkfs -t ext3 /dev/sdb1
這表示在設備/dev/sdb1中,創建一個新的文件系統。系統類型由參數-t ext3指定。
fsck
檢查磁盤。使用這個命令通常意味着磁盤壞了(物理意義上)。
CD-ROM部分略。用到再看。
使用md5sum可以計算hash。
第十七章 網絡系統
Ping
不說了
Traceroute
1 ipcop.localdomain (192.168.1.1) 1.066 ms 1.366 ms 1.720 ms
輸出的每一行會如上所示。包含跳數,主機名,IP地址,和性能。
被隱藏起來的路由去信息會用星號*顯示。
Netstat
很重要,用來查看網絡設置。
使用-ie選項:
[me@linuxbox ~]$ netstat -ie
eth0 Link encap:Ethernet HWaddr 00:1d:09:9b:99:67
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::21d:9ff:fe9b:9967/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:238488 errors:0 dropped:0 overruns:0 frame:0
TX packets:403217 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100 RX bytes:153098921 (146.0 MB) TX
bytes:261035246 (248.9 MB) Memory:fdfc0000-fdfe0000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
...
至少有兩個網絡接口:eth0和lo,分別代表以太網接口和local。
首先查看第四行顯示的UP,證明有在正常工作。
以及第二行的IP地址,證明DHCP正常工作。
使用-r選項查看路由表
[me@linuxbox ~]$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
第一行顯示了目的地 192.168.1.0。IP 地址以零結尾是指網絡,而不是獨立主機, 所以這個目的地意味着局域網中的任何一臺主機。
下一個字段,Gateway, 是網關(路由器)的名字或 IP 地址,用它來連接當前的主機和目的地的網絡。 若這個字段顯示一個星號,則表明不需要網關。
Wget
不僅實現了ftp的基本功能,還能下載網頁,下載多個文件。
Ssh
SSH 由兩部分組成。SSH 服務端運行在遠端主機上,在端口 22 上監聽收到的外部連接,而 SSH 客戶端用在本地系統中,用來和遠端服務器通信。
如果當前客戶端的用戶名和遠端服務器的用戶名不同,可以使用以下形式指定用戶:
ssh bob@remote-sys
Scp
從服務器上拷貝一個交document.txt的文件到我家
scp remote-sys:document.txt .
第十八章 查找文件
Locate
locate實屬簡單。
[me@linuxbox ~]$ locate zip | grep bin
find
而 find 程序能基於各種各樣的屬性 搜索一個給定目錄。
例如find ~會列出~下的所有文件。
Find -type b
可以只列出指定類型的文件。參數表如下。
文件類型 |
描述 |
b |
塊特殊設備文件 |
c |
字符特殊設備文件 |
d |
目錄 |
f |
普通文件 |
l |
符號鏈接 |
find ~ -type f -name "*.JPG" -size +1M | wc -l
還可使用-name和-size來指定名字和大小。
+1M表示大於1M,-1M表示小於,沒有符號表示正好。
-size參數列表
字符 |
單位 |
b |
512 個字節塊。如果沒有指定單位,則這是默認值。 |
c |
字節 |
w |
兩個字節的字 |
k |
千字節(1024個字節單位) |
M |
兆字節(1048576個字節單位) |
G |
千兆字節(1073741824個字節單位) |
find的其它參數
測試條件 |
描述 |
-cmin n |
匹配內容或屬性最後修改時間正好在 n 分鐘之前的文件或目錄。 指定少於 n 分鐘之前,使用 -n,指定多於 n 分鐘之前,使用 +n。 |
-cnewer file |
匹配內容或屬性最後修改時間晚於 file 的文件或目錄。 |
-ctime n |
匹配內容和屬性最後修改時間在 n*24小時之前的文件和目錄。 |
-empty |
匹配空文件和目錄。 |
-group name |
匹配屬於一個組的文件或目錄。組可以用組名或組 ID 來表示。 |
-iname pattern |
就像-name 測試條件,但是不區分大小寫。 |
-inum n |
匹配 inode 號是 n的文件。這對於找到某個特殊 inode 的所有硬鏈接很有幫助。 |
-mmin n |
匹配內容被修改於 n 分鐘之前的文件或目錄。 |
-mtime n |
匹配的文件或目錄的內容被修改於 n*24小時之前。 |
-name pattern |
用指定的通配符模式匹配的文件和目錄。 |
-newer file |
匹配內容晚於指定的文件的文件和目錄。這在編寫執行備份的 shell 腳本的時候很有幫。 每次你製作一個備份,更新文件(比如說日誌),然後使用 find 命令來判斷哪些文件自從上一次更新之後被更改了。 |
-nouser |
匹配不屬於一個有效用戶的文件和目錄。這可以用來查找 屬於被刪除的帳戶的文件或監測攻擊行爲。 |
-nogroup |
匹配不屬於一個有效的組的文件和目錄。 |
-perm mode |
匹配權限已經設置爲指定的 mode的文件或目錄。mode 可以用 八進制或符號表示法。 |
-samefile name |
類似於-inum 測試條件。匹配和文件 name 享有同樣 inode 號的文件。 |
-size n |
匹配大小爲 n 的文件 |
-type c |
匹配文件類型是 c 的文件。 |
-user name |
匹配屬於某個用戶的文件或目錄。這個用戶可以通過用戶名或用戶 ID 來表示。 |
~可以使用括號(要加上轉義符),-not -or來控制邏輯。邏輯存在短路。
[me@linuxbox ~]$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
使用以下參數來對find到的文件進行操作。
操作 |
描述 |
-delete |
刪除當前匹配的文件。 |
-ls |
對匹配的文件執行等同的 ls -dils 命令。並將結果發送到標準輸出。 |
|
把匹配文件的全路徑名輸送到標準輸出。如果沒有指定其它操作,這是 默認操作。 |
-quit |
一旦找到一個匹配,退出。 |
除了表中的行爲,也可以使用下列命令自定義行爲:
-exec rm '{}' ';'
注意要使用單引號轉義。
find的結果是無序的,取決於實際存儲。
提高find的效率:
低效率:
ls -l file1
ls -l file2
高效率:
ls -l file1 file2
xargs
find ~ -type f -name 'foo*' -print | xargs ls -l
xargs 會爲 ls 命令構建 參數列表,然後執行 ls 命令。
批量創建文件/文件夾:
[me@linuxbox ~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
[me@linuxbox ~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}
touch 命令通常被用來設置或更新文件的訪問,更改,和修改時間。
如果一個文件名參數是一個 不存在的文件,則會創建一個空文件。
Stat
超級加強版的ls。
第十九章 歸檔和備份
Gzip
使用gzip來壓縮文件,之後會用壓縮後的文件取代之前的文件。
使用gunzip來解壓。壓縮後會加上.gz的後綴。
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me me 15738 2008-10-14 07:15 foo.txt
[me@linuxbox ~]$ gzip foo.txt
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me me 3230 2008-10-14 07:15 foo.txt.gz
Bizip2
捨棄壓縮速度,獲得更好的壓縮率。使用方法和gzip一樣
Tar
Tar c/x/r/t +z/v/f
模式 |
說明 |
c |
爲文件和/或目錄列表創建歸檔文件。 |
x |
抽取歸檔文件。 |
r |
追加具體的路徑到歸檔文件的末尾。 |
t |
列出歸檔文件的內容。 |
注意不能使用絕對路徑,只能使用相對路徑。
Zip
windows上的那個zip,不多說
rsync
對應rsync協議,在本機和服務器上同步數據,會自動傳輸最小量的數據。
可以在本機到服務器,也可以服務器到本機,可以本機到本機,但總之不能服務器到服務器。
例如:
Rsync -av foo1 foo2
會將foo1拷貝到同目錄下,命名爲foo2。 -a代表遞歸和保護文件,-v代表輸出提示語句。
增加--delete,來允許其刪除在源目錄中不存在的文件。適合備份。
第二十章 正則表達式
Grep
查找文本中的行。
選項 |
描述 |
-i |
忽略大小寫。不會區分大小寫字符。也可用--ignore-case 來指定。 |
-v |
不匹配。通常,grep 程序會打印包含匹配項的文本行。這個選項導致 grep 程序只會打印不包含匹配項的文本行。也可用--invert-match 來指定。 |
-c |
打印匹配的數量(或者是不匹配的數目,若指定了-v 選項),而不是文本行本身。 也可用--count 選項來指定。 |
-l |
打印包含匹配項的文件名,而不是文本行本身,也可用--files-with-matches 選項來指定。 |
-L |
相似於-l 選項,但是隻是打印不包含匹配項的文件名。也可用--files-without-match 來指定。 |
-n |
在每個匹配行之前打印出其位於文件中的相應行號。也可用--line-number 選項來指定。 |
-h |
應用於多文件搜索,不輸出文件名。也可用--no-filename 選項來指定。 |
簡單的查找:
[me@linuxbox ~]$ grep bzip dirlist*.txt
dirlist-bin.txt:bzip2
dirlist-bin.txt:bzip2recover
同時,使用-l輸出查找到的文件,而非行:
[me@linuxbox ~]$ grep -l bzip dirlist*.txt
dirlist-bin.txt
原意字符
以bzip爲例,這代表文中確實出現了這四個字符,並且是連續的。
除了以下的元字符,都是原意字符:
^ $ . [ ] { } - ? * + ( ) | \
.
一個圓點被用來匹配有且僅有的一個字符。
^和$
^zip表示zip在行首,可以理解爲每行都是^abc$表示的,這樣就可以將這兩個錨定字符理解爲原意字符。
[]
方括號中的字符串中的任意一個會被匹配。也就是說從方括號中選一個。
grep -h '[bg]zip' dirlist*.txt
bzip2
bzip2recover
gzip
方括號中的元字符除了^和-,都會被解釋爲原意。
^作爲否定
[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt
bunzip2
gunzip
funzip
gpg-zip
…
這裏在方括號中的第一處填入^,使得匹配了除了b和g之外的字符。
如果不是第一處就是^,那麼會被當作原意字符處理。
-
連字符用來方便地在方括號中節約時間。
[me@linuxbox ~]$ grep -h '^[A-Za-z0-9]' dirlist*.txt
這表示所有數字或者字母開頭的文件名。
方括號中是完備的,^和-如果位置正確,不會查不到。如果我們想把-作爲原意使用,將其放在第一個就好了。
[me@linuxbox ~]$ grep -h '[-AZ]' dirlist*.txt
posix字符集
有時使用A-Z不能得到預期的結果,因爲並不全是按照ASCII碼編寫的。
按照以下的字符集可以得到預期的結果,但是這不是正則表達式,而是shell展開。
字符集 |
說明 |
[:alnum:] |
字母數字字符。在 ASCII 中,等價於:[A-Za-z0-9] |
[:word:] |
與[:alnum:]相同, 但增加了下劃線字符。 |
[:alpha:] |
字母字符。在 ASCII 中,等價於:[A-Za-z] |
[:blank:] |
包含空格和 tab 字符。 |
[:cntrl:] |
ASCII 的控制碼。包含了0到31,和127的 ASCII 字符。 |
[:digit:] |
數字0到9 |
[:graph:] |
可視字符。在 ASCII 中,它包含33到126的字符。 |
[:lower:] |
小寫字母。 |
[:punct:] |
標點符號字符。在 ASCII 中,等價於:[-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~] |
[:print:] |
可打印的字符。在[:graph:]中的所有字符,再加上空格字符。 |
[:space:] |
空白字符,包括空格、tab、回車、換行、vertical tab 和 form feed.在 ASCII 中, 等價於:[ \t\r\n\v\f] |
[:upper:] |
大寫字母。 |
[:xdigit:] |
用來表示十六進制數字的字符。在 ASCII 中,等價於:[0-9A-Fa-f] |
bre和ere
BRE是基本的正則表達式,ERE是擴展的。
之前提到的
^ $ . [ ] *
屬於基本正則表達式元字符,而這些是擴展的:
( ) { } ? + |
一個更怪的地方就是,
大小括號,在ERE中,只有被\轉義之後纔是元字符。
真是不能更怪了。
使用ere時,需要給grep加上-E,或者直接使用egrep。
|
使用 | 來表示或。邏輯不清時,使用小括號分隔。
grep -Eh '^(bz|gz|zip)' dirlist*.txt
?
問號? 使前面的元素可有可無。
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
*
和.的使用方法類似,但是要寬鬆的多:不必匹配恰好一個,0個或者多個也可以。
+
用來限定,前面的匹配項必須出現。
[me@linuxbox ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'
This that
[me@linuxbox ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'
a b c
[me@linuxbox ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'
[me@linuxbox ~]$ echo "abc d" | grep -E '^([[:alpha:]]+ ?)+$'
{}
限定前面的匹配項匹配到的字符個數
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
(555) 123-4567
{n} |
匹配前面的元素,如果它確切地出現了 n 次。 |
{n,m} |
匹配前面的元素,如果它至少出現了 n 次,但是不多於 m 次。 |
{n,} |
匹配前面的元素,如果它出現了 n 次或多於 n 次。 |
{,m} |
匹配前面的元素,如果它出現的次數不多於 m 次。 |
應用
查找不正確的電話號碼:
[me@linuxbox ~]$ cat phonelist.txt
(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440
[me@linuxbox ~]$ grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$' phonelist.txt
(292) 108-518
(129) 44-1379
-v用來取反,[0-9]表示數字,{3}表示匹配出三個字符。最好正則都用單引號括起來。
在vim中使用/+正則可以起到同樣的效果。