理論:linux進程和計劃任務管理

前言

查看進程:分爲動態查看和動態查看

控制進程:以關掉進程爲主,可以按條件關閉指定進程,全部關閉所有進程

at 一次性任務設置

crontab 週期性任務設置

一: 程序和進程的關係

1、 程序

  • 保存在硬盤、光盤等介質中的可執行代碼和數據

  • 靜態保存的代碼

2、 進程

  • 在CPU及內存中運行的程序代碼

  • 動態執行的代碼

  • 父、子進程

​ - 每個進程可以創建一個或多個進程

3、程序、進程、線程之間的三者關係

一個應用程序可以包含一個或多個應用進程

一個進程包含一個或多個線程

線程是執行操作的最小單元

例子

應用程序=工廠

進程=車間

線程=工人

高併發處理依賴於多線程操作

二 :查看靜態進程信息 ps

2.1 ps 命令

直接執行不帶任何子選項的命令時,將只顯示當前用戶會話中打開的進程

[root@localhost ~]# ps
   PID TTY          TIME CMD
  4898 pts/1    00:00:00 bash
  5249 pts/1    00:00:00 ps

2.2 ps aux 命令

查看靜態的進程統計信息

[root@localhost ~]# ps aux
[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 128212  6836 ?        Ss   10:43   0:01 /usr/lib/systemd/s
root          2  0.0  0.0      0     0 ?        S    10:43   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    10:43   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   10:43   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    10:43   0:00 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    10:43   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    10:43   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        R    10:43   0:00 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S    10:43   0:00 [watchdog/0]
root         12  0.0  0.0      0     0 ?        S    10:43   0:00 [kdevtmpfs]
root         13  0.0  0.0      0     0 ?        S<   10:43   0:00 [netns]
root         14  0.0  0.0      0     0 ?        S    10:43   0:00 [khungtaskd]

a 顯示當前終端下的所有進程信息,包括其他用戶的進程。與x結合時將顯示系統中所有的進程信息 不帶-

u 使用已用戶爲主的格式輸出進程信息,不帶-

x 顯示當前用戶在所有中終端下的進程信息,不帶-

-e 顯示系統中的所有進程信息

-l 使用長格式(long)顯示進程信息

-f 使用完整的(full/)格式顯示進程信息

豎着讀的一列叫做字段,也叫做屬性

字段 解釋
USER 啓動該進程的用戶賬號的名稱
PID 該進程在系統中的數字ID進程號,在當前系統中是唯一的
%CPU CPU的資源渣用率
%MEM 內存的佔用率
VSZ 虛擬內存,在進程啓用完畢後會釋放歸0
RSS 佔用物理內存的大小(常駐內存)
TTY 顯示了該進程在哪個終端上運行,是在本地終端還是在遠程終端。“?”表示未知或者不需要終端
STAT 進程狀態,S代表休眠,R代表運行,Z代表僵死,s代表父進程,<代表高優先級,N代表低優先級,+代表前臺進程,l代表多線程;對於僵死進程需要及時手動關閉終止
TIME 表示啓動該進程的已運行時間
COMMAND 表示啓動該進程的命令的所處位置

2.3 ps elf命令

  • 查看靜態的進程統計信息
[root@localhost ~]# ps -fle
[root@localhost ~]# ps -fle
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 32053 ep_pol 10:43 ?        00:00:01 /usr/lib/systemd/sy
1 S root          2      0  0  80   0 -     0 kthrea 10:43 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 10:43 ?        00:00:00 [ksoftirqd/0]
1 S root          5      2  0  60 -20 -     0 worker 10:43 ?        00:00:00 [kworker/0:0H]
1 S root          6      2  0  80   0 -     0 worker 10:43 ?        00:00:00 [kworker/u256:0]
1 S root          7      2  0 -40   - -     0 smpboo 10:43 ?        00:00:00 [migration/0]
1 S root          8      2  0  80   0 -     0 rcu_gp 10:43 ?        00:00:00 [rcu_bh]
1 R root          9      2  0  80   0 -     0 -      10:43 ?        00:00:00 [rcu_sched]
5 S root         10      2  0 -40   - -     0 smpboo 10:43 ?        00:00:00 [watchdog/0]
5 S root         12      2  0  80   0 -     0 devtmp 10:43 ?        00:00:00 [kdevtmpfs]
1 S root         13      2  0  60 -20 -     0 rescue 10:43 ?        00:00:00 [netns]
1 S root         14      2  0  80   0 -     0 watchd 10:43 ?        00:00:00 [khungtaskd]
1 S root         15      2  0  60 -20 -     0 rescue 10:43 ?        00:00:00 [writeback]
1 S root         16      2  0  60 -20 -     0 rescue 10:43 ?        00:00:00 [kintegrityd]
1 S root         17      2  0  60 -20 -     0 rescue 10:43 ?        00:00:00 [bioset]

額外看到PPID,可以詳細瞭解到該子進程的父進程是誰

PRI 用戶態的優先級,可以進行人爲控制的優先級

NI 是nice值(-20~19,值越小優先級越大)

不輸入-,只輸入ps lef得到一下結果

[root@localhost ~]# ps lef
F   UID    PID   PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0   4898   4894  20   0 116100  2808 do_wai Ss   pts/1      0:00 -bash USER=root LOGNAME=r
4     0   5436   4898  20   0 148984  1468 -      R+   pts/1      0:00  \_ ps lef XDG_SESSION_ID
4     0   2386   2379  20   0 116348  2868 n_tty_ Ss+  pts/0      0:00 bash USER=root LANG=zh_CN
4     0   1371   1150  20   0 281984 26360 ep_pol Ssl+ tty1       0:01 /usr/bin/X :0 -background

2.4 結合管道操作

由於系統中運行的進程數量較多,需要查詢某一個進程的信息時可以結合管道操作和grep命令進行過濾

舉例:

[root@localhost ~]# ps aux | grep bash
root        781  0.0  0.0 115308   948 ?        S    10:43   0:00 /bin/bash /usr/sbin/ksmtuned
root       1748  0.0  0.0  51376   584 ?        Ss   10:43   0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root       2386  0.0  0.1 116348  2868 pts/0    Ss+  10:43   0:00 bash
root       4898  0.0  0.1 116100  2808 pts/1    Ss   13:45   0:00 -bash
root       5360  0.0  0.0 112728   968 pts/1    R+   14:18   0:00 grep --color=auto bash
[root@localhost ~]# ps aux | grep "bash$"
root       2386  0.0  0.1 116348  2868 pts/0    Ss+  10:43   0:00 bash
root       4898  0.0  0.1 116100  2808 pts/1    Ss   13:45   0:00 -bash

三 :查看動態進程信息 top

top命令

  • 查看動態的進程排名信息
[root@localhost ~]# top

表格是動態的

理論:linux進程和計劃任務管理

  • tasks 系統任務信息; total 總進程數; running 正在運行的進程數; sleeping 休眠的進程數; stopped 中止的進程數; zombie 僵死無響應的進程數
  • cpu佔用信息(%Cpu(s));us 用戶佔用; sy 內核佔用; ni 優先級調度佔用; id 空閒cpu; wa I/O等待佔用; hi 硬件中斷佔用; si 軟件中斷佔用; st 虛擬化佔用;
  • Kib MEN 內存佔用信息; total 總內存空間; used 已用內存; free 空閒內存;buff/cache 緩衝區域
  • KiB Swap 交換空間佔用; total 總交換空間; used 已用交換空間; free 空閒交換空間; avail Mem 緩存空間

在top查看過程中,可以按c鍵根據cpu佔用情況對進程列表進行排序,按M可以根據MEM內存佔用情況進行排序,按h獲得幫助信息,按q退出top程序,按k就是關閉進程(kill),通常情況下k中會有當前佔用內存最高的pid在其中,默認直接關閉,也可以輸入對應的pid去回車終止對應的進程

動態top查看主要看cpu佔用

四 :查看進程信息 pgrep

pgrep命令

根據特定條件查詢進程PID信息

[root@localhost ~]# pgrep -l "log"
400 xfs-log/dm-0
594 xfs-log/sda1
624 xfs-log/dm-2
688 systemd-logind
707 rsyslogd
715 abrt-watch-log
727 abrt-watch-log
[root@localhost ~]# pgrep  "log"
400
594
624
688
707
715
727
[root@localhost ~]# pgrep -l -U root -t tty1
1371 X

pgrep pid進程的過濾

-l 長格式顯示,即顯示進程名

-U 指定特定用戶,檢索查詢該用戶的進程

-t 指終端(telent ) tty1 代表遠程終端

本地終端登錄時會反饋爲1

五: 查看進程信息 pstree

  • 以樹形結構列出進程信息

-a 顯示完整信息

-u 列出對應用戶名

-p 列出對應PID號

[root@localhost ~]# pstree -aup  '查看所有完整信息和所有用戶以及列出與所有對應PID的進程樹'
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,689
  │   ├─{ModemManager},708
  │   └─{ModemManager},756
  ├─NetworkManager,788 --no-daemon
  │   ├─dhclient,911 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
  │   ├─dhclient,913 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens36.pid -lf...
  │   ├─{NetworkManager},792
  │   └─{NetworkManager},795
  ├─VGAuthService,700 -s
  ├─abrt-watch-log,715 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BUG
  ├─abrt-watch-log,727 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
  ├─abrtd,710 -d -s
  ├─accounts-daemon,694
  │   ├─{accounts-daemon},706
  │   └─{accounts-daemon},757
......//省略部分信息
[root@localhost ~]# pstree -ap root '只查看root用戶的所有完整命令信息和對應的PID的進程數'
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,689
  │   ├─{ModemManager},708
  │   └─{ModemManager},756
  ├─NetworkManager,788 --no-daemon
  │   ├─dhclient,911 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
  │   ├─dhclient,913 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens36.pid -lf...
  │   ├─{NetworkManager},792
  │   └─{NetworkManager},795
  ├─VGAuthService,700 -s
  ├─abrt-watch-log,715 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BUG
  ├─abrt-watch-log,727 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
  ├─abrtd,710 -d -s
  ├─accounts-daemon,694
  │   ├─{accounts-daemon},706
  │   └─{accounts-daemon},757

六 : 進程的啓動方式

6.1 手工啓動

  • 前臺啓動:用戶輸入命令,直接執行程序
  • 後臺啓動;在命令行尾加入“&(讀end)”符號,後臺啓用是爲了防止文件過大會影響正常使用系統,這時就要去後臺啓用
[root@localhost dev]# cp /dev/cdrom mycd.iso&
[1] 6721    '輸出信息中包括後臺任務序號、產生對應的PID號'

6.2 調度啓動(at、crontab)

  1. 使用at命令,設置一次性計劃任務
  2. 使用crontab命令,設置週期性計劃任務

6.3 進程的前後臺調度

  1. Ctrl+Z 組合鍵
  • 將當前進程掛起,即調入後臺並停止執行
  1. jobs 命令
  • 查看處於後臺的進程列表
  1. fg命令
  • 將後臺進程恢復到前臺運行,可通過指定任務序號去選中
  1. bg命令
  • 將後臺中的暫停執行的程序恢復運行,在後臺進行接下來的操作

理論:linux進程和計劃任務管理

因爲要複製的內容容量過大,所以會卡一下

理論:linux進程和計劃任務管理

命令執行完畢就會彈出命令行

爲了解決這個問題,便出現了&

[root@localhost mnt]# cp -r Packages/ /opt/pas  '要執行的操作命令'

^C  'ctrl+c中止命令'
[root@localhost mnt]# cp -r Packages/ /opt/pas &    '後臺運行'
[2] 6970    '顯示序號和進程PID號'
[root@localhost mnt]# jobs  '查看後臺的進程'
[1]+  已停止               cp -i /dev/cdrom mycd.iso(工作目錄:/dev)
[2]-  運行中               cp -i -r Packages/ /opt/pas &
[root@localhost mnt]# jobs -l   '-l可以詳細列出pid號,以此進行管理'
[1]+  6730 停止 (tty 輸入)     cp -i /dev/cdrom mycd.iso(工作目錄:/dev)
[2]-  6970 運行中               cp -i -r Packages/ /opt/pas &
[root@localhost mnt]# cp -rf Packages/ /opt/pa  

^Z  'ctrl+z把前臺運行的命令切換到後臺,被切換到後臺的命令會被停止,如果需要再次讓其運行,需要fg'
[2]+  已停止               cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# fg 2  'fg 序號'
cp -i -rf Packages/ /opt/pa '被切換到前臺繼續運行'
^Z  '再次切換到後臺'
[2]+  已停止               cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# jobs      '再次查看後臺程序'
[1]-  已停止               cp -i /dev/cdrom mycd.iso(工作目錄:/dev)
[2]+  已停止               cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# jobs -l
[1]-  6730 停止 (tty 輸入)     cp -i /dev/cdrom mycd.iso(工作目錄:/dev)
[2]+  7114 停止                  cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# kill -9 6730  '強制殺掉pid爲6730的進程'
[root@localhost mnt]# jobs -l   '查看'
[1]-  6730 已殺死  '被殺死'             cp -i /dev/cdrom mycd.iso(工作目錄:/dev)
[2]+  7114 停止                  cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# kill -9 7114  '依法炮製7114'
[root@localhost mnt]# jobs -l
[2]+  7114 已殺死               cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# fg -2 '再次把後臺序號爲2的進程切換到前臺'
-bash: fg: -2: 無效選項 '反饋無效選項'
fg: 用法:fg [任務聲明]
[root@localhost mnt]# jobs -l   '再次查看'
[root@localhost mnt]#   '都沒了'

七: 終止進程的運行

7.1 Ctrl+c 組合鍵

  • 終端正在執行的命令

7.2 kill、killall 命令

  • kill用於終止指定PID號的進程 kill pid
  • killall用於終止指定名稱的所有進程 killall 進程
  • -9 選項用於強制終止
[root@localhost mnt]# systemctl start httpd '開啓httpd'
[root@localhost mnt]# netstat -ntap | grep 80   '查看80端口'
tcp6       0      0 :::80                   :::*                    LISTEN      7466/httpd          
[root@localhost mnt]# killall -9 httpd  '終止httpd的所有進程'
[root@localhost mnt]# netstat -ntap | grep 80
[root@localhost mnt]# 

7.3 pkill命令

  • 根據特定條件終止相應的進程
  • 常用命令選項
    • -U:根據進程所屬的用戶名終止相應進程
    • -t :根據進程所在的終端終止相應進程
[root@localhost mnt]# pgrep -l -U "lisi"    '檢索用戶-u lisi的進程,並顯示-l pid對應的進程'
7954 gnome-keyring-d
7972 gnome-session-b
7979 dbus-launch
7980 dbus-daemon
8038 gvfsd
8043 gvfsd-fuse
8129 ssh-agent
8148 at-spi-bus-laun
8153 dbus-daemon
8158 at-spi2-registr
8175 gnome-shell
8183 pulseaudio
8190 ibus-daemon
[root@localhost mnt]# pkill -9 -U "lisi"    '強制終止-9 用戶-U lisi的所有進程'
[root@localhost mnt]# 
[root@localhost mnt]# pgrep -l -U "lisi"    '再次檢索lisi,發現什麼都沒有'
[root@localhost mnt]# 
[root@localhost mnt]# which pkill   '查看pkill的命令位置在哪'
/usr/bin/pkill  '在usr下面的bin中,即所有用戶都可以使用'

pkill -9 -U 代表強行註銷用戶

普通用戶不可以踢掉pkill root

八、 計劃任務管理 at、crond

8.1 at命令

  • 一次性計劃任務
[root@localhost mnt]# at [HH:MM] [yyyy-mm-dd]   'at 小時:分鐘 年-月-日'
[root@localhost mnt]# date  '查看當前時間'
2019年 11月 12日 星期二 17:30:57 CST
[root@localhost mnt]# at 17:33 2019-11-12   
at> pgrep -U root | wc -l > /opt/test.txt
at> <EOT>       'ctrl+d,提交任務'
job 1 at Tue Nov 12 17:33:00 2019
[root@localhost mnt]# atq   '查看配置的任務,結果沒有'
[root@localhost mnt]# date      '看眼日期'
2019年 11月 12日 星期二 17:33:59 CST  '過時間了'
[root@localhost mnt]# cat /opt/test.txt
180 '出現結果'

這個命令的時間必須是當前時間之後

date 獲取當前系統時間

at>後面跟在未來的這個時間要執行的命令

eot 就是按ctrl +D鍵提交任務

也可以atq查看 ,查看將要指定的執行任務的列表

案例:在當天的21:30時自動關閉當前系統

[root@localhost mnt]# at 21:30 2019-11-12
at> shutdown -h now     '關閉當前系統'
at> <EOT>
job 2 at Tue Nov 12 21:30:00 2019
[root@localhost mnt]# atq
2   Tue Nov 12 21:30:00 2019 a root
[root@localhost mnt]# atrm 2    '刪除計劃任務2'
[root@localhost mnt]# atq

atrm 刪除 計劃任務

8.2 crontab命令

  • 按照預先設置的時間週期(分時日月周)重複執行用戶指定的命令操作
  • 屬於週期性計劃任務
  • 主要設置文件
    • 全局配置文件,位於文件:/etc/crontab
    • 系統默認的設置,位於目錄:/etc/cron.*/
    • 用戶定義的設置,位於文件:/var/spool/cron/用戶名

8.3 管理cron計劃任務

  • 編輯cron計劃任務
[root@localhost mnt]# crontab -e [-u 用戶名]
  • 查看計劃任務
[root@localhost mnt]# crontab -l [-u 用戶名]
  • 刪除計劃任務
[root@localhost mnt]# crontab -r [-u 用戶名]

e edit,創建計劃任務

-l list 列表

-r 刪除

理論:linux進程和計劃任務管理

8.4 時間數值的特殊表示方法

符號 解釋
* 表示該位置的範圍內所有時間
表示間隔的多個不連續時間點
- 表示一個連續的時間範圍
/n 指定間隔的時間頻率爲n

8.5 應用實例

示例 解釋
0 17 1-5 週一到週五每天17點
30 8 1,3,5 每週一週三週五的8點30分
0 8-18/2 * 每天8點到18點之間每隔兩小時
0 /3 每三天
[root@localhost mnt]# crontab -e

"/tmp/crontab.16EW6c" 1L, 37C   '自動進入這個文件內配置'

'*/2 * * * *     ps aux | wc -l > /ps.txt'  '輸入單引號內的配置' 

:wq             '保存退出'

no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost mnt]# crontab -l    '查看計劃任務'
*/2 * * * * ps aux | wc -l > /ps.txt                     

九、 總結

  • 查看進程的命令(ps、top、pgrep、pstree)
  • 進程控制
    • 啓動進程
    • 調度進程(Ctrl+z組合鍵、jobs、bg、fg)
    • 終止進程(kill、killall、pkill)
  • at命令設置計劃任務
  • crontab計劃任務的配置字段
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章