文章目錄
- 一:程序,進程,線程之間的關係
- 二:查看進程
- 2.1:靜態查看 ps命令
- 2.1.1:ps命令,查看靜態的進程統計信息(Processes Statistic)
- 2.1.2:ps aux命令 以簡單列表的形式顯示出進程信息
- 2.1.3:ps -elf 命令:以長格式顯示系統中的進程信息
- 2.1.4:ps aux | grep "bash"命令
- 2.2:動態查看 top命令
- 2.3:查看進程信息 pgrep 和 pstree
- 三:控制進程
- 四:at一次性任務設置
- 五:crontab週期性任務設置
- 六.管理進程及計劃任務實驗
前言
詳細瞭解系統中運行的各種程序信息,關閉失去響應的進程,以及在指定時間自動執行任務。搞定操作方法。
看了本篇,你將學會以下知識點
一:程序,進程,線程之間的關係
1.1:進程概述
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
1.2:應用程序,進程和線程的關係
舉例:以一個工廠結構舉例
應用程序=工廠
進程=車間
線程=工人
高併發處理==>依賴於多線程操作
1.2.1:程序和進程的關係
程序
保存在硬盤,光盤等介質中的可執行代碼和數據
靜態保存的代碼
進程
在CPU及內存中運行的程序代碼
動態執行的代碼
父.子進程:每個進程可以創建一個或多個進程,是一個依賴關係。
1.2.2:進程和線程的關係
進程和線程都是由操作系統的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性
一個程序至少有一個進程,一個進程至少有一個線程
線程的劃分尺度小於進程,所以多線程程序的併發性高
進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大的提高了程序的運行效率
線程在執行過程中與進程存在區別
每個獨立的線程有一個程序運行的入口,順序執行序列和程序的出口
但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行
但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配
這就是進程和線程的重要區別
進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位,線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧)但是它可以與同屬一個進程的其他線程共享進程所擁有的全部資源
一個線程可以創建和撤銷另一個線程
同一個進程中的多個線程之間可以併發執行
二:查看進程
2.1:靜態查看 ps命令
2.1.1:ps命令,查看靜態的進程統計信息(Processes Statistic)
ps命令是Linux系統中最爲常用的進程查看工具,主要用於顯示包含當前運行的各進程完整信息的靜態快照
ps命令基本格式
ps [選項] 注意:有一些選項時不帶“-”前綴的(添加“-”前綴後含義可能會有出入)
a 顯示當前終端下的所有進程信息,包括其他用戶的進程、與“x”選項結合時將顯示系統中所有的進程信息
u 使用以用戶爲主的格式輸出進程信息
x 顯示當前用戶在所有終端下的進程信息
-e 顯示系統內的所有進程信息
-l 使用長(Long)格式顯示進程信息
-f 使用完整的(Full)格式顯示進程信息
執行不帶任何選項的ps命令時,將只顯示當前用戶會話中打開的進程
[root@localhost ~]# ps
PID TTY TIME CMD
2711 pts/0 00:00:00 bash
2946 pts/0 00:00:00 ps
2.1.2:ps aux命令 以簡單列表的形式顯示出進程信息
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.3 193700 6836 ? Ss 22:38 0:01 /usr/lib/systemd/syst
root 2 0.0 0.0 0 0 ? S 22:38 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 22:38 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S 22:38 0:00 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S< 22:38 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 22:38 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 22:38 0:00 [rcu_bh]
..以下省略部分內容
上述輸出信息中,每一列稱爲字段或者列或者屬性
上述輸出信息中,第一行爲列表標題,其中個字段的含義如下
USER: 啓動該進程的用戶賬號信息
PID: 該進程在系統中的數字ID號,在當前系統中是唯一的
%CPU:CPU佔用的百分比
%MEN:內存佔用的百分比
VSZ:佔用虛擬內存(SWAP)的大小
RSS:佔用常駐內存(物理內存)的大小
TTY: 表明該進程在哪個終端上運行。“?”表示未知或者不需要終端
SATA: 顯示了進程當前的狀態,如S(休眠),R(運行),Z(僵死),<(高優先級),N(低優先級),s(父進程),+(前臺進程),l(多線性進程),D(不可休眠進程)對處於僵死狀態的進程應該予以手動終止
START: 啓動該進程的時間
TIME: 該進程佔用CPU時間
COMMAND: 啓動該進程的命令的名稱
2.1.3:ps -elf 命令:以長格式顯示系統中的進程信息
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32041 ep_pol 23:04 ? 00:00:00 /usr/l
1 S root 2 0 0 80 0 - 0 kthrea 23:04 ? 00:00:00 [kthre
1 S root 3 2 0 80 0 - 0 smpboo 23:04 ? 00:00:00 [ksoft
1 S root 4 2 0 80 0 - 0 worker 23:04 ? 00:00:00 [kwork
1 S root 5 2 0 60 -20 - 0 worker 23:04 ? 00:00:00 [kwork
1 S root 6 2 0 80 0 - 0 worker 23:04 ? 00:00:00 [kwork
1 S root 7 2 0 -40 - - 0 smpboo 23:04 ? 00:00:00 [migra
1 S root 8 2 0 80 0 - 0 rcu_gp 23:04 ? 00:00:00 [rcu_b
1 R root 9 2 0 80 0 - 0 - 23:04 ? 00:00:00 [rcu_s
..此處省略部分信息
PPID:表示對應進程的父進程的PID號
PRI:用戶態優先級(人爲)
NI: nice值,內核態優先級,取值範圍(-20~19),值越小,優先級越高
ADDR:若是 - ,代表正在運行
SZ:在swap交換分區的容量
WCHAN:當前進程在內核中的名稱
STIME:啓動時間
2.1.4:ps aux | grep "bash"命令
由於系統中運行的進程數量較多,需要查詢某一個進程的信息時可以結合管道操作和grep命令進行過濾。
此命令可以過濾出包含“bash”的進程信息
[root@localhost ~]# ps aux | grep "bash"
root 655 0.0 0.0 115256 924 ? S 23:04 0:00 /bin/bash /usr/sbin/ksmtuned
root 1791 0.0 0.0 51332 580 ? Ss 23:05 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 2422 0.0 0.1 116300 2864 pts/0 Ss+ 23:05 0:00 bash
root 2482 0.0 0.1 116044 2776 pts/1 Ss 23:06 0:00 -bash
root 2536 0.0 0.0 112680 984 pts/1 S+ 23:07 0:00 grep --color=auto bash
2.2:動態查看 top命令
使用ps命令查看到的是一個靜態的進程信息,並不能連續的反饋出當前進程的運行狀態
top命令將會在當前終端以全屏交互式的界面顯示進程排名,及時跟蹤包括CPU,內存等系統資源佔用情況
默認情況下每三秒刷新一次
作用類似於Windows系統中的任務管理器
2.2.1:top 命令
top - 23:17:10 up 12 min, 3 users, load average: 0.00, 0.04, 0.06
Tasks: 185 total, 1 running, 184 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867024 total, 670880 free, 669584 used, 526560 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 986308 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1833 root 20 0 1624108 168500 51624 S 0.0 9.0 0:02.26 gnome-shell
1983 root 20 0 1100816 63532 20704 S 0.0 3.4 0:00.10 evolution-cal+
2083 root 20 0 1202856 59344 19216 S 0.0 3.2 0:00.08 evolution-cal+
2040 root 20 0 1040248 59132 19108 S 0.0 3.2 0:00.06 evolution-cal+
1994 root 20 0 884268 32724 14160 S 0.0 1.8 0:00.31 gnome-software
1392 root 20 0 288368 30804 10276 S 0.0 1.6 0:00.40 X
1965 root 20 0 1026108 30296 18916 S 0.0 1.6 0:00.20 nautilus-desk+
操作選項
M:以內存大小排序
c:以CPU佔用排序
h:top程序在線幫助信息
q:退出
上述輸出信息中,開頭的部分顯示了系統任務(Tasks),CPU佔用,內存佔用(Mem),交換空間(Swap)等彙總信息,彙總信息下方依次顯示當前進程的排名情況。相關信息含義如下
1.系統任務(Tasks)信息:total,總進程數;running,正在運行的進程數;sleeping。休眠的進程數;stopped,中止的進程數;zombie,僵死無響應的進程數
2.CUP佔用信息:us,用戶佔用;sy,內核佔用;ni,優先級調度佔用;id,空閒CPU;wa,I/O等待佔用;hi,硬件中斷佔用;si,軟件中斷佔用;st,虛擬化佔用。要了解空閒的CPU百分比,主要是看%id部分
3.內存佔用(Mem)信息:total,總內存空間;used,已用內存空間;free,空閒內存空間;buffers,緩存區域
4.交換空間(Swap)佔用:total,總交換空間;used,已用交換空間;free,空閒交換空間;cached,緩存空間
2.3:查看進程信息 pgrep 和 pstree
2.3.1:pgrep命令
當使用ps命令查詢某個進程的PID信息時,往往需要結合grep命令對輸出結果進行過濾,很不方便
pgrep命令正是用來查詢特定進程信息的專用工具
pgrep命令可以根據進程的名稱,運行該進程的用戶,進程所在的終端等多重屬性查詢特定進程的PID號
通過pgrep命令可以指定進程的一部分名稱進行查詢,結合“-l"選項可以同時輸出對應的進程名
“-l”選項顯示進程名
[root@localhost ~]# pgrep -l "log" '//查詢進程名中包含“log”的進程及其PID號'
282 xfs-log/sda2
444 xfs-log/sda5
445 xfs-log/sda1
555 systemd-logind
561 abrt-watch-log
580 abrt-watch-log
597 rsyslogd
640 mcelog
結合“-U”選項查詢特定用戶的進程
“-t”選項查詢在特定終端運行的進程
tty=0 遠程終端登錄
tty=1 本地終端登錄
[root@localhost ~]# pgrep -l -U lisi tty 1 '//查詢在1終端的lisi 用戶的進程'
27483 bash
27584 vim
2.3.2:pstree命令
pstree命令以屬性結構列出進程信息,可以更直觀的判斷各進程的相互關係(父,子進程)
pstree命令默認情況下只顯示各進程的名稱
“-p”選項,列出對應的PID號
“-u”選項,列出對應的用戶名
“-a”選項,列出完整的命令信息
[root@localhost ~]# pstree -aup '//查看當前系統的進程樹(包括各進程對應的PID號,用戶名,完整命令等信息)'
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,601
│ ├─{ModemManager},631
│ └─{ModemManager},635
├─NetworkManager,667 --no-daemon
│ ├─dhclient,791 -d -q -sf /usr/libexec/nm-dhcp-helper -pf...
│ ├─{NetworkManager},676
│ └─{NetworkManager},678
..省略部分信息
[root@localhost ~]# pstree -ap lisi ‘//查看用戶lisi打開的進程及子進程的樹結構’
Windows系統開啓後讀取SAM文件
Linux系統開機後讀取passwd和shadow文件,隨後讀取/bin/bash 、/sbin/nologin文件
三:控制進程
3.1:啓動進程
Linux系統中可以
用戶手工啓動進程
按預定計劃調度啓動新的進程
3.1.1:手工啓動
進程在前臺運行時,用戶必須等到該進程執行結束並退出後才能繼續輸入其他命令。運行耗時較長的操作可進入後臺運行,進程在後臺運行時,用戶可以繼續在當前終端輸入其他命令,無需等待該進程結束。
前臺啓動:用戶輸入命令,直接執行程序
後臺啓動:在命令末尾加入“&”符號
[root@localhost ~]# cp /dev/cdrom mycd.iso& '//在後臺運行復制鏡像文件進程'
[1] 3227 '//輸出信息中心包括後臺任務序號,PID號'
3.1.2:調度啓動
有些任務非常費時,適合在相對空閒的時間進行,我們便可以使用調度安排啓動
at命令,設置一次性計劃任務(如 12:30重啓網絡服務)
crontab,命令,設置週期性計劃任務(如 每週六18:00 備份數據庫)
3.2:改變進程的運行方式
3.2.1:掛起當前進程 Ctrl+Z 組合鍵
將當前進程掛起,即調入後臺並停止執行(對於速度緩慢,會耽誤其他操作的進程使用)
3.2.2:查看後臺進程 jobs 命令
查看處於後臺的任務列表。
結合“-l”選項可以同時顯示出該進程對應的PID號
輸出結果中,每一行記錄對應一個後臺進程的狀態信息,行首的數字代表該進程在後臺的任務編號。
若當前終端沒有後臺進程,將不會顯示任何信息
3.2.3:將後臺的進程恢復運行 fg 命令
將後臺進程恢復到前臺運行,可以指定任務序號
bg(BackGround)命令可以將後臺中暫停執行的任務恢復運行,繼續在後臺執行操作
fg(ForeGround)命令可以將後臺任務恢復到前臺運行
除非後臺任務只有一個,否則bg和fg命令都需要指定後臺進程的任務編號作爲參數
3.3:終止進程執行
平常可以使用Ctrl + C組合鍵強制中斷
Ctrl + C組合鍵無法中止後,可以使用專門的進程中止工具 kill,killall,pkill
3.3.1:使用kill命令終止進程
kill命令需要使用進程的PID號作爲參數
若進程無法響應,可結合“-9”選項強行中止進程。強行中止進程可能會到時部分數據丟失,謹慎使用
3.3.2:使用killall命令終止進程
killall命令通過進程名來中止進程,可終止指定名稱所有進程(可理解爲終止進程樹)
killall命令同樣有“-9”選項,強制終止進程
3.3.3:使用pkill命令終止進程
根據特定條件終止相應的進程
常用命令選項:
-U:根據進程所屬的用戶名終止相應的進程
-t:根據進程所在的終端終止相應的進程
管理員可以pkill 普通用戶踢下線
普通用戶不可以pkill管理員
[root@localhost ~]#pkill -9 -U “lisi”
四:at一次性任務設置
CentOS7系統中的計劃任務是由at,cronie軟件包提供,通過atd和crond這兩個系統服務實現一次性,週期性的計劃任務功能,並分別通過at,crontab命令進行計劃任務設置
開啓系統服務atd是at命令設置的計劃任務的前提條件
4.1:at命令基本格式
at [HH:MM] [yyyy-mm-dd] ‘//at 時:分 年-月-日’
1
4.2:at命令使用順序
查看時間–>設置時間–>輸入命令–>Ctrl + D提交任務
date:查看當前時間。設置任務,時間不可在當前時間之前
命令輸入完成後按 Ctrl + D組合鍵提交任務即可
[root@localhost ~]# date '//查看當前時間'
2019年 11月 13日 星期三 00:45:58 CST
[root@localhost ~]# at 00:48 2019-11-13 '//設置任務執行時間'
at> pgrep -U root |wc -l > /tmp/ps.root '//輸入命令(統計該時間點系統中由root用戶運行的進程數量,並將數值保存到/tmp/ps.root文件中)'
at> <EOT> '//按Ctrl + D組合鍵提交任務'
job 1 at Wed Nov 13 00:48:00 2019
[root@localhost ~]# cat /tmp/ps.root '//查看任務完成情況'
175
4.3:atq 命令,查看待執行任務的列表
對於已經設置,但並未執行的任務,可通過atq命令查看。(已經執行的任務不會出現)
atq查看的任務列表,每個任務的序號不會變動,即便1-5個序號任務已經執行完畢,顯示出的第六個未執行任務的序號也是6,而不會變成1。
4.4:atrm 命令,刪除指定編號的at任務
atrm命令用來刪除指定編號的at任務,編號可以通過atq查看。
刪除後的at任務不會出現在atq顯示結果中。
五:crontab週期性任務設置
crontab(定時任務)
使用crontab命令設置的計劃任務可以按預設的週期重複執行,可以大大減輕重複性系統管理任務的操作
軟件包cronie 提供crontab工具,系統服務crond和配置文件 /etc/crontab。
開啓系統服務crond 是啓動週期性任務的前提條件
5.1:crontab的配置文件和目錄
crond通過多個目錄和文件設置計劃任務,不同類型的任務由不同的配置文件來配置
5.1.1: /etc/crontab 全局配置文件
全局配置文件
/etc/crontab 文件中設置的是維護Linux系統所需的任務
Linux系統及相關程序在安裝時自動設置
不建議用戶手動修改此文件
[root@localhost ~]# cat /etc/crontab '//查看系統任務配置文件'
SHELL=/bin/bash '//設置執行計劃任務的Shell環境'
PATH=/sbin:/bin:/usr/sbin:/usr/bin '//定義可執行命令及程序的路徑'
MAILTO=root '//將任務輸出信息發送到指定用戶的郵箱'
HOME=/ '//執行計劃任務時使用的主目錄'
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59) '//分鐘範圍:0-59'
# | .------------- hour (0 - 23) '//小時範圍:0-23'
# | | .---------- day of month (1 - 31) '//一個月的天數範圍:1-31'
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... '//月數範圍:1-12'
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat '//一週的天數範圍: 0-6(週日用0或者7表示)'
# | | | | |
# * * * * * user-name command to be executed
5.1.2:/etc/cron.*/ 系統默認設置
系統默認設置cron任務的配置文件存放目錄
軟件包crontabs安裝後,會在/etc/cron.*/目錄下生成存放一些系統默認設置的計劃任務目錄,設置了系統每個小時,每一天做些什麼任務
例如:
/etc/cron.hourly/ 目錄下存放的是系統每小時要做的任務可執行腳本
/etc/cron.daily/ 目錄下存放的是系統每天要做的任務可執行腳本
/etc/cron.weekly/ 目錄下存放的是系統每週要做的任務可執行腳本
/etc/cron.monthly/ 目錄下存放的是系統每月要做的任務可執行腳本
這些是可執行腳本,不是cron配置文件,crond服務通過run-parts 工具調用執行這些腳本
5.1.3:/var/spool/cron/用戶名 用戶定義的位置
用戶自行設置的cron計劃任務將被保存到目錄/var/spool/cron/中
用戶使用crontab命令創建計劃任務,就會在/var/spool/cron/目錄下生產一個與用戶名相同的文件
例如:root用戶的cron計劃任務保存在配置文件/var/spool/cron/root中
[root@localhost ~]# ls -l /var/spool/cron/*
ls: 無法訪問/var/spool/cron/*: 沒有那個文件或目錄 '//沒有創建任務'
crond守護進程會自動檢查上述三個文件,若有配置更改,就會載入內存,不需重啓crond守護進程就可以使設置生效
5.2:使用crontab命令管理用戶的計劃任務
☆☆☆分時日月周的取值範圍和命令的說明
命令格式: 時間週期設置 + 任務內容設置
“分鐘”字段應該填寫一個具體的時間數值,不可是“*”,否則將會每一分鐘都執行一次任務
實例
如:每天15:30將/home/中zhangsan目錄複製到/opt/中
[root@localhost ~]# crontab -e '//編輯計劃任務'
進入編輯列表開始編輯,操作類似vim 編輯器
30 15 * * * /usr/bin/cp -r /home/zhangsan /opt/ '//在其中編輯好任務,wq保存退出'
常用選項
crontab -e [-u 用戶名] '//編輯計劃任務 e:edit,編輯,使用方式同Vim編輯器。'
crontab -l [-u 用戶名] '//查看計劃任務 l:list,列表'
crontab -r [-u 用戶名] '//刪除計劃任務 r:remove,移除'
crontab -l '//查看當前用戶的計劃列表'
crontab -l -u lisi '//查看lisi用戶的計劃任務'
crontab -e '//可以操作刪除一條計劃任務'
crontab -r '//刪除用戶所有的計劃任務'
六.管理進程及計劃任務實驗
管理系統中的進程
1. 使用kill命令終止postfix服務的運行
2. 查找系統中CPU佔用率超過80%的進程,並強行終止該進程
這裏用tom用戶下的一個下載進程進行模擬
3.設置計劃運行的系統管理任務
◆每週一早上7:50自動清空FTP服務器"/var/ftp/pub" 中數據
◆每天晚上的10:30自動執行任務,完成以下操作
◆顯示當前的系統時間並查看已掛載磁盤分區的磁盤使用情況
◆將輸出結果追加到文件/arlog/df.log中,持續觀察硬盤空間變化
◆確認所設置的計劃任務列表