一、程式管理
程式(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程式設計的計算機結構中,程式是程式的基本執行實體;在當代面向執行緒設計的計算機結構中,程式是執行緒的容器。程式是指令、資料及其組織形式的描述,程式是程式的實體。以上這段話來自百度百科。
簡單來說哈,程式就是執行一段程式碼的實體。在linux中,我們可以通過命令來檢視系統中所有的程式、判斷伺服器的狀態、殺死程式等等。下面我們來看一下相關的命令都有哪些。
1、ps
該命令用來顯示當前程式的狀態,類似於Windows的工作管理員。它的選項非常多,這裡僅簡單說下常用的選項:
- -A,顯示所有程式
- -w,顯示加寬,可以顯示更多的資訊
- -au,顯示較詳細的資訊
- -aux,顯示所有包含其他使用者的行程
然後呢,我們來看下-au(x)命令下顯示資訊欄位的含義:
資料 | 含義 |
---|---|
USER | 該程式是由哪個使用者建立的 |
PID | 程式的ID號 |
%CPU | 該程式佔用CPU資源的百分比,佔用越高說明越消耗系統資源 |
%MEM | 該程式佔用實體記憶體的百分比,佔用越高說明越消耗系統資源 |
VSZ | 該程式佔用虛擬記憶體的百分比,單位是KB |
RSS | 該程式佔用實際實體記憶體大小,單位是KB |
TTY | 該程式在哪個終端中執行。tty1~tty7表示本地控制終端,tty1~tty6是字元終端,tty7是圖形終端。pts/0~255代表虛擬終端,?表示此終端是系統啟動的 |
STAT | 程式狀態 |
START | 該程式的啟動時間 |
TIME | 該程式佔用CPU的運算時間,數值越高說明越消耗系統資源 |
COMMAND | 產生此程式的命令名 |
其中STAT程式狀態對應的欄位含義是:
- D: 無法中斷的休眠狀態 (通常 IO 的程式)
- R: 正在執行中
- S: 靜止狀態
- T: 暫停執行
- Z: 不存在但暫時無法消除
- W: 沒有足夠的記憶體分頁可分配
- <: 高優先序的行程
- N: 低優先序的行程
- L: 有記憶體分頁分配並鎖在記憶體內 (實時系統或捱A I/O)
2、pstree
將所有行程以樹狀圖顯示,樹狀圖將會以 pid (如果有指定) 或是以 init 這個基本行程為根 (root),如果有指定使用者 id,則樹狀圖會只顯示該使用者所擁有的行程,常用選項如下:
- -u,顯示使用者名稱稱
- -p,顯示程式pid
3、top
該命令用於實時顯示process的動態。常用選項如下:
- -d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
- -q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的許可權,則 top 將會以最高的優先序執行
- -c : 切換顯示模式,共有兩種模式,一是隻顯示執行檔的名稱,另一種是顯示完整的路徑與名稱
- -S : 累積模式,會將己完成或消失的子行程 ( dead child process ) 的 CPU time 累積起來
- -s : 安全模式,將交談式指令取消, 避免潛在的危機
- -i : 不顯示任何閒置 (idle) 或無用 (zombie) 的行程
- -n : 更新的次數,完成後將會退出 top
- -b : 批次檔模式,搭配 "n" 引數一起使用,可以用來將 top 的結果輸出到檔案內
直接執行top命令顯示如下資訊:
解釋下資訊的內容:
第一行是任務佇列資訊。
內容 | 說明 |
---|---|
12:12:12 | 系統的當前時間 |
up 1 day 5:33 | 系統的執行時間,本機已經執行了1天5小時33分 |
2 users | 當前登入了二個客戶端 |
load average 0 0 0 | 系統在之前1分鐘、5分鐘、15分鐘的平均負載。一般認為小於1小時負載較小,大於1超過負載 |
第二行是行為程式資訊。
內容 | 說明 |
---|---|
Tasks: 100 total | 系統中的程式總數 |
1 running | 正在執行的程式數 |
94 sleeping | 睡眠的程式 |
0 stopped | 正在停止的程式 |
0 zombie | 殭屍程式。如果不是0的話要進行檢查 |
第三行是行為CPU資訊。
%Cpu(s): 0.1us | 使用者模式佔用的CPU百分比 |
0.1sy | 系統模式佔用的CPU百分比 |
0.0ni | 改變過優先順序的使用者程式 佔用的CPU百分比 |
99.7id | 空閒CPU的CPU百分比 |
0.1wa | 等待輸入/輸出的程式的佔用CPU百分比 |
0.1hi | 硬中斷請求服務佔用的CPU百分比 |
0.1si | 軟中斷請求服務佔用的CPU百分比 |
0.0st | st(Steal time)虛擬時間百分比,就是當有 |
第四行是行為實體記憶體資訊。
內容 | 說明 |
---|---|
Mem: 1030720k total | 實體記憶體的問題,單位是KB |
551860k used | 已經使用的實體記憶體數量 |
478860k free | 空閒的實體記憶體數量,虛擬機器分配了1024M記憶體,使用了538M,空閒467M |
43180k buffers | 作為緩衝的記憶體數量,可以存放需要寫入硬碟的資料,用來加速資料的寫入 |
第五行為交換分割槽資訊。
內容 | 說明 |
---|---|
Swap: 2047992k total | 總計的交換分割槽(虛擬記憶體)大小 |
536k used | 已經使用的交換分割槽大小 |
2047456k free | 空閒的交換分割槽大小 |
368164k cached | 把需要經常讀取的資料從硬碟讀到記憶體中,加速了資料的讀取 |
另外我們需要學習的就是一些互動式命令:
選項 | 含義 |
---|---|
?或h | 顯示互動模式的幫助 |
P | 按CPU使用率排序,預設就是此選項 |
M | 以記憶體的使用率排序 |
N | 以PID排序 |
q | 退出top |
4、kill
該命令用於刪除執行中的程式或工作。kill 可將指定的資訊送至程式。預設的資訊為 SIGTERM(15),可將指定程式終止。若仍無法終止該程式,可使用 SIGKILL(9) 資訊嘗試強制刪除程式。程式或工作的編號可利用 ps 指令或 jobs 指令檢視。常用選項如下:
- -l <資訊編號> 若不加<資訊編號>選項,則 -l 引數會列出全部的資訊名稱。
- -s <資訊名稱或編號> 指定要送出的資訊。
- [程式] [程式]可以是程式的PID或是PGID,也可以是工作編號。
常用的資訊編號如下:
- 1 (HUP):重新載入程式。
- 9 (KILL):殺死一個程式。
- 15 (TERM):正常停止一個程式。
下面我們來看一個小栗子:
我們建立一個sh檔案,並將它儲存在/demo下,檔案的內容如下:
#!/bin/bash i=0 while [ $i -le 1000 ] do echo $(date) sleep 1s done
很簡單,就是迴圈執行1000次,列印當前日期。然後我們重新開個視窗來執行這段指令碼。然後他就一直列印了:
我們來殺死他,殺死他之前需要知道他的資訊編號,我們來看下:
第一種方法是這樣執行指令碼:
它會列印資訊編號後再執行。於是我們就可以:
然後,另一個視窗執行的程式碼就停止了。
另一種查詢的方法是這樣的:
也可以查到資訊編號。好了,小栗子就到這裡,我們繼續往下學習。
二、系統資源檢視
1、vmstat
監控系統資源使用狀態,vmstat [重新整理延時] [重新整理次數]。比如vmstat 1 3。就是每秒重新整理一次,重新整理三次後停止。
其中欄位的含義如下:
1)procs:程式資訊欄位
分類 | 引數 | 含義 |
---|---|---|
procs | r | 等待執行的程式數,數量越大,系統就越繁忙 |
procs | b | 不可被喚醒的程式數量,數量越大,系統越繁忙 |
2)memory:記憶體資訊欄位
分類 | 引數 | 含義 |
---|---|---|
memory | swpd | 使用的Swap空間的大小,單位KB |
memory | free | 空閒的記憶體容量,單位KB |
memory | buff | 緩衝的記憶體容量,單位KB |
memory | cache | 快取的記憶體容量,單位KB |
3)swap:交換分割槽欄位,如果說si和so數越大說明資料經常要在磁碟和記憶體之間資料交換,系統效能就會越差
分類 | 引數 | 含義 |
---|---|---|
swap | si(in) | 從磁碟中交換到記憶體中的資料的數量,單位KB |
swap | so(out) | 從記憶體中交換到硬碟中的資料的數量,單位KB |
4)io:磁碟讀寫,bi和bo數越大,說明磁碟的I/O越繁忙。
分類 | 引數 | 含義 |
---|---|---|
io | bi(in) | 從塊裝置讀入資料的問題,單位是塊 |
io | bo(out) | 寫到塊裝置的資料的總量,單位是塊 |
5)system:系統資訊欄位,in和cs數越大說明系統與介面裝置的通訊越頻繁。
分類 | 引數 | 含義 |
---|---|---|
system | in(interrupt) | 每秒被中斷的程式次數 |
system | cs(switch) | 每秒鐘進行的事件切換次數 |
6)CPU:CPU資訊欄位
分類 | 引數 | 含義 |
---|---|---|
CPU | us(user) | 非核心程式消耗CPU運算時間的百分比 |
CPU | sy(system) | 核心程式消耗CPU運算時間的百分比 |
CPU | id(idea) | 空閒CPU的百分比 |
CPU | wa(wait) | 等待I/O所消耗的CPU百分比 |
CPU | st(steal) | 被虛擬機器偷走的CPU百分比 |
2、free
該命令用於顯示記憶體狀態。free指令會顯示記憶體的使用情況,包括實體記憶體,虛擬的交換檔案記憶體,共享記憶體區段,以及系統核心使用的緩衝區等。常用選項如下:
- -b, 以位元組為單位
- -k ,以KB位元組為單位
- -m ,以MB位元組為單位
- -g ,以GB位元組為單位
- -h ,以合適的單位顯示記憶體使用情況,最大為三位數,自動計算對應的單位值。單位有:B = bytes,K = kilos,M = megas,G = gigas,T = teras
- -o ,不顯示緩衝區調節列。
- -s <間隔秒數> ,持續觀察記憶體使用狀況。
- -t ,記憶體總和列。
- -V ,顯示版本資訊。
比如我們試一下free -m命令,顯示如下:
3、uname
用來檢視核心相關資訊,常用選項如下:
- -a或--all 顯示全部的資訊。
- -m或--machine 顯示電腦型別。
- -n或--nodename 顯示在網路上的主機名稱。
- -r或--release 顯示作業系統的發行編號。
- -s或--sysname 顯示作業系統名稱。
- -v 顯示作業系統的版本。
- --help 顯示幫助。
- --version 顯示版本資訊。
4、file
該指令用於辨識檔案型別。常用選項如下:
- -b 列出辨識結果時,不顯示檔名稱。
- -c 詳細顯示指令執行過程,便於排錯或分析程式執行的情形。
- -f<名稱檔案> 指定名稱檔案,其內容有一個或多個檔名稱時,讓file依序辨識這些檔案,格式為每列一個檔名稱。
- -L 直接顯示符號連線所指向的檔案的類別。
- -m<魔法數字檔案> 指定魔法數字檔案。
- -v 顯示版本資訊。
- -z 嘗試去解讀壓縮檔案的內容。
- [檔案或目錄...] 要確定型別的檔案列表,多個檔案之間使用空格分開,可以使用shell萬用字元匹配多個檔案。
通過file命令,可以檢視/bin/ls來檢視作業系統位數。
5、其他
可以通過lsb_release -a命令檢視發行版本。可以通過lsb_release -v命令檢視發行版本。
三、定時任務
1、crontab
該命令可以用來定期執行程式。當安裝完成作業系統之後,預設便會啟動此任務排程命令。crond 命令每分鍾會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。
注意:新建立的 cron 任務,不會馬上執行,至少要過 2 分鐘後才可以,當然你可以重啟 cron 來馬上執行。而 linux 任務排程的工作主要分為以下兩類:
- 1、系統執行的工作:系統週期性所要執行的工作,如備份系統資料、清理快取
- 2、個人執行的工作:某個使用者定期要做的工作,例如每隔10分鐘檢查郵件伺服器是否有新信,這些工作可由每個使用者自行設定
可以通過下面的命令重啟cron:
systemctl restart crond.service
然後可以通過ps -ef | grep crond來檢視是否啟動了crond:
crontab命令常用的選項如下:
- -e : 執行文字編輯器來設定時程表,內定的文字編輯器是 VI,如果你想用別的文字編輯器,則請先設定 VISUAL 環境變數來指定使用那個文字編輯器(比如說 setenv VISUAL joe)
- -r : 刪除目前的時程表
- -l : 列出目前的時程表
說明:
crontab 是用來讓使用者在固定時間或固定間隔執行程式之用,換句話說,也就是類似使用者的時程表。
-u user 是指設定指定 user 的時程表,這個前提是你必須要有其許可權(比如說是 root)才能夠指定他人的時程表。如果不使用 -u user 的話,就是表示設定自己的時程表。
crontab的語法如下:
crontab [ -u user ] file # 或者 crontab [ -u user ] { -l | -r | -e }
迴圈任務還有時間格式,如下:
f1 f2 f3 f4 f5 program
- 其中 f1 是表示分鐘,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期中的第幾天。program 表示要執行的程式。
- 當 f1 為 * 時表示每分鐘都要執行 program,f2 為 * 時表示每小時都要執行程式,其餘類推
- 當 f1 為 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 為 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推
- 當 f1 為 */n 時表示每 n 分鐘個時間間隔執行一次,f2 為 */n 表示每 n 小時個時間間隔執行一次,其餘類推
- 當 f1 為 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 為 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推
* * * * * - - - - - | | | | | | | | | +----- 星期中星期幾 (0 - 6) (星期天 為0) | | | +---------- 月份 (1 - 12) | | +--------------- 一個月中的第幾天 (1 - 31) | +-------------------- 小時 (0 - 23) +------------------------- 分鐘 (0 - 59)
額外的,表示時間還有些特殊符號,我們要注意一下:
符號 | 含義 | 例子 |
---|---|---|
* | 代表任意時間 | 比如第一個星就代表一個小時中每分鐘都執行一次 |
, | 代表不連續的時間 | 比如"1,2,3 ",就代表每小時的1分、2分、3分執行命令 |
- | 代表連續的時間範圍 | 比如 " 1-5 * ** ",代表每小時的第1分到第5分執行命令 |
*/n | 代表每隔多久執行一次 | 比如 "/10 " 就代表每隔10分鐘就執行一次命令 |
0 0 1,10 * 1 | 每月1號和10號,每週1的0點0分都會執行 |
僅僅羅列語法有點模糊,我們來看個例子吧:
首先,我們通過定時任務的編輯模式命令,編輯一個定時任務:
crontab -e
然後再vi的指令模式下點選鍵盤的i,這個就不多說了,在vi的那一章有詳細的講,然後我們編輯一個定時任務:
* * * * * echo `date` >> /root/date.log
什麼意思呢,就是每分鐘列印日期並輸入到date.log檔案中。要注意,定時任務中的時間最小單位是分鐘,最大單位是天,另外,無論是寫命令還是指令碼都需要使用絕對路徑。額外要說明的是:
crontab -e
是使用者執行的命令,不同的使用者身份可以執行自己的定時任務- 如果需要系統執行定時任務,可以編輯
/etc/crontab
檔案 /etc/crontab
可以指定shell、路徑、郵件傳送和家目錄
我們繼續上面的例子:
寫完定時任務後,我們儲存並推出退出。然後就會出現如下的提示:
即,安裝了新的定時任務。另外,我們也可以通過crontab -l命令檢視當前的定時任務:
然後呢,我們看看date.log檔案:
發現任務確實是在跑的。就讓它先跑著吧...。
四、定時任務實戰
還記得之前我們安裝了nginx、mysql等工具,下面我們通過這章的學習內容,來監控下各工具的執行狀態。
1、監控nginx狀態
監控的程式碼如下:
#!/bin/bash #設定本地變數 #變數nginx的結果是查詢nginx的程式,不包含grep自身 nginx=`ps -ef |grep /user/sbin/nginx|grep -v grep|wc -l` # 然後下面的意思大家都懂了吧,不懂就回頭複習一遍 if [ $nginx -gt 2 ];then echo "your nginx is running" exit 0 else echo "your nginx is ready to rerunning" /bin/systemctl start nginx.service exit 1 fi
然後我們跑一下這個命令試一下,還是之前demo的位置,這個位置其實無所謂,就是你放置指令碼的位置就對了:
然後,我們可以:
curl http://localhost
就可以看到了結果了。欸?你這是手動的啊,也沒定時啊。沒錯。但是,我們可以把命令按照前面的例子加進去就可以了,這裡不再演示,大家要自己動手了哦。
2、監控mysql狀態
這回大家都知道怎麼用了吧,這回僅展示下定時任務的指令碼,別的就不說啦:
#!/bin/bash PortNum=`netstat -lnt|grep 3306|wc -l` if [ $PortNum -gt 0 ] then echo "mysqld is running." else echo "mysqld is stoped." fi
3、mysql備份
#!/bin/bash DATE=$(date +%F_%H-%M-%S) HOST=127.0.0.1 DB=test USER=root PASS=abcd1#EFG MAIL="83687401@qq.com" BACKUP_DIR=/data/db_backup if [ ! -d "$BACKUP_DIR" ];then mkdir -p $BACKUP_DIR fi SQL_FILE=${DB}_FULL_$DATE.sql BAK_FILE=${DB}_FULL_$DATE.zip cd $BACKUP_DIR if mysqldump -h$HOST -u$USER -p$PASS -B $DB > $SQL_FILE; then zip $BAK_FILE $SQL_FILE && rm -rf $SQL_FILE if [ ! -s $BAK_FILE ]; then echo "$DATE 備份失敗" | mail -s "備份失敗" $MAIL fi else echo "$DATE 備份失敗" | mail -s "備份失敗" $MAIL fi find $BACKUP_DIR -name '*.zip' -ctime +14 -exec rm {} \;
到此這篇文章就結束了哦。