一、程序和進程

1、程序

  • 保存在硬盤、光盤等介質(zhì)中的可執(zhí)行代碼和數(shù)據(jù)
  • 文件中靜態(tài)保存的代碼

2、進程

  • 在CPU及內(nèi)存中運行的程序代碼
  • 動態(tài)執(zhí)行的代碼
  • 父、子進程

每個程序可以創(chuàng)建一個或多個進程

3、線程

  • 線程是CPU調(diào)度的最小單位(程序執(zhí)行流的最小單元)
  • 它被包含在進程之中,是進程中的實際運作單元
  • 一條線程是進程中一個單一順序的控制流
  • 一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。

4、線程與進程的關(guān)系

  • 一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程
  • 資源分配給進程,同一進程內(nèi)的所有線程共享該進程的所有資源
  • 線程在執(zhí)行過程中需要協(xié)作同步。不同進程中的線程之間要利用消息通信的方法實現(xiàn)同步
  • 處理機分配給線程,即真正在處理機上運行的是線程
  • 線程是進程的一個執(zhí)行單元,也是進程內(nèi)的可調(diào)用實體。

    二、查看進程信息的命令(ps、top、pgrep、pstree)

1、查看靜態(tài)的進程統(tǒng)計信息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占用內(nèi)存的百分比
VSZ該進程使用的虛擬內(nèi)存量(KB)
RSS該進程占用的物理內(nèi)存量(KB)
TTY啟動進程的終端名。不是從終端啟動的進程則顯示為?
STAT該進程的狀態(tài)
START該進程被觸發(fā)啟動時間
TIME該進程實際使用CPU運行的時間
COMMAND進程的啟動命令

1.4、進程狀態(tài)

進程狀態(tài)說明
D不可中斷的休眠狀態(tài)
R正在運行狀態(tài)
S處于休眠狀態(tài),可被喚醒
T停止狀態(tài),可能是在后臺暫?;蜻M程處于跟蹤調(diào)試狀態(tài)
Z僵尸進程,進程已經(jīng)中止,但是部分程序還在內(nèi)存當中

補充:僵尸進程

一個進程結(jié)束了,但是如果該進程的父進程已經(jīng)先結(jié)束了,那么該進程就不會變成僵尸進程,因為每個進程結(jié)束的時候,系統(tǒng)都會掃描當前系統(tǒng)中所運行的所有進程,看有沒有哪個進程是剛剛結(jié)束的這個進程的子進程,如果是的話,就由Init來接管它,成為它的父進程,子進程退出后init會回收其占用的相關(guān)資源。
但是當子進程比父進程先結(jié)束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵進程。

2、查看靜態(tài)的進程統(tǒng)計信息ps命令:ps -elf

2.1、代碼

[root@localhost~]# ps -elf
字符說明
-e顯示系統(tǒng)內(nèi)的所有進程信息
-l使用長格式顯示進程信息
-f使用完整的格式顯示進程信息
-a顯示所有進程pid
-T查看線程信息
[root@localhost~]# ps -aT   顯示所有線程

2.2、示例
::: hljs-center

:::
2.3、各列的解釋

各列名稱解釋
F內(nèi)核分配給進程的系統(tǒng)標記
S進程的狀態(tài)
UID啟動這些進程的用戶
PID進程的進程ID
PPID父進程的進程號(如果該進程是由另一個進程啟動的)
C進程生命周期中的CPU使用率
PRI進程的優(yōu)先級(越大的數(shù)字代表越低的優(yōu)先級)
NI謙讓度值用來參與決定優(yōu)先級
ADDR進程的內(nèi)存地址
SZ假如進程被換出,所需交換空間的大致大小
WCHAN若該進程在睡眠,則顯示睡眠中的系統(tǒng)函數(shù)名
STIME進程啟動時的系統(tǒng)時間
TTY進程啟動時的終端設(shè)備
TIME運行進程需要的累計CPU時間
CMD進程的啟動命令

tty終端

  • Centos7系統(tǒng),tty1表示圖形界面,tty2-tty6表示文字 界而,可以用Ctr1+Alt+F1-F6切換。
  • pts說明是用遠程工具連接的,比如xshell,后面的數(shù)字代表登錄的時間順序,越小證明登錄的越早

    3、查看動態(tài)的進程排名信息:top命令

3.1、top命令

[root@localhost~]# top

::: hljs-center

:::
3.2、各行的解釋

第一行:任務(wù)隊列信息

信息說明
11:06:48系統(tǒng)時間
up 1:22系統(tǒng)已運行時長
1 user當前登錄用戶數(shù)
load average:0.06,0.60,0.48系統(tǒng)負載,即單位時間內(nèi)系統(tǒng)處理的任務(wù)數(shù),后面三個數(shù)值分別為1分鐘、5分鐘、15分鐘前到現(xiàn)在的平均值

第二行:進程信息

信息說明
Tasks總進程數(shù)
running正在運行的進程數(shù)
sleeping休眠的進程數(shù)
stopped中止的進程數(shù)
zombie僵死的進程數(shù)

第三行:CPU的信息

信息說明
us用戶占用
sy內(nèi)核占用
ni優(yōu)先級調(diào)度占用
id空閑CPU,要了解空閑的 CPU 的百分比,主要看 %id 部分
waI/O等待占用
hi硬件中斷占用
si軟件中斷占用
st虛擬化占用

第四行:內(nèi)存的信息

信息說明
total總內(nèi)存空間
free空閑內(nèi)存
used已用內(nèi)存
buff/cache物理內(nèi)存和交換內(nèi)存的緩沖區(qū)總和

第五行:交換空間的信息

信息說明
total總交換空間
free空閑交換空間
used已用交換空間
avail Mem可用物理空間

3.3、進程信息區(qū)各列解釋

各列名稱解釋
PID進程id
USER進程所有者的用戶名
PR優(yōu)先級
NI謙讓度值。謙讓度越高,優(yōu)先級越低。復(fù)制表示高優(yōu)先級,正值表示低優(yōu)先級
VIRT進程使用的虛擬內(nèi)存總量,單位kb
RES進程使用的物理內(nèi)存大小,單位kb
SHR共享內(nèi)存大小,單位kb
S進程狀態(tài)
%CPU上次更新到現(xiàn)在的CPU時間占用百分比
%MEM進程使用的物理內(nèi)存百分比
TIME+進程使用的CPU時間總計,單位1/100秒
COMMAND命令名/命令行

3.4、top常用命令

命令說明
P鍵根據(jù)CPU使用百分比大小進行排序
M鍵根據(jù)駐留內(nèi)存大小進行排序
N鍵根據(jù)啟動時間進行排序
c鍵切換顯示命令名稱和完整命令行
h鍵可以獲得top程序的在線幫助信息
k鍵根據(jù)提示輸入指定進程的PID號并按Enter鍵終止對應(yīng)的進程
q鍵退出top程序
數(shù)字1鍵顯示CPU個數(shù)和狀態(tài)

4、根據(jù)特定條件查詢進程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、以樹形結(jié)構(gòu)列出進程信息: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、手工啟動

  • 前臺啟動:用戶輸入命令,直接執(zhí)行程序
  • 后臺啟動:在命令行尾加入“&”符號
[root@localhost ~]# cp /dev/cdrom mycd.iso &[1]28454    ##輸出信息中包括后臺任務(wù)序號、PID號

::: hljs-center

:::
1.2、調(diào)度啟動

  • 使用at命令
  • 使用crontab命令,設(shè)置周期性計劃任務(wù)

2、進程的前后臺調(diào)度

Ctrl+Z組合鍵

  • 將當前進程掛起,即調(diào)入后臺并停止執(zhí)行

jobs命令

  • jobs [-l]
  • 查看處于后臺的任務(wù)列表

fg命令

  • 將后臺進程恢復(fù)到前臺運行,可指定任務(wù)序號
    [root@localhost ~]# jobs[1]- Stopped    cp /dev/cdrom mycd.iso[2]+ Stopped    top[root@localhost ~]# fg 1

    3、終止進程的運行

Ctrl+C組合鍵

  • 中斷正在執(zhí)行的命令

kill、killall命令

  • kill用于終止指定PID號的進程
  • killall用于終止指定名稱相關(guān)的所有進程
  • -9選項用于強制終止

pkill命令

  • 根據(jù)特定條件終止相應(yīng)的進程
  • 常用命令選項
選項說明
-U根據(jù)進程所屬的用戶名終止相應(yīng)的進程
-t根據(jù)進程所在的終端終止相應(yīng)進程
[root@localhost ~]# pgrep -l -U "teacher"3045 bash[root@localhost ~]# pkill -9 -U "teacher"[root@localhost ~]# pgrep -l -U "teacher"

四、計劃任務(wù)管理(at命令、crontab命令)

1、at命令

  • 一次性計劃任務(wù)
    ::: 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鍵提交任務(wù)job 1 at Sun May 7 10:35:00 2017[root@localhost ~]# cat /tmp/ps.root202

1.1、案例

  • 在當天的21:30時自動關(guān)閉當前系統(tǒng)
    [root@localhost ~]# at 21:30##不攜帶日期表示為當天at> shutdown -h nowat> ##按CtrI+D鍵提交任務(wù)job 2 at Sun May 7 21:30:00 2017

[root@localhost ~]# atq
##查看未執(zhí)行的任務(wù)列表
2 Sun May 7 21:30:00 2017 a root

[root@localhost ~]# atrm 1
##刪除第1條任務(wù)
[root@localhost ~]# atq

### 2、crontab命令**2.1、crontab命令**- 按照預(yù)先設(shè)置的時間周期(分鐘、小時、天、月、周)重  分時日月周  復(fù)執(zhí)行用戶指定的命令操作- 屬于周期性計劃任務(wù)- 主要設(shè)置文件全局配置文件,位于文件: /etc/crontab系統(tǒng)默認的設(shè)置,位于目錄: /etc/cron.*/用戶定義的設(shè)置,位于文件: /var/spool/cron/用戶名**2.2、管理crontab計劃任務(wù)**- 編輯計劃任務(wù)::: 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=):::- 查看計劃任務(wù)::: 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=):::- 刪除計劃任務(wù)::: 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任務(wù)配置的格式**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=):::| 代表意義 |                 數(shù)字范圍                 || :------: | :--------------------------------------: ||   分鐘   |        取值從0到59之間的任意整數(shù)         ||   小時   |        取值從0到23之間的任意整數(shù)         ||   日期   |        取值從1到31之間的任意整數(shù)         ||   月份   |        取值從1到12之間的任意整數(shù)         ||   星期   | 取值為0到7之間的任意整數(shù),0或7代表星期日 ||   命令   |          要執(zhí)行的命令或程序腳本          |**2.3.2、時間數(shù)值的特殊表示方法**- *表示該范圍內(nèi)的任意時間- ,表示間隔的多個不連續(xù)時間點- -表示一個連續(xù)的時間范圍- /指定間隔的時間頻率**2.3.3、應(yīng)用示例**|       示例       |          含義           || :--------------: | :---------------------: ||   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任務(wù)配置**::: 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.每分鐘定時執(zhí)行一次規(guī)則:

每1分鐘執(zhí)行: /1 或者
每5分鐘執(zhí)行: /5 *

2.每小時定時執(zhí)行一次規(guī)則:

每小時執(zhí)行:0 或者0 /1
每天上午7點執(zhí)行: 0 7
每天上午7點10分執(zhí)行: 10 7

3.每天定時執(zhí)行一次規(guī)則:

每天執(zhí)行 0 0 *

4.每周定時執(zhí)行一次規(guī)則:

每周執(zhí)行 0 0 1

5.每月定時執(zhí)行一次規(guī)則:

每月執(zhí)行 0 0 1

6.每年定時執(zhí)行一次規(guī)則:

每年執(zhí)行 0 0 1 1 *

7.其他例子

5 ls 指定每小時的第5分鐘執(zhí)行一次ls命令
30 5 ls 指定每天的5:30執(zhí)行l(wèi)s命令
30 7 8
ls 指定每月8號的7: 30分執(zhí)行l(wèi)s命令
30 5 8 6
ls 指定每年的6月8日5: 30執(zhí)行l(wèi)s命令
30 6 0 ls
指定每星期日的6:30執(zhí)行l(wèi)s命令[注: 0表示星期天,1表示星期1,以此類推,也可以用英文來表示,sun表示星期天,mon表示星期一等]

30 3 10,20 ls 每月10號及20號的3: 30執(zhí)行l(wèi)s命令[注:“-"用來連接多個不連續(xù)的時段]
25 8-11 ls 每天8-11點的第25分鐘執(zhí)行l(wèi)s命令[注: “-"用來連接連續(xù)的時段]
/15 ls 每15分鐘執(zhí)行一次ls命令 [即每個小時的第0 15 30 45 60分鐘執(zhí)行l(wèi)s命令]
30 6 /10 * ls 每個月中,每隔10天6:30執(zhí)行一次ls命令[即每月的1、11、21、31日是的6: 30執(zhí)行一次ls命令。 ]

方法二:
echo ‘30 7 6 /usr/bin/systemct1 httpd restart’ >> /var/spool/cron/ root ##用絕對路徑表示命令

1,6月的每個周六從.上午10點到下午的4點的每10分鐘執(zhí)行l(wèi)s -1
/10 10-16 1,6 6 /usr/bin/ls -1