Linux作業系統中程序和計劃管理
1. 程式與程序的關係
2. 檢視程序資訊-ps
3. 檢視程序資訊-top
4. 檢視程序資訊-pgrep
5. 檢視程序樹-pstree
6.程序的啟動方式與後臺排程
7.終止程序的執行
8. 計劃任務管理
1. 程式與程序的關係
程式
- 儲存在硬碟、光碟等介質中的可執行程式碼和資料
- 檔案中靜態儲存的程式碼
程序
- 在CPU及記憶體中執行的程式程式碼
- 動態執行的程式碼
- 父、子程序
- 每個程式可以建立一個或多個程序
程序與執行緒的關係
- 一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒;
- 資源分配給程序,同一程序內的所有執行緒共享該程序的所有資源
- 執行緒在執行過程中需要協作同步。不同程序中的執行緒之間要利用訊息通訊的方法實現同步;
- 處理機分配給執行緒,即真正在處理機上執行的是執行緒;
- 執行緒是程序的一個執行單元,也是程序內的可呼叫實體。
(資源分配的最小單位-程序,程式執行的最小單位-執行緒)
2. 檢視程序資訊-ps
方法一
1 ps aux 2 檢視靜態的程序統計資訊
a:顯示終端上的所有程序,包括其它使用者的程序
u:表示列出程序的使用者
x:顯示所有終端的程序
欄位解釋
USER:程序的使用者
PID:程序的ID
%CPU:程序佔用的CPU百分比
%MEM:佔用記憶體的百分比
VSZ:該程序使用的虛擬記憶體量
RSS:該程序佔用的實體記憶體量(KB)
TTY:啟動程序的終端名。不是從終端啟動的程序則顯示為”?“
STAT:該程序的狀態(D:不可中斷的休眠狀態;R:正在執行狀態;S:處於休眠狀態,可被喚醒;T:停止狀態,可能是在後臺暫停或程序處於跟蹤除錯狀態;Z:殭屍程序,程序已經中止,但是部分程式還在記憶體當中)
START:該程序被觸發啟動時間
TIME:該程序實際使用CPU執行的時間
COMMAND:程序的啟動命令
方法二
1 ps -elf 2 檢視靜態的程序統計資訊 3 ps -aT 4 顯示所有執行緒
-e:顯示系統內的所有程序資訊
-l:使用長格式顯示
-f:使用完整的格式顯示程序資訊
-a:顯示所有程序PID
-T:檢視執行緒資訊
欄位解釋
F:核心分配給程序的系統標記
S:程序的狀態
UID:啟動這些程序的使用者
PID:程序的程序ID
PPID:父程序的程序號(如果該程序是由另一個程序啟動的)
C:程序生命週期中的CPU利用率
PRI:程序的優先順序(越大的數字代表越低的優先順序)
NI:謙讓度值用來參與決定優先順序
ADDR:程序的記憶體地址
SZ:假如程序被換出,所需交換空間的大致大小
WCHAN:若該程序在睡眠,則顯示睡眠中的系統函式名
STIME:程序啟動時的系統時間
TTY:程序啟動時的終端裝置
TIME:執行程序需要的累計CPU時間
CMD:程序的啟動命令
3. 檢視程序資訊-top
1 top 2 檢視動態的程序排名資訊
第一行任務佇列資訊
1 14:09:16 系統時間 2 up 2:55 系統已執行時長 3 1 user 當前登入使用者數 4 load average: 0.00, 0.01, 0.05 系統負載,即單位時間內系統處理的任務數,後面三個數值分別為1分鐘、5分鐘、15分鐘前到現在的平均值
第二行為程序資訊
1 Tasks 總程序數 2 running 正在執行的程序數 3 sleeping 休眠的程序數 4 stopped 中止的程序數 5 zombie 僵死的程序數
殭屍程序:
一個程序結束了,但是如果該程序的父程序已經先結束了,那麼該程序就不會變成殭屍程序,因為每個程序結束的時候,系統都會掃描當前系統中所執行的所有程序,看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由Init來接管它,成為它的父程序,子程序退出後init會回收其佔用的相關資源
但是當子程序比父程序先結束,而父程序又沒有回收子程序,釋放子程序佔用的資源,此時子程序將成為一個殭屍程序。
第三行為CPU資訊
1 us 使用者佔用 2 sy 核心佔用 3 ni 優先順序排程佔用 4 id 空閒CPU,要了解空閒的CPU百分比,主要看%id 部分(=總-us-sy-ni) 5 wa I/O等待佔用 6 hi 硬體中斷佔用 7 si 軟體中斷佔用 8 st 虛擬化佔用
第四行為記憶體資訊
1 total 總記憶體空間 3 free 空閒記憶體 5 used 已用記憶體 7 buff/cache 實體記憶體和交換記憶體的緩衝區總和
第五行為交換空間資訊
1 total 總交換空間 2 free 空閒交換空間 3 used 已用交換空間 4 avail Mem 可用物理空間
常用命令
1 P鍵:根據CPU使用百分比大小進行排序 2 M鍵:根據駐留記憶體大小進行排序 3 N鍵:根據啟動時間進行排序 4 c鍵:切換顯示命令名稱和完整命令列 5 h鍵:可以獲得top程式的線上幫助資訊 6 k鍵:根據提示輸入指定程序的PID號並按Enter鍵終止對應的程序 7 q鍵:退出top程式 8 數字1鍵:顯示CPU個數和狀態
1 top -H 顯示所有執行緒 2 top -H -P <pid> 顯示特定程序中的執行緒
tty 終端
- Centos7系統,tty1表示圖形介面,tty2-tty6表示文字介面,可以用Ctrl+Alt+F1-F6切換
- pts說明是用遠端工具連線的,比如xshell,後面的數字代表登入的時間順序,越小證明登入的越早
4. 檢視程序資訊-pgrep
根據特定條件查詢程序PID資訊
1 pgrep -l "ce" 2 -l:顯示程序名,預設時只輸出PID號 3 -U:指定特定使用者 4 -t:指定終端
5. 檢視程序樹-pstree
以樹形結構列出程序資訊
1 pstree -aup 2 -a 顯示完整資訊 3 -u 列出對應使用者名稱 4 -p 列出對應PID號 5 pstree -ap 指定使用者 檢視指定使用者程序樹
6.程序的啟動方式與後臺排程
手工啟動
- 前臺啟動:使用者輸入命令,直接執行程式
- 後臺啟動:在命令列尾加入“&”符號
1 cp -R /data /opt & 2 複製過程中可以後臺執行(輸出資訊中包括後臺任務序號和PID號)
程序的前後臺排程
1 Ctrl + Z組合鍵 2 將當前程序掛起,即調入後臺並停止執行 3 4 jobs 命令 5 jobs [-l] 檢視處於後臺的任務列表 6 7 fg 命令 8 將後臺程序恢復到前臺執行,可指定任務序號
7.終止程序的執行
1 Ctrl + C 組合鍵 2 中斷正在執行的命令 3 4 Kill、Killall命令 5 kill 用於終止指定PID號的程序 6 killall 用於終止指定名稱相關的所有程序 7 -9 選項 用於強制終止
pkill 命令
根據特定條件終止相應的程序
常用命令
-∪:根據程序所屬的使用者名稱終止相應程序
-t:根據程序所在的終端終止相應程序
1 pgrep -l -U "指定使用者” 2 #檢視 3 pkill -9 -U "指定使用者” 4 #強行終止
8. 計劃任務管理
at 命令
一次性計劃任務
1 at [HH:MM] [yyyy-mm-dd] 2 3 atq #檢視未執行的任務列表 4 5 atrm 1 #刪除第一條任務
crontab 命令
- 按照預先設定的時間週期 分鐘、小時、天、月、周重複執行使用者指定的命令操作
- 屬於週期性計劃任務
- 主要設定檔案
全域性配置檔案,位於檔案: /etc/crontab
系統預設的設定,位於目錄: /etc/cron.*/
使用者定義的設定,位於檔案: /var/spool/cron/使用者名稱
管理crontab計劃任務
1 編輯計劃任務 2 crontab -e [-u 使用者名稱] 3 #-u預設預設是針對當前使用者
1 檢視計劃任務 2 crontab -l [-u 使用者名稱]
1 刪除計劃任務 2 crontab -r [-u 使用者名稱]
crontab任務配置格式
分鐘-小時-日期-月份-星期 命令或者指令碼檔案
欄位 | 說明 |
分鐘 | 取值為從0到59之間的任意整數 |
小時 | 取值為從0到23之間的任意整數 |
日期 | 取值為從1到31之間的任意整數 |
月份 | 取值為從1到12之間的任意整數 |
星期 | 取值為從0到7之間的任意整數,0或7代表星期日 |
命令 | 要執行的命令或程式指令碼 |
時間數值的特殊表示方法
- * 表示該範圍內的任意時間
- , 表示間隔的多個不連續時間點
- - 表示一個連續的時間範圍
- / 指定間隔的時間頻率
應用示例
1 0 17 * * 1-5 週一到週五每天17:00 2 30 8 * * 1,3,5 每週一、三、五的8點30分 3 0 8-18/2 * * * 8點到18點之間每2小時 4 0 * */3 * * 每3天
crontab -e [-u root] (最好用絕對路徑)
每分鐘定時執行一次規則
1 每1分鐘執行: * /1 * * * * 或者 * * * * * 2 每5分鐘執行: * /5 * * * *
每小時定時執行一次規則
1 每小時執行:0 * * * * 或者 0 * /1 * * * 2 每天上午7點執行:0 7 * * * 3 每天上午7點10分執行:10 7 * * *
每天定時執行一次規則
1 每天執行:0 0 * * *
每週定時執行一次規則
1 每週執行:0 0 * *1
每月定時執行一次規則
1 每月執行:0 0 1 * *
每年定時執行–次規則
1 1 每年執行:0 0 1 1 *
1 10 * * * * ls 指定每小時的第10分鐘執行一次ls命令 2 30 10 * * * ls 指定每天的10:30執行ls命令 3 30 10 10 * * ls 指定每月10號的10: 30分執行ls命令 4 30 10 10 10 * ls 指定每年的10月10日10: 30執行ls命令 5 30 10 * * 0 ls 指定每星期日的10:30執行ls命令 6 30 10 10,20 * * ls 每月10號及20號的3: 30執行ls命令 [“,”用來連線多個不連續的時段] 7 30 8-11 * * * ls 每天8-11點的第30分鐘執行ls命令 [“-”用來連線連續的時段] 8 */15 * * * * ls 每15分鐘執行一次ls命令[即每個小時的第 0 15 30 45 60分鐘執行ls命令] 9 30 10 */10 * * ls 每個月中,每隔10天10:30執行一 次ls命令[即每月的1、11、21、31日是的10: 30執行一次ls命令] 10 */10 10-16 * 1,6 6 /usr/bin/ls -l 1,6月的每個週六從上午10點到下午的4點的每10分鐘執行ls -l
1 echo '30 7 * * 7 /usr/bin/systemctl httpd restart' >> /var/spool/cron/root