linux 的基本操作(linux系統的日常管理)


系統的日常管理

筆者在前面介紹的內容都為linux系統基礎類的,如果你現在把前面的內容全部很好的掌握了,那最好了。不過筆者要說的是,即使你完全掌握了,你現在還是不能作為一名合格的linux系統管理員的,畢竟系統管理員要會做的事情太多了。本章以及后面章節筆者會陸續教給你作為linux系統管理員所必備的知識。只要你熟練掌握那絕對可以勝任一個最初級的管理員職位,不過只是初級的,因為你還需要在日常的管理工作中獲得成長。

監控系統的狀態

1. w 查看當前系統的負載

相信所有的linux管理員最常用的命令就是這個’w’ 了,該命令顯示的信息還是蠻豐富的。第一行從左面開始顯示的信息依次為:時間,系統運行時間,登錄用戶數,平均負載。第二行開始以及下面所有的行,告訴我們的信息是,當前登錄的都有哪些用戶,以及他們是從哪里登錄的等等。其實,在這些信息當中,筆者認為我們最應該關注的應該是第一行中的’load average:’后面的三個數值。

第一個數值表示1分鍾內系統的平均負載值;第二個數值表示5分鍾內系統的平均負載值;第三個數值表示15分鍾系統的平均負載值。這個值的意義是,單位時間段內CPU活動進程數。當然這個值越大就說明你的服務器壓力越大。一般情況下這個值只要不超過你服務器的cpu數量就沒有關系,如果你的服務器cpu數量為8,那么這個值若小於8,就說明你的服務器沒有壓力,否則就要關注一下了。到這里你肯定會問,如何查看服務器有幾個cpu?

就是用這個命令了。’/proc/cpuinfo’這個文件記錄了cpu的詳細信息。目前市面上的服務器通常都是2顆4核cpu,在linux看來,它就是8個cpu。查看這個文件時則會顯示8段類似的信息,而最后一段信息中processor : 后面跟的是’7’。所以查看當前系統有幾個cpu,你可以使用這個命令:’ grep -c 'processor' /proc/cpuinfo’ 。

2. vmstat 監控系統的狀態

上面講的w查看的是系統整體上的負載,通過看那個數值可以知道當前系統有沒有壓力,但是具體是哪里(CPU, 內存,磁盤等)有壓力就無法判斷了。通過vmstat就可以知道具體是哪里有壓力。vmstat命令打印的結果共分為6部分:procs, memory, swap, io, system, cpu.請重點關注一下紅色標出的項。

1)procs 顯示進程相關信息

r:表示運行和等待cpu時間片的進程數,如果長期大於服務器cpu的個數,則說明cpu不夠用了;

b:表示等待資源的進程數,比如等待I/O, 內存等,這列的值如果長時間大於1,則需要你關注一下了;

2)memory 內存相關信息

swpd :表示切換到交換分區中的內存數量;

free :當前空閑的內存數量;

buff :緩沖大小,(即將寫入磁盤的);

cache :緩存大小,(從磁盤中讀取的);

3)swap 內存交換情況

si :由內存進入交換區的數量;

so:由交換區進入內存的數量;

4)io 磁盤使用情況

bi :從塊設備讀取數據的量(讀磁盤);

bo:從塊設備寫入數據的量(寫磁盤);

5)system 顯示采集間隔內發生的中斷次數

in :表示在某一時間間隔中觀測到的每秒設備中斷數;

cs :表示每秒產生的上下文切換次數;

6)CPU 顯示cpu的使用狀態

us :顯示了用戶下所花費 cpu 時間的百分比;

sy :顯示系統花費cpu時間百分比;

id :表示cpu處於空閑狀態的時間百分比;

wa:表示I/O等待所占用cpu時間百分比;

st :表示被偷走的cpu所占百分比(一般都為0,不用關注);

以上所介紹的各個參數中,筆者經常會關注r列,b列,和wa列,三列代表的含義在上邊說得已經很清楚。IO部分的bi以及bo也是我要經常參考的對象。如果磁盤io壓力很大時,這兩列的數值會比較高。另外當si, so兩列的數值比較高,並且在不斷變化時,說明內存不夠了,內存中的數據頻繁交換到交換分區中,這往往對系統性能影響極大。

筆者用vmstat時,經常用這樣的形式,’vmstat 1 5’ 表示每隔1秒鍾打印一次系統狀態,連續打印5次。當然你也可以 ‘vmstat 1 ‘ 表示每隔1秒鍾打印一次系統狀態,一直打印,除非你按ctrl + c強制結束。

3. top 顯示進程所占系統資源

這個命令用於動態監控進程所占系統資源,每隔3秒變一次。這個命令的特點是把占用系統資源(CPU,內存,磁盤IO等)最高的進程放到最前面。top命令打印出了很多信息,包括系統負載(load average)、進程數(Tasks)、cpu使用情況、內存使用情況以及交換分區使用情況。其實上面這些內容可以通過其他命令來查看,所以用top重點查看的還是下面的進程使用系統資源詳細狀況。這部分東西反映的東西還是比較多的,不過需要你關注的也就是幾項:%CPU, %MEM, COMMAND 這些項目所代表的意義,不用筆者介紹相信你也能看懂吧。

另外筆者使用top命令時還常常使用-bn1 這個組合選項,它表示非動態打印系統資源使用情況,可以用在腳本中,你不妨記一下,以后也許你會用得到。

4. sar 監控系統狀態

sar 命令很強大,它可以監控系統所有資源狀態,比如平均負載、網卡流量、磁盤狀態、內存使用等等。它不同於其他系統狀態監控工具的地方在於,它可以打印歷史信息,可以顯示當天從零點開始到當前時刻的系統狀態信息。如果你系統沒有安裝這個命令,請使用”yum install -y sysstat”命令安裝。初次使用sar命令會報錯,那是因為sar工具還沒有生成相應的數據庫文件(時時監控就不會了,因為不用去查詢那個庫文件)。它的數據庫文件在” /var/log/sa/”目錄下,默認保存9天。因為這個命令太過復雜,所以筆者只介紹幾個。

1)查看網卡流量 ‘sar -n DEV ‘

IFACE這列表示設備名稱,rxpck/s 表示每秒進入收取的包的數量,txpck/s 表示每秒發送出去的包的數量,rxbyt/s 表示每秒收取的數據量(單位Byte),txbyt/s表示每秒發送的數據量。后面幾列不需要關注。如果有一天你所管理的服務器丟包非常嚴重,那么你就應該看一看這個網卡流量是否異常了,如果rxpck/s那一列的數值大於4000,或者rxbyt/s那列大於5,000,000則很有可能是被攻擊了,正常的服務器網卡流量不會高於這么多,除非是你自己在拷貝數據。上面的命令是查看網卡流量歷史的,如何時時查看網卡流量呢?

另外也可以查看某一天的網卡流量歷史,使用-f選項,后面跟文件名,如果你的系統格式Redhat或者CentOS那么sar的庫文件一定是在/var/log/sa/目錄下的。

2)查看歷史負載 ‘sar -q’

這個命令有助於我們查看服務器在過去的某個時間的負載狀況。

關於sar的介紹筆者不願寫太多,畢竟介紹太多會給你帶來更多的壓力,其實筆者介紹這個命令的目的只是讓你學會查看網卡流量(這是非常有用的)。如果你很感興趣那就man一下吧,它的用法太多了。

5. free查看內存使用狀況

只要你敲一個free然后回車就可以當前系統的總內存大小以及使用內存的情況。從上圖中可看到當前系統內存總大小為235128(單位是k)已經使用120368,剩余94760。其實真正剩余並不是這個94760,而是第二行的213388,真正使用的也是第二行的21740。這是因為系統初始化時,就已經分配出很大一部分內存給緩存,這部分緩存用來隨時提供給程序使用,如果程序不用,那這部分內存就空閑。所以,查看內存使用多少,剩余多少請看第二行的數據。另外你還可以加-m 或者-g選項分別以M或G為單位打印內存使用狀況。

6. ps 查看系統進程

作為系統管理員,一定要知道你所管理的系統都有那些進程在運行,在windows下只要打開任務管理器即可查看。在linux下呢?其實在上面介紹的top命令就可以,但是不夠專業,當然還有專門顯示系統進程的命令。

對了,就是這個’ps aux’。筆者也經常看到有的人喜歡用’ps -elf’ 大同小異,顯示的信息基本上是一樣的。 ps命令還有更多的用法,筆者不再做介紹,因為你只要會用這個命令就足夠了,請man一下。下面介紹上圖上出現的幾個參數的意義。

PID:進程的id,這個id很有用,在linux中內核管理進程就得靠pid來識別和管理某一個程,比如我想終止某一個進程,則用 ‘kill 進程的pid’,有時並不能殺掉,則需要加一個-9選項了’kill -9 進程pid’

STAT :表示進程的狀態,進程狀態分為以下幾種(不要求記住,但要了解)

D 不能中斷的進程(通常為IO)

R 正在運行中的進程

S 已經中斷的進程,通常情況下,系統中大部分進程都是這個狀態

T 已經停止或者暫停的進程,如果我們正在運行一個命令,比如說sleep 10,如果我們按一下ctrl -z 讓他暫停,那么我們用ps查看就會顯示T這個狀態

W 這個好像是說,從內核2.6xx 以后,表示為沒有足夠的內存頁分配

X 已經死掉的進程(這個好像從來不會出現)

Z 僵屍進程,殺不掉,打不死的垃圾進程,占系統一小點資源,不過沒有關系。如果太多,就有問題了。一般不會出現。

< 高優先級進程

N 低優先級進程

L 在內存中被鎖了內存分頁

s 主進程

l 多線程進程

+ 代表在前台運行的進程

這個ps命令是筆者在工作中用的非常多的命令之一,所以請記住它吧。關於ps命令的使用,筆者經常會連同管道符一起使用,用來查看某個進程或者它的數量。

上面的6不對,需要減掉1,因為使用grep命令時,grep命令本身也算作了一個。

7. netstat 查看網絡狀況

netstat命令用來打印網絡連接狀況、系統所開放端口、路由表等信息。筆者最常用的關於netstat的命令就是這個netstat -lnp(打印當前系統啟動哪些端口)以及netstat -an (打印網絡連接狀況)這兩個命令非常有用,請一定要記住。

如果你所管理的服務器是一台提供web服務(80端口)的服務器,那么你就可以使用netstat -an |grep 80開查看當前連接web服務的有哪些IP了。

8. 抓包工具tcpdump

有時候,也許你會有這樣的需求,想看一下某個網卡上都有哪些數據包,尤其是當你初步判定你的服務器上有流量攻擊。這時,使用抓包工具來抓一下數據包,就可以知道有哪些IP在攻擊你了。

如果你沒有tcpdump 這個命令,需要用’yum install -y tcpdump ’命令去安裝一下。上圖中第三列和第四列顯示的信息為哪一個IP+port在連接哪一個IP+port,后面的信息是該數據包的相關信息,如果不懂也沒有關系,畢竟你不是專門搞網絡的,而這里需要你關注的只是第三列以及第四列。-i 選項后面跟設備名稱,如果你想抓eth1網卡的包,后面則要跟eth1.至於-nn選項的作用是讓第三列和第四列顯示成IP+端口號的形式,如果不加-nn則顯示的是主機名+服務名稱。

【linux網絡相關

1. ifconfig 查看網卡IP

ifconfig類似與windows的ipconfig,不加任何選項和參數只打印當前網卡的IP相關信息(子網掩碼、網關等)

當然ifconfig后面可以跟設備名,只打印指定設備的IP信息。

在windows下設置IP非常簡單,然而在命令窗口下如何設置?這就需要去修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0了,如果是eth1那么配置文件是/etc/sysconfig/network-scripts/ifcfg-eth1.

如果想修改IP的話,則只需要修改IPADDR , NETMASK以及GATEWAY即可。如果你的linux是通過dhcp服務器自動獲得的IP,那么配置文件肯定和上圖中的不一樣,BOOTPROTO那里會是’dhcp’,如果你要配置成靜態IP的話,這里就需要寫成’none’。關於如何設置IP以及子網掩碼的這些知識屬於網絡相關的基礎知識了,如果你對這方面比較陌生的話,建議你去看看網絡相關的資料。當修改完IP后需要重啟網絡服務新IP才能生效,重啟命令為’ service network restart’

另外如果你有多個網卡的情況時,只想重啟某一個網卡的話,還可以使用這個命令。

ifdown 即停掉網卡,ifup即啟動網卡。有一點要提醒你的是,如果你遠程登錄你的服務器,當你使用ifdown eth0這個命令的時候,很有可能后面的命令ifup eth0不會被運行,這樣導致你斷網而無法連接服務器,所以請盡量使用service network restart 這個命令來重啟網卡。

2. 給一個網卡設定多個IP

在linux系統中,網卡是可以設定多重IP的,筆者曾經管理的一台服務器的eth1就設定了5個IP,實在是夠變態的。

把ifcfg-eth0復制成ifcfg-eth0:1 然后編輯ifcfg-eth0:1修改DEVICE以及IPADDR保存后重啟網卡。

再次查看eth0上就有兩個IP了。這里你要注意一下,文件名(ifcft-eth0:1)寫成什么都無所謂,但是文件內的DEVICE=eth0:1一定要按照這樣的格式寫,否則你啟動不起來網卡。

3. 查看網卡連接狀態

mii-tool這個命令用來查看網卡是否連接,如圖顯示link ok等字樣說明連接正常,否則會顯示’no link’字樣,下圖是筆者所管理的一台服務器,eth1網卡沒有連接。

如果你的機器是虛擬機,那么你使用該命令時應該顯示成如下:

這是因為使用的是虛擬網卡,不支持這個工具查看。不用多關注此,你記住這個mii-tool命令即可,它可是會經常用到的。

4. 更改主機名

當裝完系統后,默認主機名為localhost,使用hostname就可以知道你的linux的主機名是什么。

同樣使用hostname可以更改你的主機名。

下次登錄時就會把命令提示符
中的’localhost’更改成’Aming’。不過這樣修改只是保存在內存中,下次重啟還會變成未改之前的主機名,所以需要你還要去更改相關的配置文件’/etc/sysconfig/network’。

把HOSTNAME=localhost.localdomain 修改成你想要的主機名,這樣再重啟就會讀取這個配置文件中的HOSTNAME.

5. 設置DNS

DNS是用來解析域名用的,平時我們訪問網站都是直接輸入一個網址,而dns把這個網址解析到一個IP。關於dns的概念,如果你很陌生的話,那就去網上查一下吧。在linux下面設置dns非常簡單,只要把dns地址寫到一個配置文件中即可。這個配置文件就是/etc/resolv.conf

resolv.conf有它固有的格式,一定要寫成’nameserver IP’的格式,上面那行以’;’為開頭的行是一行注釋,沒有實際意義,建議寫兩個或多個namserver ,默認會用第一個namserver去解析域名,當第一個解析不到時會使用第二個。在linux下面有一個特殊的文件/etc/hosts也能解析域名,不過是需要我們手動在里面添加IP+域名這些內容,它的作用是臨時解析某個域名,非常有用。

它的格式如上圖,每一行作為一條記錄,分成兩部分,第一部分是IP,第二部分是域名。關於hosts文件,有幾點需要你注意:

1)一個IP后面可以跟多個域名,可以是幾十個甚至上百個;

2)每行只能有一個IP,也就是說一個域名不能對應多個IP;

3)如果有多行中出現相同的域名(前面IP不一樣),會按最前面出現的記錄來解析。

linux的防火牆

1. selinux

Selinux是Redhat/CentOS系統特有的安全機制。不過因為這個東西限制太多,配置也特別繁瑣所以幾乎沒有人去真正應用它。所以裝完系統,我們一般都要把selinux關閉,以免引起不必要的麻煩。關閉selinux的方法為:

把’SELINUX=enforcing’改成’SELINUX=disabled’,然后重啟機器。臨時關閉selinux的命令為

getenforce命令可以得到selinux的狀態,其中有兩種(Enforcing|Permissive),前者表示開放,后者表示關閉,但是會發出警告。setenforce用來設置selinux的狀態,后面跟0則設置成Permissive后面跟1設置成Enforcing。關閉selinux的命令為setenforce 0,但是這只是臨時關閉,重啟后恢復,想要永久生效,請更改配置文件/etc/selinux/config。

2. iptables

Iptables是linux上特有的防火牆機制,其功能非常強大,然而筆者在日常的管理工作中僅僅用到了一兩個應用,這並不代表iptables不重要。作為一個網絡管理員,iptables是必要要熟練掌握的。但是作為系統管理員,我們也應該會最基本的iptables操作,認識iptables的基本規則。

1iptalbes的三個表

filter :這個表主要用於過濾包的,是系統預設的表,這個表也是筆者用的最多的。內建三個鏈INPUT、OUTPUT以及FORWARD。INPUT作用於進入本機的包;OUTPUT作用於本機送出的包;FORWARD作用於那些跟本機無關的包。

nat :主要用處是網絡地址轉換,也有三個鏈。PREROUTING 鏈的作用是在包剛剛到達防火牆時改變它的目的地址,如果需要的話。OUTPUT鏈改變本地產生的包的目的地址。POSTROUTING鏈在包就要離開防火牆之前改變其源地址。該表筆者用的不多,但有時候會用到。

mangle :這個表主要是用於給數據包打標記,然后根據標記去操作哪些包。這個表幾乎不怎么用。除非你想成為一個高級網絡工程師,否則你就沒有必要花費很多心思在它上面。

2iptables 基本語法

A. 查看規則以及清除規則

如上圖,-t 后面跟表名,-nvL 即查看該表的規則,其中-n表示不針對IP反解析主機名;-L表示列出的意思;而-v表示列出的信息更加詳細。如果不加-t,則打印filter表的相關信息。

這個和-t filter 打印的信息是一樣的。

關於清除規則的命令中,筆者用的最多就是

不加-t默認是針對表filter來操作的,-F 表示把所有規則全部刪除;-Z表示把包以及流量計數器置零(這個筆者認為很有用)。

B. 增加/刪除一條規則

這就是增加了一條規則,省略-t所以針對的是filter表。-A 表示增加一條規則,另外還有-I 表示插入一條規則,-D刪除一條規則;后面的INPUT即鏈名稱,還可以是OUTPUT或者FORWORD;-s 后跟源地址;-p 協議(tcp, udp, icmp); --sport/--dport 后跟源端口/目標端口;-d 后跟目的IP(主要針對內網或者外網);-j 后跟動作(DROP即把包丟掉,REJECT即包拒絕;ACCEPT即允許包)。這樣講可能很亂,那筆者多舉幾個例子來幫你理解:

上例表示:插入一條規則,把來自10.0.2.36的所有數據包丟掉。

刪除剛剛插入的規則。注意要刪除一條規則時,必須和插入的規則一致,也就是說,兩條iptables命令,除了-I 和-D不一樣外,其他地方都一樣。

上例表示把來自10.0.2.36 並且是tcp協議到本機的80端口的數據包丟掉。這里要說的是,--dport/--sport 必須要和-p選項一起使用,否則會出錯。

把發送到10.0.2.34的22端口的數據包丟掉。下面做一個小試驗:

一開始用本機ping 10.0.2.34是通的,然后使用iptables增加一條規則,使到10.0.2.34的icmp包丟掉,再ping 10.0.2.34則不通了。此時用’iptables –nvL’查看iptalbes規則。

會有一條這樣的記錄,看pkts那列顯示4個數據包,因為我們ping 的時候給10.0.2.34發送了4個數據包,第二列表示這4個數據包一共有多大(336bytes)。此時使用’iptables -Z' 清零。

現在你明白’iptables -Z’的意義了吧。至於FORWORD鏈的應用筆者幾乎沒有用到過,所以不再舉例。再總結一下各個選項的作用:

-A/-D :增加刪除一條規則;

-I :插入一條規則,其實跟-A的效果一樣;

-p :指定協議,可以是tcp,udp或者icmp;

--dport :跟-p一起使用,指定目標端口;

--sport :跟-p一起使用,指定源端口;

-s :指定源IP(可以是一個ip段);

-d :指定目的IP(可以是一個ip段);

-j :后跟動作,其中ACCEPT表示允許包,DROP表示丟掉包,REJECT表示拒絕包;

-i :指定網卡(不常用,但有時候能用到);

上例中表示,把來自10.0.2.0/24這個網段的並且作用在eth0上的包放行。有時候你的服務器上iptables過多了,想刪除某一條規則時,又不容易掌握當時創建時的規則。其實有一種比較簡單的方法:

查看結果如下:

刪除某一個規則的方法是:

-D 后跟鏈名,然后是規則num,這個num就是查看iptables規則時第一列的值。

iptables還有一個選項經常用到,-P(大寫)選項,表示預設策略。用法如下:

-P后面跟鏈名,策略內容或者為DROP或者為ACCEPT,默認是ACCEPT。注意:如果你在連接遠程服務器,千萬不要隨便敲這個命令,因為一旦你敲完回車你就會斷掉。

看到上圖中紅框標出的部分了吧,現在所有進來的數據包全部DROP了。這個策略一旦設定后,只能使用iptables -P ACCEPT才能恢復成原始狀態,而不能使用-F參數。下面筆者針對一個小需求講述一下這個iptables規則如何設定。

需求:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然后針對10.0.2.0/24開通22端口,對所有網段開放80端口,對所有網段開放21端口。

這個需求不算復雜,但是因為有多條規則,所以最好寫成腳本的形式。

完成腳本的編寫后,直接運行 ‘sh /usr/local/sbin/iptables.sh ’ 即可。如果想開機啟動時初始化防火牆規則,則需要在/etc/rc.d/rc.local 中添加一行 ‘sh /usr/local/sbin/iptables.sh’ 。

關於icmp的包有一個比較常見的應用。

--icmp-type 這個選項是要跟-p icmp 一起使用的,后面指定類型編號。這個8指的是能在本機ping通其他機器,而其他機器不能ping通本機。這個有必要記一下。

C. nat表的應用

其實,linux的iptables功能是十分強大的,筆者曾經的一個老師這樣形容linux的網絡功能:只有想不到沒有做不到!也就是說只要你能夠想到的關於網絡的應用,linux都能幫你實現。在日常生活中相信你接觸過路由器吧,它的功能就是分享上網。本來一根網線過來(其實只有一個公網IP),通過路由器后,路由器分配了一個網段(私網IP),這樣連接路由器的多台pc都能連接intnet而遠端的設備認為你的IP就是那個連接路由器的公網IP。這個路由器的功能其實就是由linux的iptables實現的,而iptables又是通過nat表作用而實現的這個功能。

至於具體的原理以及過程,筆者不想闡述,請查看相關資料。筆者在這里只舉一個例子來說明iptables如何實現的這個功能。假設你的機器上有兩塊網卡eth0和eth1,其中eth0的IP為10.0.2.68 ,eth1的IP為192.168.1.1 。eth0連接了intnet 但eth1沒有連接,現在有另一台機器(192.168.1.2)和eth1是互通的,那么如何設置也能夠讓連接eth1的這台機器能夠連接intnet(即能和10.0.2.68互通)?

其實就是這樣簡單的兩個命令就能實現上面的需求。第一個命令涉及到了內核參數相關的配置文件,它的目的是為了打開路由轉發功能,否則無法實現我們的應用。第二個命令則是iptables對nat表做了一個IP轉發的操作,-o 選項后跟設備名,表示出口的網卡,MASQUERADE表示偽裝的意思。

關於nat表,筆者不想講太多內容,你只要學會這個路由轉發即可。其他的東西交給網絡工程師去學習吧,畢竟你將來可是要做linux系統工程師的。

D. 保存以及備份iptalbes規則

也許你不知道,咱們設定的防火牆規則只是保存在內存中,並沒有保存到某一個文件中,也就說當系統重啟后以前設定的規則就沒有了,所以設定好規則后要先保存一下。

它會提示你把規則保存在了/etc/sysconfig/iptables文件內。其實,這個文件就是iptables的配置文件了,你不妨查看一下它。

紅線部分就是咱們剛才設定那條規則!有時可能因為我們設置防火牆規則有誤導致服務器出問題,這時候不妨先備份一下這個配置文件,然后停止防火牆服務。

這樣防火牆就失效了,但是一旦你重新設定規則后(哪怕只有一條),防火牆又開始工作了。

我還可以使用iptables-save >filename 這條命令來保存一個防火牆規則,這樣就可以起到備份的作用了。要想恢復這個規則使用下面這個命令即可。

linux系統的任務計划

這部分內容太重要了,其實大部分系統管理工作都是通過定期自動執行某一個腳本來完成的,那么如何定期執行某一個腳本呢?這就要借助linux的cron功能了。

關於cron任務計划功能的操作都是通過crontab這個命令來完成的。其中常用的選項有:

-u :指定某個用戶,不加-u選項則為當前用戶;

-e :制定計划任務;

-l :列出計划任務;

-r :刪除計划任務。

使用crontab -e 來制定計划任務,上面的例子表示在05月26日(這天必須是周四)的10點01分執行’ echo "ok" >/root/cron.log’這樣的任務。

Cron的格式是這樣的,每一行代表一個任務計划,總共分成兩部分,前面部分為時間,后面部分要執行的命令。后面的命令不用多講,至於前面的時間是有講究的,這個時間共分為5段,用空格隔開(可以是多個空格),第一段表示分鍾(0-59),第二段表示小時(0-23),第三段表示日(1-31),第四段表示月(1-12),第五段表示周(0-7,0或者7都可以表示為周日)。從左至右依次是:分,時,日,月,周(一定要牢記)!

crontab -e 實際上是打開了/var/spool/cron/username (如果是root則打開的是/var/spool/cron/root)這個文件。使用的是vim編輯器,所以要保存的話則在命令模式下輸入:wq即可。但是,你千萬不要直接去編輯那個文件,因為可能會出錯,所以一定要使用crontab -e來編輯。查看已經設定的任務計划使用crontab -l

刪除計划任務要用crontab -r

下面筆者給你出一些練習題,幫助你熟悉這個cron的應用。

1. 每天凌晨1點20分清除/var/log/slow.log這個文件;

2. 每周日3點執行’/bin/sh /usr/local/sbin/backup.sh’;

3. 每月14號4點10分執行’/bin/sh /usr/local/sbin/backup_month.sh’;

4. 每隔8小時執行’ntpdate time.windows.com’;

5. 每天的1點,12點,18點執行’/bin/sh /usr/local/sbin/test.sh’;

6. 每天的9點到18點執行’/bin/sh /usr/local/sbin/test2.sh’;

答案:

1. 20 1 * * * echo “”>/var/log/slow.log

2. 0 30 * * 0 /bin/sh /usr/local/sbin/backup.sh

3. 10 04 14 * * /bin/sh /usr/local/sbin/backup_month.sh

4. 0 */8 * * * ntpdate time.windows.com

5. 0 1,12,18 * * /bin/sh /usr/local/sbin/test.sh

6. 0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh

Cron的這部分內容並不難,你只要會了這6道練習題,你就算掌握它了。這里要簡單說一下,每隔8小時,就是用全部小時(0-23)去除以8,你仔細想一下結果,其實算出來應該是0,8,16三個數。當遇到多個數(分鍾、小時、月、周)例如第5題,則需要用逗號隔開。而時間段是可以用’-‘的方式表示的。等設置好了所有的計划任務后需要查看一下crond服務是否啟動,如果沒有啟動,需要啟動它。

如何啟動稍后會做介紹。除了用戶自定義的計划任務外,其實系統本身也有計划任務的。

系統會安裝這個配置文件中的計划去執行內定的任務。

linux的系統服務管理

如果你對windows非常熟悉的話,相信你肯定配置過開機啟動的服務,有些服務我們日常用不到則要把它停掉,一來可以節省資源,二來可以減少安全隱患。在linux上同樣也有相關的工具來管理系統的服務。

1. ntsysv

用來配置哪些服務開啟或者關閉,有點想圖形界面,不過是使用鍵盤來控制的。如果沒有這個命令請使用 yum install -y ntsysv 安裝它。

敲完這個命令后則顯示出如上圖中的畫面。在屏幕的最上面有’Red Hat’等字樣,這是在告訴我們這個工具是由Red Hat公司開發的。按鍵盤的上下方向鍵可以調節紅色光標,按空格可以選擇開啟或者不開啟,如果前面的中括號內顯示有’*’ 則表示開啟否則不開啟。通過這個工具也可以看到目前系統中所有的服務。建議除’crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl’ 外其他服務全部停掉。選擇好后,按’tab’鍵選擇ok然后回車。需要重啟機器才能生效。

2. chkconfig

Linux系統所有的預設服務可以查看/etc/init.d/目錄得到

其實這就是系統所有的預設服務了。為什么這樣講,因為系統預設服務都是可以通過這樣的命令實現 ‘service 服務名 start|stop|restart’ ,這里的服務名就是/etc/init.d/目錄下的這些文件了。除了可以使用’service crond start ‘啟動crond外,還可以使用/etc/init.d/crond start 來啟動。

如上圖,這兩個命令出來的結果是一樣的。

再看看這個chkconfig命令,它不僅可以列出來所有的服務,還可以詳細到每個級別。這里的級別(0,1,2,3,4,5,6)就是inittab里面介紹的那幾個啟動級別了。

這樣還可以查看某一個服務的啟動情況。

用--level 指定級別,后面是服務名,然后是off或者on,--level后還可以跟多個級別。

另外還可以省略級別,默認是針對2,3,4,5級別操作。

另外這個chkconfig 還有一個功能就是可以把某個服務加入到系統服務,即可以使用service 服務名 start 這樣的形式,並且可以在chkconfig --list 中查找到。當然也能刪除掉。

這個功能常用在把自定義的啟動腳本加入到系統服務當中。關於系統服務就講這些內容,其實還有很多內容筆者沒有介紹,道理很簡單,一來講多了你不能消化二來講多了你也用不上。

linux中的數據備份

數據備份,不用說太多吧,毫無疑問很重要。筆者就曾經有過一次非常痛苦的經歷,備份策略沒有做好,結果磁盤壞掉數據丟失,簡直是撕心裂肺的痛呀。還好數據重要性不是特別高,即使是不高也是丟失了數據,這是作為系統管理員最不應該出現的事故。所以,在你以后的系統維護工作中,一定要把數據備份當回事,認真對待。在linux上作為數據備份的工具很多,但筆者就只用一種那就是rsync 從字面上的意思你可以理解為remote sync (遠程同步)這樣可以讓你理解的更深刻一些。Rsync不僅可以遠程同步數據(類似於scp),當然還可以本地同步數據(類似於cp),但不同於cp或scp的一點是,rsync不像cp/scp一樣會覆蓋以前的數據(如果數據已經存在),它會先判斷已經存在的數據和新數據有什么不同,只有不同時才會把不同的部分覆蓋掉。如果你的linux上下面看例子吧。(如果沒有rsync命令請使用yum install -y rsync安裝)

上面例子表示把當前目錄下的123同步到/tmp/目錄下,並且同樣也命名為123。如果是遠程拷貝的話就是這樣的形式了 IP:path (如:10.0.2.34:/root/)

當建立連接后,是需要輸入密碼的。如果手動去執行這些操作還好,但是如果是寫在腳本中怎么辦?這就涉及到添加信任關系了,該部分內容稍后會詳細介紹。

1. rsync的命令格式

rsync [OPTION]... SRC DEST

rsync [OPTION]... SRC [USER@]HOST:DEST

rsync [OPTION]... [USER@]HOST:SRC DEST

rsync [OPTION]... [USER@]HOST::SRC DEST

rsync [OPTION]... SRC [USER@]HOST::DEST

筆者在一開始舉的兩個例子,第一個例子即為第一種格式,第二個例子即為第二種格式,但不同的是,筆者並沒有加user@host 如果不加默認指的是root 。第三種格式是從遠程目錄同步數據到本地。第四種以及第五種格式使用了兩個冒號,這種方式和前面的方式的不同在於驗證方式不同,稍后詳細介紹。

2. rsync常用選項

-a:歸檔模式,表示以遞歸方式傳輸文件,並保持所有屬性,等同於-rlptgoD ,-a選項后面可以跟一個 --no-OPTION 這個表示關閉-rlptgoD中的某一個例如-a --no-l 等同於-rptgoD

-r :對子目錄以遞歸模式處理,主要是針對目錄來說的,如果單獨傳一個文件不需要加-r,但是傳輸的是目錄必須加-r選項

-v :打印一些信息出來,比如速率,文件數量等

-l :保留軟鏈結

-L :向對待常規文件一樣處理軟鏈結,如果是SRC中有軟連接文件,則加上該選項后將會把軟連接指向的目標文件拷貝到DST

-p :保持文件權限

-o :保持文件屬主信息

-g :保持文件屬組信息

-D :保持設備文件信息

-t :保持文件時間信息

--delete :刪除那些DST中SRC沒有的文件

--exclude=PATTERN:指定排除不需要傳輸的文件,等號后面跟文件名,可以是萬用字符模式(如*.txt)

-u :加上這個選項后將會把DST中比SRC還新的文件排除掉,不會覆蓋

下面筆者將會針對這些選項做一些列小實驗:

1)建立目錄以及文件

筆者建立這些文件的目的就是為做試驗做一些准備工作。

2)使用-a選項

這里有一個問題,就是本來想把test1目錄直接拷貝成test2目錄,可結果rsync卻新建了test2目錄然后把test1放到test2當中。為了避免這樣的情況發生,可以這樣做:

加一個斜杠就好了,所以筆者建議你在使用rsync備份目錄時要養成加斜杠的習慣。在上面講了-a選項等同於- rlptgoD,而且-a還可以和--no-OPTION一並使用。

筆者加上-v選項來獲得更多的信息,上例中因為沒有使用-r選項導致只能拷貝目錄但不能拷貝目錄下面的內容(英文翻譯過來就是“忽略了目錄test1/.”,其中test1/.指的就是test1目錄內部的所有文件),所以雖然創建了test2目錄,但是test2目錄為空。下面再看看那個-l選項的作用。

使用-v選項看來就是方便呀,上例告訴我們跳過了非普通文件1.sh,其實1.sh是一個軟連接文件,如果不使用-l選項則不會理會軟連接文件的。

果真test2目錄當中沒有那個1.sh的影子。當然加上-l選項則會把軟連接文件給拷貝過去,但是軟連接的目標文件卻沒有拷貝過去,有時候咱們指向拷貝軟連接文件所指向的目標文件,那這時候該怎么辦呢?

3)使用-L選項

一個-L就可以把SRC中軟連接的目標文件給拷貝到DST

4)使用-u選項

首先查看一下test1/1 和 test2/1的訪問時間(肯定是一樣的),然后使用touch修改一下test2/1的訪問時間(此時test2/1要比test1/1的訪問時間晚了一些),如果不加-u選項的話,會把test2/1的訪問時間變成和test1/1的訪問時間一樣。這樣講也許你會迷糊,不妨看一看。

看到了吧,本來test2/1的訪問時間已經不同於test1/1的訪問時間了,但是同步后訪問時間又一致了。

現在你明白-u選項的妙用了吧。

5)使用--delete選項

如果不使用--delete選項當SRC有文件刪除時,DST是不會刪除的,只有加上--delete選項后才能刪除掉。還有一種情況就是如果在DST增加文件了,而SRC當中沒有這些文件,同步時加上--delete選項后同樣會刪除新增的文件。

6)使用--exclude 選項

另外還可以使用萬用字符*匹配

最后簡單總結一下,平時你使用rsync同步數據的時候,使用-a選項基本上就可以達到我們想要的效果了,只是有時候會有個別的需求,會用到-a --no-OPTION, -u, -L, --delete, --exclude這些選項,但是筆者要求你把上面這些全部掌握,畢竟這才幾個而已,大部分選項筆者都沒有介紹。如果在以后的工作中遇到特殊需求了,就去查一下rsync的man文檔吧。

3. rsync 應用實例

1)通過ssh的方式

最上面介紹的5種方式當中,第二、第三(1個冒號)就屬於通過ssh的方式,這種方式其實就是讓用戶去登錄到遠程機器,然后執行rsync的任務。

這種方式就是前面介紹的第二種方式了,是通過ssh拷貝的數據,是要輸入10.0.2.69那台機器root的密碼的。

這個則為第三種方式。這兩種方式如果寫到腳本里,備份起來就有麻煩了,因為要輸入密碼,腳本本來就是自動的,不可能做到的。但是不代表沒有解決辦法。那就是通過密鑰驗證,密鑰不設立密碼就ok了。還記得在前面筆者曾經介紹過通過密鑰登錄遠程主機嗎,下面要講的內容就是那些東西了。

先提前說一下基本的主機信息: 10.0.2.68 (主機名Aming-1)和10.0.2.69(主機名Aming)需要從Aming-1上拷貝數據到Aming上。

A. 首先確認一下Aming-1上是否有這個文件 /root/.ssh/id_rsa.pub

如果沒有安裝以下的方法生成:

在這個過程中會有一些交互的過程,因為筆者的/root/.ssh/id_rsa已經存在,所以會問是否覆蓋,筆者選擇覆蓋,然后會提示要輸入這個密鑰的密碼,出於安全考慮應該定義個密碼,但是我們的目的就是為了自動化同步數據,所以這里不輸入任何密碼,直接按回車,即密碼為空。最后則生成了私鑰(/root/.ssh/id_rsa)和公鑰文件(/root/.ssh/id_rsa.pub)

B. 把公鑰文件的內容拷貝到目標機器上

復制主機Aming-1的/root/.ssh/id_rsa.pub文件內容,並粘貼到主機Aming的/root/.ssh/authorized_keys中

在這一步也許你會遇到/root/.ssh目錄不存在的問題,可以手動創建,並修改目錄權限為700也可以執行ssh-keygen命令生成這個目錄。保存/root/.ssh/authorized_keys文件后,再到主機Aming-1上執行

你會發現,現在不用輸入密碼也可以登錄主機Aming了。下面再從主機Aming-1上執行一下rsync命令試試吧。

2)通過后台服務的方式

這種方式可以理解成這樣,在遠程主機上建立一個rsync的服務器,在服務器上配置好rsync的各種應用,然后本機作為rsync的一個客戶端去連接遠程的rsync服務器。下面筆者就介紹一下,如何去配置一台rsync服務器。

A. 建立並配置rsync的配置文件 /etc/rsyncd.conf

其中配置文件分為兩部分全部配置部分和模塊配置部分,全局部分就是幾個參數而已,就像筆者的rsyncd.conf中port, log file, pid file, address這些都屬於全局配置,而[test] 以下部分就是模塊配置部分了。一個配置文件中可以有多個模塊,模塊名自定義,格式就像筆者的rsyncd.conf中的這樣。其實模塊中的一些參數例如use chroot, max connections, udi, gid, auth users, secrets file以及hosts allow都可以配置成全局的參數。當然筆者給出的參數並不是所有的,你可以通過man rsyncd.conf 獲得更多信息。

下面就簡單解釋一下這些參數的意義:

port :指定在哪個端口啟動rsyncd服務,默認是873

log file:指定日志文件

pid file:指定pid文件,這個文件的作用涉及到服務的啟動以及停止等進程管理操作

address:指定啟動rsyncd服務的IP,假如你的機器有多個IP,就可以指定其中一個啟動rsyncd服務,默認是在全部IP上啟動

[test] :指定模塊名,自定義

path :指定數據存放的路徑

use chroot:true|false 默認是true,意思是在傳輸文件以前首先chroot到path參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要以roots權限,並且不能備份指向外部的符號連接所指向的目錄文件。默認情況下chroot值為true,如果你的數據當中有軟連接文件的話建議設置成false。

max connections:指定最大的連接數,默認是0即沒有限制

read only:ture|false 如果為true則不能上傳到該模塊指定的路徑下

list :指定當用戶查詢該服務器上的可用模塊時,該模塊是否被列出,設定為true則列出,false則隱藏

uid/gid :指定傳輸文件時,以哪個用戶/組的身份傳輸

auth users:指定傳輸時要使用的用戶名

secrets file:指定密碼文件,該參數連同上面的參數如果不指定則不使用密碼驗證

hosts allow :指定被允許連接該模塊的主機,可以是IP或者網段,如果是多個,之間用空格隔開

B. 編輯secrets file,保存后要賦予600權限

C. 啟動rsyncd服務

啟動后查看日志,看看是否有錯誤信息,然后再看下端口是否啟動。

如果想開機啟動,請把”rsync –daemon –confg=/etc/rsyncd.conf” 寫入到/etc/rc.d/rc.local文件。

D. 到另一台機器上測試

記得那個use chroot參數嗎,如果設置為true,則/root/test4/1.sh不會被拷貝過來。

修改rsyncd.conf文件,把use chroot改成true,不用重啟服務即可生效。

從上例中的詳細信息中也可以看到,不能拷貝軟連接的。所以請記住,如果涉及到軟連接,請設置use chroot=false 。另外這種方式也是可以不用手動輸入密碼的,兩種實現方式。

第一種:指定密碼文件

先編輯一個密碼文件,並修改600權限。

在同步時,指定密碼文件即可(--password-file=/etc/rsyncd.passwd)

第二種:在rsync服務器端不指定用戶

把相關的參數都用’#’注釋掉。然后再到客戶端上測試。

注意,這里不用再加test@這個用戶了,默認是以root的身份拷貝的,現在已經不需要輸入密碼了。

linux系統日志

日志重要嗎?必須的,沒有日志你怎么知道你的系統狀況?沒有日志你如何排查一個trouble?日志記錄了系統每天發生的各種各樣的事情,你可以通過他來檢查錯誤發生的原因,或者受到攻擊時攻擊者留下的痕跡。日志主要的功能有:審計和監測。他還可以實時的監測系統狀態,監測和追蹤侵入者等等。

筆者常查看的日志文件為/var/log/message. 它是核心系統日志文件,包含了系統啟動時的引導消息,以及系統運行時的其他狀態消息。IO 錯誤、網絡錯誤和其他系統錯誤都會記錄到這個文件中。另外其他信息,比如某個人的身份切換為 root以及用戶自定義安裝的軟件(apache)的日志也會在這里列出。通常,/var/log/messages 是在做故障診斷時首先要查看的文件。那你肯定會說了,這么多日志都記錄到這個文件中,那如果服務器上有很多服務豈不是這個文件很快就會寫的很大,沒有錯,但是系統有一個日志輪詢的機制,每星期切換一個日志,變成message.1, message.2,…messages.4 連同message一共有5個這樣的日志文件。這是通過logrotate工具的控制來實現的,它的配置文件是/etc/logrotate.conf. 如果沒有特殊需求請不要修改這個配置文件。

/var/log/message是由syslogd這個守護進程產生的,如果停掉這個服務則系統不會產生/var/log/message,所以這個服務不要停。Syslogd服務的配置文件為/etc/syslog.conf這個文件定義了日志的級別,具體詳細的東西筆者不再闡述,因為若沒有特殊需求是不需要修改這個配置文件的,請使用”man syslog.conf” 獲得更多關於它的信息。

除了關注/var/log/message外,你還應該多關注一下’dmesg’這個命令,它可以顯示系統的啟動信息,如果你的某個硬件有問題(比如說網卡)用這個命令也是可以看到的。

這一小節就介紹這么多,在結束之前,筆者給你一個小小的建議。以后在你日常的管理工總中要養成多看日志的習慣,尤其是一些應用軟件的日志,比如apache, mysql, php等常用的軟件,看它們的日志(錯誤日志)可以幫助你排查問題以及監控它們的運行狀況是否良好。

xargs-exec

1. xargs

在前面的例子中筆者曾經使用過這個命令,你是否有印象呢?現在就詳細介紹一下它,平時筆者使用xargs還是比較多的,很方便。

查看xargs的man文檔,解釋是這樣的:build and execute command lines from standard input. 至於翻譯成中文理解着有點困難。不妨筆者舉個例子說明它的作用。

它的作用就是把管道符前面的輸出作為xargs 后面的命令的輸入。它的好處在於可以把本來兩步或者多步才能完成的任務簡單一步就能完成。xargs常常和find命令一起使用,比如,查找當前目錄創建時間大於10天的文件,然后再刪除。

這種應用是最為常見的,xargs后面的rm 也可以更選項,當是目錄時,就需要-r選項了。在筆者看來xargs的這個功能不叫什么,它的另一個功能才叫神奇。現在我有一個這樣的需求,查找當前目錄下所有.txt的文件,然后把這些.txt的文件變成.txt_bak 。正常情況下,我們不得不寫腳本去實現,但是使用xargs就一步。

xargs -n1 –i{} 類似for循環,-n1意思是一個一個對象的去處理,-i{} 把前面的對象使用{}取代,mv {} {}_bak 相當於 mv 1.txt 1.txt_bak。你剛開始接觸這個命令時也許有點難以理解,多練習一下你就會熟悉了,筆者建議你記住這個應用,很實用。

2. -exec

使用find命令時,經常使用一個選項就是這個-exec了,可以達到和xargs同樣的效果。比如,查找當前目錄創建時間大於10天的文件並刪除。

這個命令中也是把{}作為前面find出來的文件的替代符,后面的”\”為”;”的脫意符,不然shell會把分號作為該行命令的結尾。這個-exec有時候也挺實用的。

用-exec同樣可以實現前面那個復雜的需求。

screen工具介紹

有時候,也許你會有這樣的需求,需要執行一個命令或者腳本,但是需要幾個小時甚至幾天。這就要考慮一個問題,就是中途斷網或出現其他意外情況,執行的任務中斷了怎么辦?你可以把命令或者腳本丟到后台運行,不過也不保險。筆者下面就介紹兩種方法來避免這樣的問題發生。

1. 使用nohup

直接加一個’&’雖然丟到后台了,但是當退出該終端時很有可能這個腳本也會退出的,而在前面加上’nohup’就沒有問題了。nohup的作用就是不掛斷地運行命令。

2. screen工具的使用

簡單來說,screen是一個可以在多個進程之間多路復用一個物理終端的窗口管理器。screen中有會話的概念,用戶可以在一個screen會話中創建多個screen窗口,在每一個screen窗口中就像操作一個真實的SSH連接窗口那樣。下面筆者介紹screen的一個簡單應用。

1)打開一個會話,直接輸入screen命令然后回車,進入screen會話窗口。如果你沒有screen命令,請用’yum install -y screen’安裝。

2)screen -ls 查看已經打開的screen會話

3)Ctrl +a 再按d退出該screen會話,只是退出,並沒有結束。結束的話輸入Ctrl +d 或者輸入exit

4)退出后還想再次登錄某個screen會話,使用screen -r [screen 編號],這個編號就是上圖中那個2082. 當只有一個screen會話時,后面的編號是可以省略的。

當你有某個需要長時間運行的命令或者腳本時就打開一個screen會話,然后運行該任務。按ctrl +a 再按d退出會話,不影響終端窗口上的任何操作。

linux下同步時間服務器

時間的准確性在服務器上非常重 要,所以要與標准時間保持同步,畢竟服務器的時鍾並不一定精准,所以需要我們每隔一段時間去同步一下時間。筆者所管理的服務器每隔6小時就會同步一下時 間。如何同步呢?這就要用到ntpdate 這個指令。如果你的服務器上沒有這個指令,請使用'yum install -y ntpdate'安裝,或者下載源碼包安裝。
同步時間的命令為:'ntpdate timeserver' 這里的timeserver為時間服務器的IP或者hostname,常用的timeserver有210.72.145.44, time.windows.com(windows的時間服務器)。如果你想每隔6小時同步一次那么請指定一個計划任務。
00 */6 * * * /usr/sbin/ntpdate 210.72.145.44 >/dev/null
之所以在后面加一個重定向,是因為這個同步的過程是有內容輸出的,因為我們的計划任務是在后台執行的,輸出的內容會以郵件的形式發送給用戶,所以為了避免郵件太多請輸出到/dev/null (在linux下這個設備是虛擬的存在,你可以理解為空洞)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM