一、程序和進程

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 部分
waI/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