一、程序和進程
1、程序
- 保存在硬盤、光盤等介質中的可執行代碼和數據
- 文件中靜態保存的代碼
2、進程
- 在CPU及內存中運行的程序代碼
- 動態執行的代碼
- 父、子進程
每個程序可以創建一個或多個進程
3、線程
- 線程是CPU調度的最小單位(程序執行流的最小單元)
- 它被包含在進程之中,是進程中的實際運作單元
- 一條線程是進程中一個單一順序的控制流
- 一個進程中可以并發多個線程,每條線程并行執行不同的任務。
4、線程與進程的關系
- 一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程
- 資源分配給進程,同一進程內的所有線程共享該進程的所有資源
- 線程在執行過程中需要協作同步。不同進程中的線程之間要利用消息通信的方法實現同步
- 處理機分配給線程,即真正在處理機上運行的是線程
- 線程是進程的一個執行單元,也是進程內的可調用實體。
二、查看進程信息的命令(ps、top、pgrep、pstree)
1、查看靜態的進程統計信息ps命令:ps aux
1.1、代碼
[root@localhost~]# ps aux
字符 | 說明 |
---|---|
a | 顯示終端上的所有進程,包括其他用戶的進程 |
u | 表示列出進程的用戶 |
x | 顯示所有終端的進程 |
1.2、示例
::: hljs-center
:::
::: hljs-center
:::
1.3、各列的解釋
各列名稱 | 解釋 |
---|---|
USER | 進程的用戶 |
PID | 進程的ID |
%CPU | 進程占用的CPU百分比 |
%MEM | 占用內存的百分比 |
VSZ | 該進程使用的虛擬內存量(KB) |
RSS | 該進程占用的物理內存量(KB) |
TTY | 啟動進程的終端名。不是從終端啟動的進程則顯示為? |
STAT | 該進程的狀態 |
START | 該進程被觸發啟動時間 |
TIME | 該進程實際使用CPU運行的時間 |
COMMAND | 進程的啟動命令 |
1.4、進程狀態
進程狀態 | 說明 |
---|---|
D | 不可中斷的休眠狀態 |
R | 正在運行狀態 |
S | 處于休眠狀態,可被喚醒 |
T | 停止狀態,可能是在后臺暫?;蜻M程處于跟蹤調試狀態 |
Z | 僵尸進程,進程已經中止,但是部分程序還在內存當中 |
補充:僵尸進程
一個進程結束了,但是如果該進程的父進程已經先結束了,那么該進程就不會變成僵尸進程,因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程,看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init來接管它,成為它的父進程,子進程退出后init會回收其占用的相關資源。
但是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵進程。
2、查看靜態的進程統計信息ps命令:ps -elf
2.1、代碼
[root@localhost~]# ps -elf
字符 | 說明 |
---|---|
-e | 顯示系統內的所有進程信息 |
-l | 使用長格式顯示進程信息 |
-f | 使用完整的格式顯示進程信息 |
-a | 顯示所有進程pid |
-T | 查看線程信息 |
[root@localhost~]# ps -aT 顯示所有線程
2.2、示例
::: hljs-center
:::
2.3、各列的解釋
各列名稱 | 解釋 |
---|---|
F | 內核分配給進程的系統標記 |
S | 進程的狀態 |
UID | 啟動這些進程的用戶 |
PID | 進程的進程ID |
PPID | 父進程的進程號(如果該進程是由另一個進程啟動的) |
C | 進程生命周期中的CPU使用率 |
PRI | 進程的優先級(越大的數字代表越低的優先級) |
NI | 謙讓度值用來參與決定優先級 |
ADDR | 進程的內存地址 |
SZ | 假如進程被換出,所需交換空間的大致大小 |
WCHAN | 若該進程在睡眠,則顯示睡眠中的系統函數名 |
STIME | 進程啟動時的系統時間 |
TTY | 進程啟動時的終端設備 |
TIME | 運行進程需要的累計CPU時間 |
CMD | 進程的啟動命令 |
tty終端
- Centos7系統,tty1表示圖形界面,tty2-tty6表示文字 界而,可以用Ctr1+Alt+F1-F6切換。
- pts說明是用遠程工具連接的,比如xshell,后面的數字代表登錄的時間順序,越小證明登錄的越早
3、查看動態的進程排名信息:top命令
3.1、top命令
[root@localhost~]# top
::: hljs-center
:::
3.2、各行的解釋
第一行:任務隊列信息
信息 | 說明 |
---|---|
11:06:48 | 系統時間 |
up 1:22 | 系統已運行時長 |
1 user | 當前登錄用戶數 |
load average:0.06,0.60,0.48 | 系統負載,即單位時間內系統處理的任務數,后面三個數值分別為1分鐘、5分鐘、15分鐘前到現在的平均值 |
第二行:進程信息
信息 | 說明 |
---|---|
Tasks | 總進程數 |
running | 正在運行的進程數 |
sleeping | 休眠的進程數 |
stopped | 中止的進程數 |
zombie | 僵死的進程數 |
第三行:CPU的信息
信息 | 說明 |
---|---|
us | 用戶占用 |
sy | 內核占用 |
ni | 優先級調度占用 |
id | 空閑CPU,要了解空閑的 CPU 的百分比,主要看 %id 部分 |
wa | I/O等待占用 |
hi | 硬件中斷占用 |
si | 軟件中斷占用 |
st | 虛擬化占用 |
第四行:內存的信息
信息 | 說明 |
---|---|
total | 總內存空間 |
free | 空閑內存 |
used | 已用內存 |
buff/cache | 物理內存和交換內存的緩沖區總和 |
第五行:交換空間的信息
信息 | 說明 |
---|---|
total | 總交換空間 |
free | 空閑交換空間 |
used | 已用交換空間 |
avail Mem | 可用物理空間 |
3.3、進程信息區各列解釋
各列名稱 | 解釋 |
---|---|
PID | 進程id |
USER | 進程所有者的用戶名 |
PR | 優先級 |
NI | 謙讓度值。謙讓度越高,優先級越低。復制表示高優先級,正值表示低優先級 |
VIRT | 進程使用的虛擬內存總量,單位kb |
RES | 進程使用的物理內存大小,單位kb |
SHR | 共享內存大小,單位kb |
S | 進程狀態 |
%CPU | 上次更新到現在的CPU時間占用百分比 |
%MEM | 進程使用的物理內存百分比 |
TIME+ | 進程使用的CPU時間總計,單位1/100秒 |
COMMAND | 命令名/命令行 |
3.4、top常用命令
命令 | 說明 |
---|---|
P鍵 | 根據CPU使用百分比大小進行排序 |
M鍵 | 根據駐留內存大小進行排序 |
N鍵 | 根據啟動時間進行排序 |
c鍵 | 切換顯示命令名稱和完整命令行 |
h鍵 | 可以獲得top程序的在線幫助信息 |
k鍵 | 根據提示輸入指定進程的PID號并按Enter鍵終止對應的進程 |
q鍵 | 退出top程序 |
數字1鍵 | 顯示CPU個數和狀態 |
4、根據特定條件查詢進程PID信息:pgrep命令
[root@localhost~]# pgrep -l "log"2538 rsyslogd2113 mcelog[root@localhost~]# pgrep -l -U teacher -t tty227483 bash27584 vim
選項 | 說明 |
---|---|
-l | 顯示進程名,缺省時只輸出PID號 |
-U | 指定特定用戶 |
::: hljs-center
:::
5、以樹形結構列出進程信息:pstree命令
[root@localhost ~]# pstree -aupinit,1....//省略部分信息 login,3221 bash,27483,teacher vim,27674 myfile.txt.....//省略部分信息[root@localhost ~]# pstree -ap teacherbash,27483 vim,27674 myfile.txt
::: hljs-center
:::
三、進程的啟動與控制
1、進程的啟動方式
1.1、手工啟動
- 前臺啟動:用戶輸入命令,直接執行程序
- 后臺啟動:在命令行尾加入“&”符號
[root@localhost ~]# cp /dev/cdrom mycd.iso &[1]28454 ##輸出信息中包括后臺任務序號、PID號
::: hljs-center
:::
1.2、調度啟動
- 使用at命令
- 使用crontab命令,設置周期性計劃任務
2、進程的前后臺調度
Ctrl+Z組合鍵
- 將當前進程掛起,即調入后臺并停止執行
jobs命令
- jobs [-l]
- 查看處于后臺的任務列表
fg命令
- 將后臺進程恢復到前臺運行,可指定任務序號
[root@localhost ~]# jobs[1]- Stopped cp /dev/cdrom mycd.iso[2]+ Stopped top[root@localhost ~]# fg 1
3、終止進程的運行
Ctrl+C組合鍵
- 中斷正在執行的命令
kill、killall命令
- kill用于終止指定PID號的進程
- killall用于終止指定名稱相關的所有進程
- -9選項用于強制終止
pkill命令
- 根據特定條件終止相應的進程
- 常用命令選項
選項 | 說明 |
---|---|
-U | 根據進程所屬的用戶名終止相應的進程 |
-t | 根據進程所在的終端終止相應進程 |
[root@localhost ~]# pgrep -l -U "teacher"3045 bash[root@localhost ~]# pkill -9 -U "teacher"[root@localhost ~]# pgrep -l -U "teacher"
四、計劃任務管理(at命令、crontab命令)
1、at命令
- 一次性計劃任務
::: hljs-center
:::
[root@localhost ~]# dateSun May 7 10:33:13 EDT 2017[root@localhost ~]# at 10:35 2017-05-07at> pgrep -U root | WC -l > /tmp/ps.rootat> 按Ctrl+ D鍵提交任務job 1 at Sun May 7 10:35:00 2017[root@localhost ~]# cat /tmp/ps.root202
1.1、案例
- 在當天的21:30時自動關閉當前系統
[root@localhost ~]# at 21:30##不攜帶日期表示為當天at> shutdown -h nowat>
##按CtrI+D鍵提交任務job 2 at Sun May 7 21:30:00 2017
[root@localhost ~]# atq
##查看未執行的任務列表
2 Sun May 7 21:30:00 2017 a root
[root@localhost ~]# atrm 1
##刪除第1條任務
[root@localhost ~]# atq
### 2、crontab命令**2.1、crontab命令**- 按照預先設置的時間周期(分鐘、小時、天、月、周)重 分時日月周 復執行用戶指定的命令操作- 屬于周期性計劃任務- 主要設置文件全局配置文件,位于文件: /etc/crontab系統默認的設置,位于目錄: /etc/cron.*/用戶定義的設置,位于文件: /var/spool/cron/用戶名**2.2、管理crontab計劃任務**- 編輯計劃任務::: hljs-center![2.png](https://s2.51cto.com/images/20211122/1637550132563912.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=):::- 查看計劃任務::: hljs-center![3.png](https://s2.51cto.com/images/20211122/1637550156822999.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=):::- 刪除計劃任務::: hljs-center![4.png](https://s2.51cto.com/images/20211122/1637550182126871.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=):::**2.3、crontab任務配置的格式**2.3.1、六個字段::: hljs-center![12.png](https://s2.51cto.com/images/20211122/1637550928388658.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=):::| 代表意義 | 數字范圍 || :------: | :--------------------------------------: || 分鐘 | 取值從0到59之間的任意整數 || 小時 | 取值從0到23之間的任意整數 || 日期 | 取值從1到31之間的任意整數 || 月份 | 取值從1到12之間的任意整數 || 星期 | 取值為0到7之間的任意整數,0或7代表星期日 || 命令 | 要執行的命令或程序腳本 |**2.3.2、時間數值的特殊表示方法**- *表示該范圍內的任意時間- ,表示間隔的多個不連續時間點- -表示一個連續的時間范圍- /指定間隔的時間頻率**2.3.3、應用示例**| 示例 | 含義 || :--------------: | :---------------------: || 0 17 * * 1-5 | 周一到周五每天17:00 || 30 8 * * 1,3,5 | 每周一、三、五的8點30分 || 0 818/2 * * * | 8點到18點之間每2小時 || 0 * */3 * * | 每3天 |**2.4、crontab任務配置**::: hljs-center![13.png](https://s2.51cto.com/images/20211122/1637551219707587.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=):::1.每分鐘定時執行一次規則:
每1分鐘執行: /1 或者
每5分鐘執行: /5 *
2.每小時定時執行一次規則:
每小時執行:0 或者0 /1
每天上午7點執行: 0 7
每天上午7點10分執行: 10 7
3.每天定時執行一次規則:
每天執行 0 0 *
4.每周定時執行一次規則:
每周執行 0 0 1
5.每月定時執行一次規則:
每月執行 0 0 1
6.每年定時執行一次規則:
每年執行 0 0 1 1 *
7.其他例子
5 ls 指定每小時的第5分鐘執行一次ls命令
30 5 ls 指定每天的5:30執行ls命令
30 7 8 ls 指定每月8號的7: 30分執行ls命令
30 5 8 6 ls 指定每年的6月8日5: 30執行ls命令
30 6 0 ls
指定每星期日的6:30執行ls命令[注: 0表示星期天,1表示星期1,以此類推,也可以用英文來表示,sun表示星期天,mon表示星期一等]
30 3 10,20 ls 每月10號及20號的3: 30執行ls命令[注:“-"用來連接多個不連續的時段]
25 8-11 ls 每天8-11點的第25分鐘執行ls命令[注: “-"用來連接連續的時段]
/15 ls 每15分鐘執行一次ls命令 [即每個小時的第0 15 30 45 60分鐘執行ls命令]
30 6 /10 * ls 每個月中,每隔10天6:30執行一次ls命令[即每月的1、11、21、31日是的6: 30執行一次ls命令。 ]
方法二:
echo ‘30 7 6 /usr/bin/systemct1 httpd restart’ >> /var/spool/cron/ root ##用絕對路徑表示命令
1,6月的每個周六從.上午10點到下午的4點的每10分鐘執行ls -1
/10 10-16 1,6 6 /usr/bin/ls -1