1、系統管理node
1.系統安全mysql
1.1 syslog :系統默認的日誌守護進程linux
syslog是Linux系統默認的日誌守護進程。默認的syslog配置文件是/etc/syslog.conf文件。程序,守護進程和內核提供了訪問系統的日誌信息。所以,任何但願生成日誌信息的程序均可以向 syslog 接口呼叫生成該信息。nginx
幾乎全部的網絡設備均可以經過syslog協議,將日誌信息以用戶數據報協議(UDP)方式傳送到遠端服務器,遠端接收日誌服務器必須經過syslogd監聽UDP 端口514,並根據 syslog.conf配置文件中的配置處理本機,接收訪問系統的日誌信息,把指定的事件寫入特定文件中,供後臺數據庫管理和響應之用。意味着可讓任何事件都登陸到一臺或多臺服務器上,以備後臺數據庫用off-line(離線) 方法分析遠端設備的事件。算法
一般,syslog 接受來自系統的各類功能的信息,每一個信息都包括重要級。/etc/syslog.conf 文件通知 syslogd 如何根據設備和信息重要級別來報告信息。sql
在/var/log中建立並寫入日誌信息是由syslog協議處理的,是由守護進程sylogd負責執行。每一個標準的進程均可以用syslog記錄日誌。可使用logger命令經過syslogd記錄日誌。shell
要向syslog文件/var/log/messages中記錄日誌信息:數據庫
logger this is a test log line
輸出:
tail -n 1 messages Jan 5 10:07:03 localhost root: this is a test log line
若是要記錄特定的標記(tag)可使用:windows
logger -t TAG this is a test log line 輸出: tail -n 1 messages Jan 5 10:37:14 localhost TAG: this is a test log line
1.2 OpenSSL是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。在OpenSSL被曝出現嚴重安全漏洞後,發現多數經過SSL協議加密的網站使用名爲OpenSSL的開源軟件包。因爲這是互聯網應用最普遍的安全傳輸方法,被網銀、在線支付、電商網站、門戶網站、電子郵件等重要網站普遍使用,因此該漏洞影響範圍廣大。api
OpenSSL有兩種運行模式:交互模式和批處理模式。
直接輸入openssl回車進入交互模式,輸入帶命令選項的openssl進入批處理模式。
OpenSSL整個軟件包大概能夠分紅三個主要的功能部分:密碼算法庫、SSL協議庫以及應用程序。OpenSSL的目錄結構天然也是圍繞這三個功能部分進行規劃的。
對稱加密算法
OpenSSL一共提供了8種對稱加密算法,其中7種是分組加密算法,僅有的一種流加密算法是RC4。這7種分組加密算法分別是AES、DES、Blowfish、CAST、IDEA、RC二、RC5,都支持電子密碼本模式(ECB)、加密分組連接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種經常使用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它算法使用的則是64位。事實上,DES算法裏面不只僅是經常使用的DES算法,還支持三個密鑰和兩個密鑰3DES算法。
非對稱加密算法
OpenSSL一共實現了4種非對稱加密算法,包括DH算法、RSA算法、DSA算法和橢圓曲線算法(EC)。DH算法通常用戶密鑰交換。RSA算法既能夠用於密鑰交換,也能夠用於數字簽名,固然,若是你可以忍受其緩慢的速度,那麼也能夠用於數據加密。DSA算法則通常只用於數字簽名。
信息摘要算法
OpenSSL實現了5種信息摘要算法,分別是MD二、MD五、MDC二、SHA(SHA1)和RIPEMD。SHA算法事實上包括了SHA和SHA1兩種信息摘要算法,此外,OpenSSL還實現了DSS標準中規定的兩種信息摘要算法DSS和DSS1。
密鑰和證書管理
密鑰和證書管理是PKI的一個重要組成部分,OpenSSL爲之提供了豐富的功能,支持多種標準。
首先,OpenSSL實現了ASN.1的證書和密鑰相關標準,提供了對證書、公鑰、私鑰、證書請求以及CRL等數據對象的DER、PEM和BASE64的編解碼功能。OpenSSL提供了產生各類公開密鑰對和對稱密鑰的方法、函數和應用程序,同時提供了對公鑰和私鑰的DER編解碼功能。並實現了私鑰的PKCS#12和PKCS#8的編解碼功能。OpenSSL在標準中提供了對私鑰的加密保護功能,使得密鑰能夠安全地進行存儲和分發。
在此基礎上,OpenSSL實現了對證書的X.509標準編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。並提供了一種文本數據庫,支持證書的管理功能,包括證書密鑰產生、請求產生、證書籤發、吊銷和驗證等功能。
事實上,OpenSSL提供的CA應用程序就是一個小型的證書管理中心(CA),實現了證書籤發的整個流程和證書管理的大部分機制。
一、消息摘要算法應用例子
用SHA1算法計算文件file.txt的哈西值,輸出到stdout:
# openssl dgst -sha1 file.txt
用SHA1算法計算文件file.txt的哈西值,輸出到文件digest.txt:
# openssl sha1 -out digest.txt file.txt
用DSS1(SHA1)算法爲文件file.txt簽名,輸出到文件dsasign.bin。簽名的private key必須爲DSA算法產生的,保存在文件dsakey.pem中。
# openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt
用dss1算法驗證file.txt的數字簽名dsasign.bin,驗證的private key爲DSA算法產生的文件dsakey.pem。
# openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
用sha1算法爲文件file.txt簽名,輸出到文件rsasign.bin,簽名的private key爲RSA算法產生的文件rsaprivate.pem。
# openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
# 用sha1算法驗證file.txt的數字簽名rsasign.bin,驗證的public key爲RSA算法生成的rsapublic.pem。
# openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt
二、對稱加密應用例子
對稱加密應用例子,用DES3算法的CBC模式加密文件plaintext.doc,加密結果輸出到文件ciphertext.bin。
# openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin
用DES3算法的OFB模式解密文件ciphertext.bin,提供的口令爲trousers,輸出到文件plaintext.doc。注意:由於模式不一樣,該命令不能對以上的文件進行解密。
# openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers
用Blowfish的CFB模式加密plaintext.doc,口令從環境變量PASSWORD中取,輸出到文件ciphertext.bin。
# openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD
給文件ciphertext.bin用base64編碼,輸出到文件base64.txt。
# openssl base64 -in ciphertext.bin -out base64.txt
用RC5算法的CBC模式加密文件plaintext.doc,輸出到文件ciphertext.bin,salt、key和初始化向量(iv)在命令行指定。
# openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29
三、Diffie-Hellman應用例子
使用生成因子2和隨機的1024-bit的素數產生D0ffie-Hellman參數,輸出保存到文件dhparam.pem
# openssl dhparam -out dhparam.pem -2 1024
從dhparam.pem中讀取Diffie-Hell參數,以C代碼的形式,輸出到stdout。
# openssl dhparam -in dhparam.pem -noout -C
四、DSA應用例子應用例子
生成1024位DSA參數集,並輸出到文件dsaparam.pem。
# openssl dsaparam -out dsaparam.pem 1024
使用參數文件dsaparam.pem生成DSA私鑰匙,採用3DES加密後輸出到文件dsaprivatekey.pem
# openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem
使用私鑰匙dsaprivatekey.pem生成公鑰匙,輸出到dsapublickey.pem
# openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem
從dsaprivatekey.pem中讀取私鑰匙,解密並輸入新口令進行加密,而後寫回文件dsaprivatekey.pem
# openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin
五、RSA應用例子
產生1024位RSA私匙,用3DES加密它,口令爲trousers,輸出到文件rsaprivatekey.pem
# openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024
從文件rsaprivatekey.pem讀取私匙,用口令trousers解密,生成的公鑰匙輸出到文件rsapublickey.pem
# openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem
用公鑰匙rsapublickey.pem加密文件plain.txt,輸出到文件cipher.txt
# openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
使用私鑰匙rsaprivatekey.pem解密密文cipher.txt,輸出到文件plain.txt
# openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt
用私鑰匙rsaprivatekey.pem給文件plain.txt簽名,輸出到文件signature.bin
# openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
用公鑰匙rsapublickey.pem驗證簽名signature.bin,輸出到文件plain.txt
# openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain
從X.509證書文件cert.pem中獲取公鑰匙,用3DES加密mail.txt,輸出到文件mail.enc
# openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem
從X.509證書文件cert.pem中獲取接收人的公鑰匙,用私鑰匙key.pem解密S/MIME消息mail.enc,結果輸出到文件mail.txt
# openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt
cert.pem爲X.509證書文件,用私匙key,pem爲mail.txt簽名,證書被包含在S/MIME消息中,輸出到文件mail.sgn
# openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn
驗證S/MIME消息mail.sgn,輸出到文件mail.txt,簽名者的證書應該做爲S/MIME消息的一部分包含在mail.sgn中
# openssl smime -verify -in mail.sgn -out mail.txt
1.3
logwatch命令是一個可定製和可插入式的日誌監視系統,它經過遍歷給定時間範圍內的系統日誌文件而產生日誌報告。logwatch默認天天執行一次,能夠從/etc/cron.daily
裏看到。
logwatch(選項)
--detail<報告詳細程度>:指定日誌報告的詳細程度;
--logfile<日誌文件>:僅處理指定的日誌文件;
--service<服務名>:僅處理指定服務的日誌文件;
--print:打印結果到標準輸出;
--mailto<郵件地址>:將結果發送到指定郵箱;
--range<日期範圍>:指定處理日誌的日期範圍;
--archives:處理歸檔日誌文件;
--debug<調試等級>:調試模式;
--save<文件名>:將結果保存到指定文件中,而不顯示或者發送到指定郵箱;
--logdir<目錄>:指定查找日誌文件的目錄,而不使用默認的日誌目錄;
--hostname<主機名>:指定在日誌報告中使用的主機名,不使用系統默認的主機名; --numeric:在報告中顯示ip地址而不是主機名; --help:顯示指令的幫助信息。
檢查你的主機上是否已經存在Logwatch(Redhat默認已經安裝了Logwatch,不過版本比較舊):
rpm -qa logwatch
若是主機上沒有logwatch,則執行:
rpm -Ivh logwatch***.rpm
若是有老版本的logwatch,則執行:
rpm -Uvh logwatch***.rpm
安裝完畢後,開始配置:
能夠修改和添加它的logfiles、services和其餘配置,但默認已經有不少腳本了,只要在1)裏設置Detail = High
就能夠了。
/etc/logwatch/conf/logwatch.conf
/usr/share/logwatch/default.conf/logwatch.conf
/etc/logwatch/conf/
會自動覆蓋/usr/share/logwatch/default.conf/
下的同名文件。
若是沒有設置logwatch.conf也不要緊,能夠直接在命令行下設置。
logwatch --detail High --Service All --range All --print 基本就能夠顯示出全部日誌的狀況了
logwatch --service sshd --detail High 只看sshd的日誌狀況
1.4
lastb命令用於顯示用戶錯誤的登陸列表,此指令能夠發現系統的登陸異常。單獨執行lastb命令,它會讀取位於/var/log
目錄下,名稱爲btmp的文件,並把該文件內容記錄的登入失敗的用戶名單,所有顯示出來。
lastb(選項)(參數)
-a:把從何處登入系統的主機名稱或ip地址顯示在最後一行;
-d:將IP地址轉換成主機名稱;
-f<記錄文件>:指定記錄文件;
-n<顯示列數>或-<顯示列數>:設置列出名單的顯示列數;
-R:不顯示登入系統的主機名稱或IP地址;
-x:顯示系統關機,從新開機,以及執行等級的改變等信息。
首次運行lastb命令會報下的錯誤:
lastb: /var/log/btmp: No such file or directory
Perhaps this file was removed by the operator to prevent logging lastb info.
只需創建這個不存在的文件便可。
touch /var/log/btmp
使用ssh的登陸失敗不會記錄在btmp文件中。
lastb | head
root ssh:notty 110.84.129.3 Tue Dec 17 06:19 - 06:19 (00:00)
root ssh:notty 110.84.129.3 Tue Dec 17 04:05 - 04:05 (00:00)
root ssh:notty 110.84.129.3 Tue Dec 17 01:52 - 01:52 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 23:38 - 23:38 (00:00)
leonob ssh:notty 222.211.85.18 Mon Dec 16 22:18 - 22:18 (00:00)
leonob ssh:notty 222.211.85.18 Mon Dec 16 22:18 - 22:18 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 21:25 - 21:25 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 19:12 - 19:12 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 17:00 - 17:00 (00:00)
admin ssh:notty 129.171.193.99 Mon Dec 16 16:52 - 16:52 (00:00)
1.5
sudo命令用來以其餘身份來執行命令,預設的身份爲root。在/etc/sudoers
中設置了可執行sudo指令的用戶。若其未經受權的用戶企圖使用sudo,則會發出警告的郵件給管理員。用戶使用sudo時,必須先輸入密碼,以後有5分鐘的有效期限,超過時限則必須從新輸入密碼。
sudo(選項)(參數)
-b:在後臺執行指令; -h:顯示幫助; -H:將HOME環境變量設爲新身份的HOME環境變量; -k:結束密碼的有效期限,也就是下次再執行sudo時便須要輸入密碼;。 -l:列出目前用戶可執行與沒法執行的指令; -p:改變詢問密碼的提示符號; -s<shell>:執行指定的shell; -u<用戶>:以指定的用戶做爲新的身份。若不加上此參數,則預設以root做爲新的身份; -v:延長密碼有效期限5分鐘; -V :顯示版本信息。
指令:須要運行的指令和對應的參數。
配置sudo必須經過編輯/etc/sudoers
文件,並且只有超級用戶才能夠修改它,還必須使用visudo編輯。之因此使用visudo有兩個緣由,一是它可以防止兩個用戶同時修改它;二是它也能進行有限的語法檢查。因此,即便只有你一個超級用戶,你也最好用visudo來檢查一下語法。
visudo默認的是在vi裏打開配置文件,用vi來修改文件。咱們能夠在編譯時修改這個默認項。visudo不會擅自保存帶有語法錯誤的配置文件,它會提示你出現的問題,並詢問該如何處理,就像:
>>> sudoers file: syntax error, line 22 <<
此時咱們有三種選擇:鍵入「e」是從新編輯,鍵入「x」是不保存退出,鍵入「Q」是退出並保存。若是真選擇Q,那麼sudo將不會再運行,直到錯誤被糾正。
如今,咱們一塊兒來看一下神祕的配置文件,學一下如何編寫它。讓咱們從一個簡單的例子開始:讓用戶Foobar能夠經過sudo執行全部root可執行的命令。以root身份用visudo打開配置文件,能夠看到相似下面幾行:
# Runas alias specification
# User privilege specificationroot ALL=(ALL)ALL
咱們一看就明白個差很少了,root有全部權限,只要仿照現有root的例子就行,咱們在下面加一行(最好用tab做爲空白):
foobar ALL=(ALL) ALL
保存退出後,切換到foobar用戶,咱們用它的身份執行命令:
[foobar@localhost ~]$ ls /root
ls: /root: 權限不夠
[foobar@localhost ~]$ sudo ls /root
PassWord:
anaconda-ks.cfg Desktop install.log install.log.syslog
好了,咱們限制一下foobar的權利,不讓他隨心所欲。好比咱們只想讓他像root那樣使用ls和ifconfig,把那一行改成:
foobar localhost= /sbin/ifconfig, /bin/ls
再來執行命令:
[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain. [foobar@localhost ~]$ sudo /sbin/ifconfigeth0 Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...
如今讓咱們來看一下那三個ALL究竟是什麼意思。第一個ALL是指網絡中的主機,咱們後面把它改爲了主機名,它指明foobar能夠在此主機上執行後面的命令。第二個括號裏的ALL是指目標用戶,也就是以誰的身份去執行命令。最後一個ALL固然就是指命令名了。例如,咱們想讓foobar用戶在linux主機上以jimmy或rene的身份執行kill命令,這樣編寫配置文件:
foobar linux=(jimmy,rene) /bin/kill
但這還有個問題,foobar到底以jimmy仍是rene的身份執行?這時咱們應該想到了sudo -u
了,它正是用在這種時候。 foobar可使用sudo -u jimmy kill PID
或者sudo -u rene kill PID
,但這樣挺麻煩,其實咱們能夠沒必要每次加-u
,把rene或jimmy設爲默認的目標用戶便可。再在上面加一行:
Defaults:foobar runas_default=rene
Defaults後面若是有冒號,是對後面用戶的默認,若是沒有,則是對全部用戶的默認。就像配置文件中自帶的一行:
Defaults env_reset
另外一個問題是,不少時候,咱們原本就登陸了,每次使用sudo還要輸入密碼就顯得煩瑣了。咱們可不能夠再也不輸入密碼呢?固然能夠,咱們這樣修改配置文件:
foobar localhost=NOPASSWD: /bin/cat, /bin/ls
再來sudo一下:
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log install.log.syslog
固然,你也能夠說「某些命令用戶foobar不能夠運行」,經過使用!操做符,但這不是一個好主意。由於,用!操做符來從ALL中「剔出」一些命令通常是沒什麼效果的,一個用戶徹底能夠把那個命令拷貝到別的地方,換一個名字後再來運行。
日誌與安全
sudo爲安全考慮得很周到,不只能夠記錄日誌,還能在有必要時向系統管理員報告。可是,sudo的日誌功能不是自動的,必須由管理員開啓。這樣來作:
touch /var/log/sudo
vi /etc/syslog.conf
在syslog.conf最後面加一行(必須用tab分割開)並保存:
local2.debug /var/log/sudo
重啓日誌守候進程,
ps aux grep syslogd
把獲得的syslogd進程的PID(輸出的第二列是PID)填入下面:
kill –HUP PID
這樣,sudo就能夠寫日誌了:
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo: foobar :
TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root
不過,有一個小小的「缺陷」,sudo記錄日誌並非很忠實:
[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null cat /var/log/sudo...Jul 28 23:10:24 localhost sudo: foobar : TTY=pts/1 ; PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow
重定向沒有被記錄在案!爲何?由於在命令運行以前,shell把重定向的工做作完了,sudo根本就沒看到重定向。這也有個好處,下面的手段不會得逞:
[foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 權限不夠
sudo 有本身的方式來保護安全。以root的身份執行sudo-V
,查看一下sudo的設置。由於考慮到安全問題,一部分環境變量並無傳遞給sudo後面的命令,或者被檢查後再傳遞的,好比:PATH,HOME,SHELL等。固然,你也能夠經過sudoers來配置這些環境變量。
1.6
lastlog命令用於顯示系統中全部用戶最近一次登陸信息。
lastlog文件在每次有用戶登陸時被查詢。可使用lastlog命令檢查某特定用戶上次登陸的時間,並格式化輸出上次登陸日誌/var/log/lastlog
的內容。它根據UID排序顯示登陸名、端口號(tty)和上次登陸時間。若是一個用戶從未登陸過,lastlog顯示**Never logged**
。注意須要以root身份運行該命令。
lastlog(選項)
-b<天數>:顯示指定天數前的登陸信息; -h:顯示召集令的幫助信息; -t<天數>:顯示指定天數以來的登陸信息; -u<用戶名>:顯示指定用戶的最近登陸信息。
lastlog
Username Port From Latest
root pts/0 221.6.45.34 Tue Dec 17 09:40:48 +0800 2013
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in** shutdown **Never logged in** halt **Never logged in** mail **Never logged in** news **Never logged in** uucp **Never logged in** operator **Never logged in** games **Never logged in** gopher **Never logged in** ftp **Never logged in** nobody **Never logged in** vcsa **Never logged in** ntp **Never logged in** sshd **Never logged in** nscd **Never logged in** ldap **Never logged in** postfix **Never logged in** www **Never logged in** mysql **Never logged in**
1.7
logrotate命令用於對系統日誌進行輪轉、壓縮和刪除,也能夠將日誌發送到指定郵箱。使用logrotate指令,可以讓你輕鬆管理系統所產生的記錄文件。每一個記錄文件均可被設置成每日,每週或每個月處理,也能在文件太大時當即處理。您必須自行編輯,指定配置文件,預設的配置文件存放在/etc/logrotate.conf
文件中。
logrotate(選項)(參數)
-?或--help:在線幫助;
-d或--debug:詳細顯示指令執行過程,便於排錯或瞭解程序執行的狀況;
-f或--force :強行啓動記錄文件維護操做,縱使logrotate指令認爲沒有須要亦然;
-s<狀態文件>或--state=<狀態文件>:使用指定的狀態文件;
-v或--version:顯示指令執行過程;
-usage:顯示指令基本用法。
配置文件:指定lograote指令的配置文件。
1.8
chroot命令用來在指定的根目錄下運行指令。chroot,即 change root directory (更改 root 目錄)。在 linux 系統中,系統默認的目錄結構都是以/
,便是以根 (root) 開始的。而在使用 chroot 以後,系統的目錄結構將以指定的位置做爲/
位置。
在通過 chroot 命令以後,系統讀取到的目錄和文件將不在是舊系統根下的而是新根下(即被指定的新的位置)的目錄結構和文件,所以它帶來的好處大體有如下3個:
增長了系統的安全性,限制了用戶的權力:
在通過 chroot 以後,在新根下將訪問不到舊系統的根目錄結構和文件,這樣就加強了系統的安全性。這個通常是在登陸 (login) 前使用 chroot,以此達到用戶不能訪問一些特定的文件。
創建一個與原系統隔離的系統目錄結構,方便用戶的開發:
使用 chroot 後,系統讀取的是新根下的目錄和文件,這是一個與原系統根下文件不相關的目錄結構。在這個新的環境中,能夠用來測試軟件的靜態編譯以及一些與系統不相關的獨立開發。
切換系統的根目錄位置,引導 Linux 系統啓動以及急救系統等:
chroot 的做用就是切換系統的根位置,而這個做用最爲明顯的是在系統初始引導磁盤的處理過程當中使用,從初始 RAM 磁盤 (initrd) 切換系統的根位置並執行真正的 init。另外,當系統出現一些問題時,咱們也可使用 chroot 來切換到一個臨時的系統。
chroot(選項)(參數)
--help:在線幫助;
--version:顯示版本信息。
將target做爲根目錄(運行其中的/bin/sh
):
chroot target /bin/sh
這裏,target是busybox安裝好的路徑,相似一個文件系統包含了許多工具。這樣,將會進入一個shell界面,這個shell以target爲根。運行exit退出該shell又返回原來的本機環境了,也可使用Ctrl+D。
注意:
將target做爲根目錄(運行其中的/bin/ls
):
chroot target /bin/ls
這裏,target是busybox安裝好的路徑,相似一個文件系統包含了許多工具。這樣運行的是target中的ls(不是本機的/bin/ls
),而後返回當即本機的目錄環境。
注意,本身在本地編譯一個程序生成a.out以後,拷進target/bin/
中這樣運行卻不行,由於它包含了動態鏈接的庫,須要用ldd查看a.out須要那些動態庫,將這些庫拷貝到新根的對應路徑下才能執行。
用chroot運行本身編譯的一個程序:
準備chroot的根目錄:
mkdir newRoot
編譯本身的程序:
gcc main.c
這裏main.c生成a.out,功能是輸出hello。
查看程序須要的庫:
ldd a.out
輸入以後,輸出以下:
linux-gate.so.1 = > (0xb8034000)
libc.so.6 = > /lib/tls/i686/cmov/libc.so.6 (0xb7eab000)
/lib/ld-linux.so.2 (0xb801a000)
將程序須要的庫和程序拷貝到新根目錄下:
cp a.out newRoot
mkdir newRoot/lib
cp /lib/tls/i686/cmov/libc.so.6 newRoot/lib
cp /lib/ld-linux.so.2 newRoot/lib
這裏newRoot內容將以下:
a.out lib/
使用chroot運行本身的程序:
su
chroot newRoot /a.out
這樣就可以正確運行a.out了,由於a.out使用到了其餘的動態鏈接庫,因此須要將庫拷貝到newRoot中,若是沒有其餘庫那麼直接拷貝a.out就能運行。例如靜態編譯後的busybox,其安裝目錄中的/bin/busybox
就沒有依賴其餘庫。
1.9
logsave命令運行給定的命令,並將命令的輸出信息保存到指定的日誌文件中。
logsave(選項)(參數)
-a:追加信息到指定的日誌文件中。
1.10
last命令用於顯示用戶最近登陸信息。單獨執行last命令,它會讀取/var/log/wtmp
的文件,並把該給文件的內容記錄的登入系統的用戶名單所有顯示出來。
last(選項)(參數)
-a:把從何處登入系統的主機名稱或ip地址,顯示在最後一行;
-d:將IP地址轉換成主機名稱;
-f <記錄文件>:指定記錄文件。
-n <顯示列數>或-<顯示列數>:設置列出名單的顯示列數;
-R:不顯示登入系統的主機名稱或IP地址;
-x:顯示系統關機,從新開機,以及執行等級的改變等信息。
last命令用了顯示用戶登陸狀況,如下是直接顯示固定行數的記錄:
last -10 root pts/0 221.6.45.34 Tue Dec 17 09:40 still logged in root pts/0 221.6.45.34 Mon Dec 16 09:00 - 11:57 (02:56) root pts/0 222.94.97.122 Sun Dec 15 20:39 - 23:28 (02:48) root pts/0 222.95.209.80 Sat Dec 14 14:39 - 14:58 (00:18) root pts/0 221.6.45.34 Thu Dec 12 16:55 - 17:37 (00:41) root pts/0 49.65.139.195 Wed Dec 11 20:40 - 21:16 (00:35) root pts/0 49.65.139.195 Wed Dec 11 19:46 - 20:03 (00:17) root pts/0 221.6.45.34 Tue Dec 10 14:41 - 15:52 (01:10) root pts/0 221.6.45.34 Mon Dec 9 17:24 - 17:30 (00:06) root pts/0 221.6.45.34 Mon Dec 9 09:38 - 11:41 (02:02)
2.進程和做業管理
2.1
ipcrm命令用來刪除一個或更多的消息隊列、信號量集或者共享內存標識。
ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ]
-m SharedMemory id 刪除共享內存標識 SharedMemoryID。與 SharedMemoryID 有關聯的共享內存段以及數據結構都會在最後一次拆離操做後刪除。
-M SharedMemoryKey 刪除用關鍵字 SharedMemoryKey 建立的共享內存標識。與其相關的共享內存段和數據結構段都將在最後一次拆離操做後刪除。
-q MessageID 刪除消息隊列標識 MessageID 和與其相關的消息隊列和數據結構。
-Q MessageKey 刪除由關鍵字 MessageKey 建立的消息隊列標識和與其相關的消息隊列和數據結構。
-s SemaphoreID 刪除信號量標識 SemaphoreID 和與其相關的信號量集及數據結構。
-S SemaphoreKey 刪除由關鍵字 SemaphoreKey 建立的信號標識和與其相關的信號量集和數據結構。
msgctl、shmctl 和 semctl 子例程提供了刪除操做的細節。標識和關鍵字能夠用 ipcs 命令找到。
若是要刪除和 SharedMemoryID 18602 相關的共享內存段,請輸入:
ipcrm -m 18602
2.2
systemctl命令是系統服務管理器指令,它實際上將 service 和 chkconfig 這兩個命令組合到一塊兒。
任務 | 舊指令 | 新指令 |
使某服務自動啓動 | chkconfig --level 3 httpd on | systemctl enable httpd.service |
使某服務不自動啓動 | chkconfig --level 3 httpd off | systemctl disable httpd.service |
檢查服務狀態 | service httpd status | systemctl status httpd.service (服務詳細信息) systemctl is-active httpd.service (僅顯示是否 Active) |
顯示全部已啓動的服務 | chkconfig --list | systemctl list-units --type=service |
啓動某服務 | service httpd start | systemctl start httpd.service |
中止某服務 | service httpd stop | systemctl stop httpd.service |
重啓某服務 | service httpd restart | systemctl restart httpd.service |
1.啓動nfs服務
systemctl start nfs-server.service
2.設置開機自啓動
systemctl enable nfs-server.service
3.中止開機自啓動
systemctl disable nfs-server.service
4.查看服務當前狀態
systemctl status nfs-server.service
5.從新啓動某服務
systemctl restart nfs-server.service
6.查看全部已啓動的服務
systemctl list -units --type=service
開啓防火牆22端口
iptables -I INPUT -p tcp --dport 22 -j accept
若是仍然有問題,就多是SELinux致使的
關閉SElinux:
修改/etc/selinux/config
文件中的SELINUX=」」
爲disabled,而後重啓。
完全關閉防火牆:
sudo systemctl status firewalld.service
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
2.3
w命令用於顯示已經登錄系統的用戶列表,並顯示用戶正在執行的指令。執行這個命令可得知目前登入系統的用戶有那些人,以及他們正在執行的程序。單獨執行w命令會顯示全部的用戶,您也可指定用戶名稱,僅顯示某位用戶的相關信息。
w(選項)(參數)
-h:不打印頭信息; -u:當顯示當前進程和cpu時間時忽略用戶名; -s:使用短輸出格式; -f:顯示用戶從哪登陸; -V:顯示版本信息。
用戶:僅顯示指定用戶。
w
20:39:37 up 136 days, 3:58, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM login@ IDLE JCPU PCPU WHAT
root pts/0 222.94.97.122 20:39 1.00s 0.00s 0.00s w
2.4
watch命令以週期性的方式執行給定的指令,指令輸出以全屏方式顯示。watch是一個很是實用的命令,基本全部的Linux發行版都帶有這個小工具,如同名字同樣,watch能夠幫你監測一個命令的運行結果,免得你一遍遍的手動運行。
watch(選項)(參數)
-n:指定指令執行的間隔時間(秒); -d:高亮顯示指令輸出信息不一樣之處; -t:不顯示標題。
指令:須要週期性執行的指令。
#watch uptime
#watch -t uptime
#watch -d -n 1 netstat -ntlp #watch -d 'ls -l | fgrep goface' //監測goface的文件 #watch -t -differences=cumulative uptime #watch -n 60 from //監控mail #watch -n 1 "df -i;df" //監測磁盤inode和block數目變化狀況
FreeBSD和Linux下watch命令的不一樣,在Linux下,watch是週期性的執行下個程序,並全屏顯示執行結果,如:watch -n 1 -d netstat -ant
,而在FreeBSD下的watch命令是查看其它用戶的正在運行的操做,watch容許你偷看其它terminal正在作什麼,該命令只能讓超級用戶使用。
2.5
pidof命令用於查找指定名稱的進程的進程號id號。
pidof(選項)(參數)
-s:僅返回一個進程號; -c:僅顯示具備相同「root」目錄的進程; -x:顯示由腳本開啓的進程; -o:指定不顯示的進程ID。
進程名稱:指定要查找的進程名稱。
pidof nginx
13312 5371
pidof crond
1509
pidof init
1
2.6
skill命令用於向選定的進程發送信號,凍結進程。這個命令初學者並不經常使用,深刻以後牽涉到系統服務優化以後可能會用到。
skill(選項)
-f:快速模式;
-i:交互模式,每一步操做都須要確認;
-v:冗餘模式;
-w:激活模式;
-V:顯示版本號;
-t:指定開啓進程的終端號;
-u:指定開啓進程的用戶;
-p:指定進程的id號; -c:指定開啓進程的指令名稱。
若是您發現了一個佔用大量CPU和內存的進程,但又不想中止它,該怎麼辦?考慮下面的top命令輸出:
top -c -p 16514
23:00:44 up 12 days, 2:04, 4 users, load average: 0.47, 0.35, 0.31
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle total 0.0% 0.6% 8.7% 2.2% 0.0% 88.3% 0.0% Mem: 1026912k av, 1010476k used, 16436k free, 0k shrd, 52128k buff 766724k actv, 143128k in_d, 14264k in_c Swap: 2041192k av, 83160k used, 1958032k free 799432k cached PID USER PRI NI SIZE RSS SHARE stat %CPU %MEM time CPU command 16514 oracle 19 4 28796 26M 20252 D N 7.0 2.5 0:03 0 oraclePRODB2...
既然您確認進程16514佔用了大量內存,您就可使用skill命令「凍結」它,而不是中止它。
skill -STOP 1
以後,檢查top輸出:
23:01:11 up 12 days, 2:05, 4 users, load average: 1.20, 0.54, 0.38 1 processes: 0 sleeping, 0 running, 0 zombie, 1 stopped CPU states: cpu user nice system irq softirq iowait idle total 2.3% 0.0% 0.3% 0.0% 0.0% 2.3% 94.8% Mem: 1026912k av, 1008756k used, 18156k free, 0k shrd, 3976k buff 770024k actv, 143496k in_d, 12876k in_c Swap: 2041192k av, 83152k used, 1958040k free 851200k cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND 16514 oracle 19 4 28796 26M 20252 T N 0.0 2.5 0:04 0 oraclePRODB2...
如今,CPU 從 0% 空閒變爲 94% 空閒。該進程被有效凍結。過一段時間以後,您可能但願喚醒該進程:
skill -CONT 16514
若是但願暫時凍結進程以便爲完成更重要的進程騰出空間,該方法很是有用。
此命令用途很廣。若是您要中止 "oracle" 用戶的全部進程,只須要一個命令便可實現:
skill -STOP oracle
可使用用戶、PID、命令或終端 id 做爲參數。如下命令可中止全部 rman 命令。
skill -STOP rman
如您所見,skill 決定您輸入的參數(進程 ID、用戶 ID 或命令)並進行相應操做。這可能會致使在某些狀況下出現這樣的問題:您可能具備同名的用戶和命令。最好的示例是 "oracle" 進程,一般由用戶 "oracle" 運行。所以,當您但願中止名爲 "oracle" 的進程時,可執行如下命令:
skill -STOP oracle
用戶 "oracle" 的全部進程都中止,包括您可能要使用的會話。要很是明確地執行命令,您能夠選擇使用一個新參數指定參數的類型。要中止一個名爲 oracle 的命令,可執行如下命令:
skill -STOP -c oracle
snice命令的功能與skill相似。但它用於下降進程的優先級,而不是中止進程。首先,檢查 top 輸出:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND 3 root 15 0 0 0 0 RW 0.0 0.0 0:00 0 kapmd 13680 oracle 15 0 11336 10M 8820 T 0.0 1.0 0:00 0 oracle 13683 oracle 15 0 9972 9608 7788 T 0.0 0.9 0:00 0 oracle 13686 oracle 15 0 9860 9496 7676 T 0.0 0.9 0:00 0 oracle 13689 oracle 15 0 10004 9640 7820 T 0.0 0.9 0:00 0 oracle 13695 oracle 15 0 9984 9620 7800 T 0.0 0.9 0:00 0 oracle 13698 oracle 15 0 10064 9700 7884 T 0.0 0.9 0:00 0 oracle 13701 oracle 15 0 22204 21M 16940 T 0.0 2.1 0:00 0 oracle
如今,將 "oracle" 進程的優先級下降四個點。注意,該值越高,優先級越低。
snice +4 -u oracle PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND 16894 oracle 20 4 38904 32M 26248 D N 5.5 3.2 0:01 0 oracle
注意,NI 列(nice 值)如今是 4,優先級如今設置爲 20,而不是 15。這對於下降優先級很是有幫助。
2.7
pgrep命令以名稱爲依據從運行進程隊列中查找進程,並顯示查找到的進程id。每個進程ID以一個十進制數表示,經過一個分割字符串和下一個ID分開,默認的分割字符串是一個新行。對於每一個屬性選項,用戶能夠在命令行上指定一個以逗號分割的可能值的集合。
pgrep(選項)(參數)
-o:僅顯示找到的最小(起始)進程號; -n:僅顯示找到的最大(結束)進程號; -l:顯示進程名稱; -P:指定父進程號; -g:指定進程組; -t:指定開啓進程的終端; -u:指定進程的有效用戶ID。
進程名稱:指定要查找的進程名稱,同時也支持相似grep指令中的匹配模式。
pgrep -lo httpd
4557 httpd
[root@localhost ~]# pgrep -ln httpd 4566 httpd [root@localhost ~]# pgrep -l httpd 4557 httpd 4560 httpd 4561 httpd 4562 httpd 4563 httpd 4564 httpd 4565 httpd 4566 httpd [root@localhost ~]# pgrep httpd 4557 4560 4561 4562 4563 4564 4565 4566
2.8
renice命令能夠修改正在運行的進程的調度優先級。預設是以程序識別碼指定程序調整其優先權,您亦能夠指定程序羣組或用戶名稱調整優先權等級,並修改全部隸屬於該程序羣組或用戶的程序的優先權。只有系統管理者能夠改變其餘用戶程序的優先權,也僅有系統管理者能夠設置負數等級。
renice(選項)(參數)
-g:指定進程組id;
-p<程序識別碼>:改變該程序的優先權等級,此參數爲預設值。
-u:指定開啓進程的用戶名。
進程號:指定要修改優先級的進程。
將行程id爲987及32的行程與行程擁有者爲daemon及root的優先序號碼加1:
renice 1 987 -u daemon root -p 32
注意:每個行程都有一個惟一的id。
2.9
nohup命令能夠將程序以忽略掛起信號的方式運行起來,被運行的程序的輸出信息將不會顯示到終端。
不管是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。若是當前目錄的 nohup.out 文件不可寫,輸出重定向到$HOME/nohup.out
文件中。若是沒有文件能建立或打開以用於追加,那麼 command 參數指定的命令不可調用。若是標準錯誤是一個終端,那麼把指定的命令寫給標準錯誤的全部輸出做爲標準輸出重定向到相同的文件描述符。
nohup(選項)(參數)
--help:在線幫助;
--version:顯示版本信息。
程序及選項:要運行的程序及選項。
使用nohup命令提交做業,若是使用nohup命令提交做業,那麼在缺省狀況下該做業的全部輸出都被重定向到一個名爲nohup.out的文件中,除非另外指定了輸出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,輸出被重定向到myout.file文件中。
2.10
ipcs命令用於報告Linux中進程間通訊設施的狀態,顯示的信息包括消息列表、共享內存和信號量的信息。
ipcs(選項)
-a:顯示所有可顯示的信息; -q:顯示活動的消息隊列信息; -m:顯示活動的共享內存信息; -s:顯示活動的信號量信息。
ipcs -a ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x7401833d 2654208 root 600 4 0 0x00000000 3145729 root 600 4194304 9 dest 0x7401833c 2621442 root 600 4 0 0xd201012b 3080195 root 600 1720 2
2.11
pmap命令用於報告進程的內存映射關係,是Linux調試及運維一個很好的工具。
pmap(選項)(參數)
-x:顯示擴展格式; -d:顯示設備格式; -q:不顯示頭尾行; -V:顯示指定版本。
進程號:指定須要顯示內存映射關係的進程號,能夠是多個進程號。
pidof nginx
13312 5371
pmap -x 5371
5371: nginx: worker process
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 564 344 0 r-x-- nginx
000000000068c000 68 68 60 rw--- nginx
000000000069d000 56 12 12 rw--- [ anon ]
000000000a0c8000 1812 1684 1684 rw--- [ anon ]
0000003ac0a00000 112 40 0 r-x-- ld-2.5.so 0000003ac0c1c000 4 4 4 r---- ld-2.5.so 0000003ac0c1d000 4 4 4 rw--- ld-2.5.so 0000003ac0e00000 1340 284 0 r-x-- libc-2.5.so 0000003ac0f4f000 2044 0 0 ----- libc-2.5.so 0000003ac114e000 16 16 8 r---- libc-2.5.so 0000003ac1152000 4 4 4 rw--- libc-2.5.so 0000003ac1153000 20 20 20 rw--- [ anon ] 0000003ac1200000 8 4 0 r-x-- libdl-2.5.so 0000003ac1202000 2048 0 0 ----- libdl-2.5.so 0000003ac1402000 4 4 4 r---- libdl-2.5.so 0000003ac1403000 4 4 4 rw--- libdl-2.5.so 0000003ac1600000 84 0 0 r-x-- libselinux.so.1 0000003ac1615000 2048 0 0 ----- libselinux.so.1 0000003ac1815000 8 8 8 rw--- libselinux.so.1 0000003ac1817000 4 4 4 rw--- [ anon ] 0000003ac1a00000 236 0 0 r-x-- libsepol.so.1 0000003ac1a3b000 2048 0 0 ----- libsepol.so.1 0000003ac1c3b000 4 4 4 rw--- libsepol.so.1 0000003ac1c3c000 40 0 0 rw--- [ anon ] 0000003ac1e00000 88 44 0 r-x-- libpthread-2.5.so 0000003ac1e16000 2048 0 0 ----- libpthread-2.5.so 0000003ac2016000 4 4 4 r---- libpthread-2.5.so 0000003ac2017000 4 4 4 rw--- libpthread-2.5.so 0000003ac2018000 16 4 4 rw--- [ anon ] 0000003ac2600000 80 52 0 r-x-- libz.so.1.2.3 0000003ac2614000 2044 0 0 ----- libz.so.1.2.3 0000003ac2813000 4 4 4 rw--- libz.so.1.2.3 0000003ac2a00000 36 4 0 r-x-- libcrypt-2.5.so 0000003ac2a09000 2044 0 0 ----- libcrypt-2.5.so 0000003ac2c08000 4 4 4 r---- libcrypt-2.5.so 0000003ac2c09000 4 4 4 rw--- libcrypt-2.5.so 0000003ac2c0a000 184 0 0 rw--- [ anon ] 0000003ac3600000 8 0 0 r-x-- libkeyutils-1.2.so 0000003ac3602000 2044 0 0 ----- libkeyutils-1.2.so 0000003ac3801000 4 4 4 rw--- libkeyutils-1.2.so 0000003ac3a00000 68 0 0 r-x-- libresolv-2.5.so 0000003ac3a11000 2048 0 0 ----- libresolv-2.5.so 0000003ac3c11000 4 4 4 r---- libresolv-2.5.so 0000003ac3c12000 4 4 4 rw--- libresolv-2.5.so 0000003ac3c13000 8 0 0 rw--- [ anon ] 0000003ac3e00000 8 0 0 r-x-- libcom_err.so.2.1 0000003ac3e02000 2044 0 0 ----- libcom_err.so.2.1 0000003ac4001000 4 4 4 rw--- libcom_err.so.2.1 0000003ac4200000 1204 8 0 r-x-- libcrypto.so.0.9.8e 0000003ac432d000 2044 0 0 ----- libcrypto.so.0.9.8e 0000003ac452c000 132 88 12 rw--- libcrypto.so.0.9.8e 0000003ac454d000 16 12 12 rw--- [ anon ] 0000003ac4600000 176 0 0 r-x-- libgssapi_krb5.so.2.2 0000003ac462c000 2048 0 0 ----- libgssapi_krb5.so.2.2 0000003ac482c000 8 8 8 rw--- libgssapi_krb5.so.2.2 0000003ac4a00000 144 0 0 r-x-- libk5crypto.so.3.1 0000003ac4a24000 2044 0 0 ----- libk5crypto.so.3.1 0000003ac4c23000 8 8 8 rw--- libk5crypto.so.3.1 0000003ac4e00000 32 0 0 r-x-- libkrb5support.so.0.1 0000003ac4e08000 2044 0 0 ----- libkrb5support.so.0.1 0000003ac5007000 4 4 4 rw--- libkrb5support.so.0.1 0000003ac5200000 580 0 0 r-x-- libkrb5.so.3.3 0000003ac5291000 2048 0 0 ----- libkrb5.so.3.3 0000003ac5491000 16 16 12 rw--- libkrb5.so.3.3 0000003ac5a00000 288 4 0 r-x-- libssl.so.0.9.8e 0000003ac5a48000 2048 0 0 ----- libssl.so.0.9.8e 0000003ac5c48000 24 16 12 rw--- libssl.so.0.9.8e 00002b5751808000 8 8 8 rw--- [ anon ] 00002b5751810000 108 36 0 r-x-- libpcre.so.1.2.0 00002b575182b000 2044 0 0 ----- libpcre.so.1.2.0 00002b5751a2a000 4 4 4 rw--- libpcre.so.1.2.0 00002b5751a2b000 28 28 28 rw--- [ anon ] 00002b5751a32000 40 20 0 r-x-- libnss_files-2.5.so 00002b5751a3c000 2044 0 0 ----- libnss_files-2.5.so 00002b5751c3b000 4 4 4 r---- libnss_files-2.5.so 00002b5751c3c000 4 4 4 rw--- libnss_files-2.5.so 00002b5751c3d000 4 4 4 rw-s- zero (deleted) 00002b5751c3e000 20012 20000 20000 rw--- [ anon ] 00007fffbf2ce000 84 20 20 rw--- [ stack ] 00007fffbf35e000 12 0 0 r-x-- [ anon ] ffffffffff600000 8192 0 0 ----- [ anon ] ---------------- ------ ------ ------ total kB 72880 22940 22000
2.12
nice命令用於以指定的進程調度優先級啓動其餘的程序。
nice(選項)(參數)
-n:指定進程的優先級(整數)。
指令及選項:須要運行的指令及其餘選項。
新建一個進程並設置優先級,將當前目錄下的documents目錄打包,但不但願tar佔用太多CPU:
nice -19 tar zcf pack.tar.gz documents
方法很是簡單,即在原命令前加上nice -19
。不少人可能有疑問了,最低優先級不是19麼?那是由於這個「-19」中的「-」僅表示參數前綴;因此,若是但願將當前目錄下的documents目錄打包,而且賦予tar進程最高的優先級:
nice --19 tar zcf pack.tar.gz documents
2.13
service命令是Redhat Linux兼容的發行版中用來控制系統服務的實用工具,它以啓動、中止、從新啓動和關閉系統服務,還能夠顯示全部系統服務的當前狀態。
service(選項)(參數)
-h:顯示幫助信息; --status-all:顯示所服務的狀態。
/etc/init.d
目錄下的腳本文件名;當修改了主機名、ip地址等信息時,常常須要把網絡重啓使之生效。
service network status 配置設備: lo eth0 當前的活躍設備: lo eth0 service network restart 正在關閉接口 eth0: [ 肯定 ] 關閉環回接口: [ 肯定 ] 設置網絡參數: [ 肯定 ] 彈出環回接口: [ 肯定 ] 彈出界面 eth0: [ 肯定 ]
重啓mysql
service mysqld status mysqld (pid 1638) 正在運行... service mysqld restart 中止 MySQL: [ 肯定 ] 啓動 MySQL: [ 肯定 ]
2.14
pstree命令以樹狀圖的方式展示進程之間的派生關係,顯示效果比較直觀。
pstree(選項)
-a:顯示每一個程序的完整指令,包含路徑,參數或是常駐服務的標示; -c:不使用精簡標示法; -G:使用VT100終端機的列繪圖字符; -h:列出樹狀圖時,特別標明如今執行的程序; -H<程序識別碼>:此參數的效果和指定"-h"參數相似,但特別標明指定的程序; -l:採用長列格式顯示樹狀圖; -n:用程序識別碼排序。預設是以程序名稱來排序; -p:顯示程序識別碼; -u:顯示用戶名稱; -U:使用UTF-8列繪圖字符; -V:顯示版本信息。
顯示當前全部進程的進程號和進程id
pstree -p
顯示全部進程的全部詳細信息,遇到相同的進程名能夠壓縮顯示。
pstree -a
2.15
telint命令用於切換當前正在運行的Linux系統的運行等級。
telint(選項)(參數)
-t:指定等待的秒數。
運行等級:指定要切換的運行等級。
2.16
killall命令使用進程的名稱來殺死進程,使用此指令能夠殺死一組同名進程。咱們可使用kill命令殺死指定進程PID的進程,若是要找到咱們須要殺死的進程,咱們還須要在以前使用ps等命令再配合grep來查找進程,而killall把這兩個過程合二爲一,是一個很好用的命令。
killall(選項)(參數)
-e:對長名稱進行精確匹配; -l:忽略大小寫的不一樣; -p:殺死進程所屬的進程組; -i:交互式殺死進程,殺死進程前須要進行確認; -l:打印全部已知信號列表; -q:若是沒有進程被殺死。則不輸出任何信息; -r:使用正規表達式匹配要殺死的進程名稱; -s:用指定的進程號代替默認信號「SIGTERM」; -u:殺死指定用戶的進程。
進程名稱:指定要殺死的進程名稱。
殺死全部同名進程
killall vi
2.17
runlevel命令用於打印當前Linux系統的運行等級。
runlevel
linux操做系統自從開始啓動至啓動完畢須要經歷幾個不一樣的階段,這幾個階段就叫作runlevel,一樣,當linux操做系統關閉時也要經歷另外幾個不一樣的runlevel,下面咱們就準備詳細介紹一下runlevel,並向您展現一些小技巧來讓您的linux系統避免沒必要要的重啓動。
runlevel能夠認爲是系統狀態,形象一點,您能夠認爲runlevel有點象微軟的windows操做系統中的Normal,safemode,和command prompt only。進入每一個runlevel都須要啓動或關閉相應的一系列服務(services),這些服務(services)以初始化腳本的方式放置於目錄/etc/rc.d/rc?.d/
或者/etc/rc?.d
下面(?表明runlevel的對應序號)。
在大多數的linux發行版本中,一般有8個runlevel:
0 停機 1 單用戶模式 2 多用戶,沒有 NFS 3 徹底多用戶模式 4 沒有用到 5 圖形界面 6 從新啓動 S s Single user mode
多數的桌面的linux系統缺省的runlevel是5,用戶登錄時是圖形界面,而多數的服務器版本的linux系統缺省的runlevel是3,用戶登錄時是字符界面,runlevel 1和2除了調試以外不多使用,runlevel s和S並非直接給用戶使用,而是用來爲Single user mode做準備。
linux的運行模式比起windows的啓動模式的優點在於:你能夠在系統空閒時使用init命令切換你如今使用的runlevel,另外,當你關閉或者啓動linux系統時你已經不知不覺中切換你的runlevel,系統關機進程須要調用runlevel(0或6)來關閉全部正在運行中的進程。
2.18
batch命令用於在指定時間,當系統不繁忙時執行任務,用法與at類似。
batch(選項)(參數)
-f:指定包含具體指令的任務文件;
-q:指定新任務的隊列名稱;
-m:任務執行完後向用戶發送E-mail。
日期時間:指定任務執行的日期時間。
batch
at> echo 1234
at> <EOT>
job 5 at Sun Apr 28 08:49:00 2013
2.19
ps命令用於報告當前系統的進程狀態。能夠搭配kill指令隨時中斷、刪除沒必要要的程序。ps命令是最基本同時也是很是強大的進程查看命令,使用該命令能夠肯定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等,總之大部分信息都是能夠經過執行該命令獲得的。
ps(選項)
-a:顯示全部終端機下執行的程序,除了階段做業領導者以外。
a:顯示現行終端機下的全部程序,包括其餘用戶的程序。
-A:顯示全部程序。
-c:顯示CLS和PRI欄位。
c:列出程序時,顯示每一個程序真正的指令名稱,而不包含路徑,選項或常駐服務的標示。
-C<指令名稱>:指定執行指令的名稱,並列出該指令的程序的情況。
-d:顯示全部程序,但不包括階段做業領導者的程序。
-e:此選項的效果和指定"A"選項相同。
e:列出程序時,顯示每一個程序所使用的環境變量。
-f:顯示UID,PPIP,C與STIME欄位。
f:用ASCII字符顯示樹狀結構,表達程序間的相互關係。
-g<羣組名稱>:此選項的效果和指定"-G"選項相同,當亦能使用階段做業領導者的名稱來指定。
g:顯示現行終端機下的全部程序,包括羣組領導者的程序。
-G<羣組識別碼>:列出屬於該羣組的程序的情況,也可以使用羣組名稱來指定。
h:不顯示標題列。
-H:顯示樹狀結構,表示程序間的相互關係。
-j或j:採用工做控制的格式顯示程序情況。
-l或l:採用詳細的格式來顯示程序情況。
L:列出欄位的相關信息。
-m或m:顯示全部的執行緒。
n:以數字來表示USER和WCHAN欄位。
-N:顯示全部的程序,除了執行ps指令終端機下的程序以外。
-p<程序識別碼>:指定程序識別碼,並列出該程序的情況。
p<程序識別碼>:此選項的效果和指定"-p"選項相同,只在列表格式方面稍有差別。
r:只列出現行終端機正在執行中的程序。
-s<階段做業>:指定階段做業的程序識別碼,並列出隸屬該階段做業的程序的情況。
s:採用程序信號的格式顯示程序情況。
S:列出程序時,包括已中斷的子程序資料。
-t<終端機編號>:指定終端機編號,並列出屬於該終端機的程序的情況。
t<終端機編號>:此選項的效果和指定"-t"選項相同,只在列表格式方面稍有差別。
-T:顯示現行終端機下的全部程序。
-u<用戶識別碼>:此選項的效果和指定"-U"選項相同。
u:以用戶爲主的格式來顯示程序情況。
-U<用戶識別碼>:列出屬於該用戶的程序的情況,也可以使用用戶名稱來指定。
U<用戶名稱>:列出屬於該用戶的程序的情況。
v:採用虛擬內存的格式顯示程序情況。
-V或V:顯示版本信息。
-w或w:採用寬闊的格式來顯示程序情況。
x:顯示全部程序,不以終端機來區分。
X:採用舊式的Linux i386登錄格式顯示程序情況。
-y:配合選項"-l"使用時,不顯示F(flag)欄位,並以RSS欄位取代ADDR欄位 。
-<程序識別碼>:此選項的效果和指定"p"選項相同。
--cols<每列字符數>:設置每列的最大字符數。
--columns<每列字符數>:此選項的效果和指定"--cols"選項相同。
--cumulative:此選項的效果和指定"S"選項相同。
--deselect:此選項的效果和指定"-N"選項相同。
--forest:此選項的效果和指定"f"選項相同。
--headers:重複顯示標題列。
--help:在線幫助。 --info:顯示排錯信息。 --lines<顯示列數>:設置顯示畫面的列數。 --no-headers:此選項的效果和指定"h"選項相同,只在列表格式方面稍有差別。 --group<羣組名稱>:此選項的效果和指定"-G"選項相同。 --Group<羣組識別碼>:此選項的效果和指定"-G"選項相同。 --pid<程序識別碼>:此選項的效果和指定"-p"選項相同。 --rows<顯示列數>:此選項的效果和指定"--lines"選項相同。 --sid<階段做業>:此選項的效果和指定"-s"選項相同。 --tty<終端機編號>:此選項的效果和指定"-t"選項相同。 --user<用戶名稱>:此選項的效果和指定"-U"選項相同。 --User<用戶識別碼>:此選項的效果和指定"-U"選項相同。 --version:此選項的效果和指定"-V"選項相同。 --widty<每列字符數>:此選項的效果和指定"-cols"選項相同。
因爲ps命令可以支持的系統類型至關的多,因此選項多的離譜!
2.20
init命令是Linux下的進程初始化工具,init進程是全部Linux進程的父進程,它的進程號爲1。init命令是Linux操做系統中不可缺乏的程序之一,init進程是Linux內核引導運行的,是系統中的第一個進程。
init(選項)(參數)
-b:不執行相關腳本而直接進入單用戶模式; -s:切換到單用戶模式。
運行等級:指定Linux系統要切換到的運行等級。
幾個經常使用的命令
查看系統進程命令:ps -ef | head
查看init的配置文件:more /etc/inittab
查看系統當前運行的級別:runlevel
運行級別
到底什麼是運行級呢?簡單的說,運行級就是操做系統當前正在運行的功能級別。這個級別從0到6 ,具備不一樣的功能。你也能夠在/etc/inittab
中查看它的英文介紹。
#0 停機(千萬不能把initdefault 設置爲0) #1 單用戶模式 #2 多用戶,沒有 NFS(和級別3類似,會中止部分服務) #3 徹底多用戶模式 #4 沒有用到 #5 x11(Xwindow) #6 從新啓動(千萬不要把initdefault 設置爲6)
2.21
crontab命令被用來提交和管理用戶的須要週期性執行的任務,與windows下的計劃任務相似,當安裝完成操做系統後,默認會安裝此服務工具,而且會自動啓動crond進程,crond進程每分鐘會按期檢查是否有要執行的任務,若是有要執行的任務,則自動執行該任務。
crontab(選項)(參數)
-e:編輯該用戶的計時器設置; -l:列出該用戶的計時器設置; -r:刪除該用戶的計時器設置; -u<用戶名稱>:指定要設定計時器的用戶名稱。
crontab文件:指定包含待執行任務的crontab文件。
Linux下的任務調度分爲兩類:系統任務調度和用戶任務調度。
系統任務調度:系統週期性所要執行的工做,好比寫緩存數據到硬盤、日誌清理等。在/etc
目錄下有一個crontab文件,這個就是系統任務調度的配置文件。
/etc/crontab
文件包括下面幾行:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=""HOME=/ # run-parts 51 * * * * root run-parts /etc/cron.hourly 24 7 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
前四行是用來配置crond任務運行的環境變量,第一行SHELL變量指定了系統要使用哪一個shell,這裏是bash,第二行PATH變量指定了系統執行命令的路徑,第三行MAILTO變量指定了crond的任務執行信息將經過電子郵件發送給root用戶,若是MAILTO變量的值爲空,則表示不發送任務執行信息給用戶,第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。
用戶任務調度:用戶按期要執行的工做,好比用戶數據備份、定時郵件提醒等。用戶可使用 crontab 工具來定製本身的計劃任務。全部用戶定義的crontab文件都被保存在/var/spool/cron
目錄中。其文件名與用戶名一致,使用者權限文件以下:
/etc/cron.deny 該文件中所列用戶不容許使用crontab命令 /etc/cron.allow 該文件中所列用戶容許使用crontab命令 /var/spool/cron/ 全部用戶crontab文件存放的目錄,以用戶名命名
crontab文件的含義:用戶所創建的crontab文件中,每一行都表明一項任務,每行的每一個字段表明一項設置,它的格式共分爲六個字段,前五段是時間設定段,第六段是要執行的命令段,格式以下:
minute hour day month week command 順序:分 時 日 月 周
其中:
在以上各個字段中,還可使用如下特殊字符:
crond服務
/sbin/service crond start //啓動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啓服務
/sbin/service crond reload //從新載入配置
查看crontab服務狀態:
service crond status
手動啓動crontab服務:
service crond start
查看crontab服務是否已設置爲開機啓動,執行命令:
ntsysv
加入開機自動啓動:
chkconfig –level 35 crond on
每1分鐘執行一次command
* * * * * command
每小時的第3和第15分鐘執行
3,15 * * * * command
在上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * * command
每隔兩天的上午8點到11點的第3和第15分鐘執行
3,15 8-11 */2 * * command
每一個星期一的上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * 1 command
每晚的21:30重啓smb
30 21 * * * /etc/init.d/smb restart
每個月一、十、22日的4 : 45重啓smb
45 4 1,10,22 * * /etc/init.d/smb restart
每週6、週日的1:10重啓smb
10 1 * * 6,0 /etc/init.d/smb restart
天天18 : 00至23 : 00之間每隔30分鐘重啓smb
0,30 18-23 * * * /etc/init.d/smb restart
每星期六的晚上11:00 pm重啓smb
0 23 * * 6 /etc/init.d/smb restart
每一小時重啓smb
* */1 * * * /etc/init.d/smb restart
晚上11點到早上7點之間,每隔一小時重啓smb
* 23-7/1 * * * /etc/init.d/smb restart
每個月的4號與每週一到週三的11點重啓smb
0 11 4 * mon-wed /etc/init.d/smb restart
一月一號的4點重啓smb
0 4 1 jan * /etc/init.d/smb restart
每小時執行/etc/cron.hourly
目錄內的腳本
01 * * * * root run-parts /etc/cron.hourly
2.22
pkill命令能夠按照進程名殺死進程。pkill和killall應用方法差很少,也是直接殺死運行中的程序;若是您想殺掉單個進程,請用kill來殺掉。
pkill(選項)(參數)
-o:僅向找到的最小(起始)進程號發送信號; -n:僅向找到的最大(結束)進程號發送信號; -P:指定父進程號發送信號; -g:指定進程組; -t:指定開啓進程的終端。
進程名稱:指定要查找的進程名稱,同時也支持相似grep指令中的匹配模式。
pgrep -l gaim
2979 gaim
pkill gaim
也就是說:kill對應的是PID,pkill對應的是command。
2.23
atrm命令用於刪除待執行任務隊列中的指定任務。
atrm(選項)(參數)
-V:顯示版本號。
任務號:指定待執行隊列中要刪除的任務。
刪除已經排隊的任務
atq //顯示當前已經設置的任務
2 Mon May 17 08:00:00 2010 a root
1 Sat May 15 17:00:00 2010 a root
atrm 2 //刪除任務2
2.24
atq命令顯示系統中待執行的任務列表,也就是列出當前用戶的at任務列表。
atq(選項)
-V:顯示版本號; -q:查詢指定隊列的任務。
at now + 10 minutes
at> echo 1111
at> <eot>
job 3 at Fri Apr 26 12:56:00 2013
atq
3 Fri Apr 26 12:56:00 2013 a root
2.25
at命令用於在指定時間執行命令。at容許使用一套至關複雜的指定時間的方法。它可以接受在當天的hh:mm(小時:分鐘)式的時間指定。假如該時間已過去,那麼就放在次日執行。固然也可以使用midnight(深夜),noon(中午),teatime(飲茶時間,通常是下午4點)等比較模糊的 詞語來指定時間。用戶還可以採用12小時計時制,即在時間後面加上AM(上午)或PM(下午)來講明是上午仍是下午。 也可以指定命令執行的具體日期,指定格式爲month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。
上面介紹的都是絕對計時法,其實還可以使用相對計時法,這對於安排不久就要執行的命令是頗有好處的。指定格式爲:now + count time-units
,now就是當前時間,time-units是時間單位,這裏可以是minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,到底是幾天,仍是幾小時,等等。 更有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。
at(選項)(參數)
-f:指定包含具體指令的任務文件;
-q:指定新任務的隊列名稱;
-l:顯示待執行任務的列表;
-d:刪除指定的待執行任務;
-m:任務執行完成後向用戶發送E-mail。
日期時間:指定任務執行的日期時間。
三天後的下午 5 點鍾執行/bin/ls
:
[root@localhost ~]# at 5pm+3 days at> /bin/ls at> <EOT> job 7 at 2013-01-08 17:00
明天17點鐘,輸出時間到指定文件內:
[root@localhost ~]# at 17:20 tomorrow
at> date >/root/2013.log
at> <EOT>
job 8 at 2013-01-06 17:20
計劃任務設定後,在沒有執行以前咱們能夠用atq命令來查看系統沒有執行工做任務:
[root@localhost ~]# atq 8 2013-01-06 17:20 a root 7 2013-01-08 17:00 a root
刪除已經設置的任務:
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
顯示已經設置的任務內容:
[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此處省略n個字符
date >/root/2013.log