目錄
一、查看進程
1.1、程序和進程的關系
1.2、查看進程
1.2.1、靜態查看進程信息ps
?編輯
1.2.1.1、實驗
?1.2.2、動態查看進程信息top
1.2.2.1、實驗
?1.2.2.2、top 命令全屏操作界面快捷鍵
?1.2.3、pgrep根據特定條件查詢進程pid信息
1.2.4、pstree命令以樹形結構列出進程信息
二、控制進程
2.1、進程的啟動方式
2.2、進程的前后臺調度
2.2.1、掛起當前的進程
2.2.2、jobs命令查看處于后臺的任務列表
2.2.3、fg、bg命令將后臺的進程恢復運行
2.3、終止進程執行
2.3.1、使用 kill 命令終止進程
2.3.2、使用 killall 命令終止進程
2.3.3、使用 pkill 命令終止進程
三、at一次性任務設置
?3.1、實驗
3.2、查詢計劃和刪除計劃
四、crontab周期性任務設置
4.1、管理crontab計劃任務
4.1.1、-e編輯內容格式
4.2、時間數值的特殊表示方法
4.3、實驗
一、查看進程
1.1、程序和進程的關系
程序
- 保存在硬盤,光盤等介質中的可執行代碼和數據
- 靜態保存的代碼
進程
- 在cpu及內存中運行的程序代碼
- 動態執行的代碼
- 父,子進程:每個程序可以創建一個或多個進程
1.2、查看進程
1.2.1、靜態查看進程信息ps
ps? ? 參數
常用的參數
- -a:顯示當前終端下的所有進程信息,包括其他用戶的進程。與“x”選項結合時將顯示系統中所有的進程信息。
- -u:使用以用戶為主的格式輸出進程信息。
- -x:顯示當前用戶在所有終端下的進程信息。
- -e:顯示系統內的所有進程信息。
- -l:使用長格式顯示進程信息。
- -f:使用完整的格式顯示進程信息。
常用的選項組合
ps? ? -aux ? ? ? ?#將以簡單列表的形式顯示出進程信
ps? ? ?-elf ? ? ? ?#將以長格式顯示系統中的進程信息
?
字段 | 描述 |
---|---|
USER | 啟動該進程的用戶賬號的名稱 |
PID | 該進程在系統中的唯一數字ID號 |
%CPU | CPU占用的百分比 |
%MEM | 內存占用的百分比 |
VSZ | 虛擬內存使用量(KB) |
RSS | 物理內存使用量(KB) |
TTY | 進程運行的終端。非終端啟動的進程顯示為?? pts: 遠程登錄終端,tty1-tty6: 本地終端(可能包括圖像界面和字符界面),?: 系統自身執行的進程 |
STAT | 進程狀態:D: 不可中斷的休眠狀態R: 運行狀態S: 休眠狀態T: 停止狀態Z: 僵尸進程 其他狀態如 |
START | 啟動該進程的時間 |
TIME | 該進程占用的CPU時間 |
COMMAND | 啟動該進程的命令的名稱 |
?STAT補充
狀態代碼 | 描述 |
---|---|
D | 不可中斷的休眠狀態。通常用于等待I/O操作完成。這并不意味著它是系統守護進程,但守護進程可能會處于此狀態。 |
R | 運行狀態。進程正在運行或準備運行。 |
S | 休眠狀態。進程在等待某個條件成立以便繼續執行。 |
T | 停止狀態。進程收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信號后停止執行。 |
Z | 僵尸狀態。進程已經終止,但父進程尚未回收其資源。 |
< | 進程運行在高優先級上(這個符號通常不直接出現在STAT列中,而是可能作為其他信息的一部分)。 |
N | 進程運行在正常優先級上(這個符號通常不直接出現在STAT列中,而是可能作為其他信息的一部分)。 |
L | 進程有頁面鎖定在內存中(這個狀態代碼可能不直接出現在STAT列中,而是作為進程屬性的一部分)。 |
s | 進程是控制終端的會話領導(session leader)。 |
l | 進程是多線程的(這個狀態代碼可能不直接出現在STAT列中,而是作為進程屬性的一部分)。 |
+ | 進程在前臺運行(這個狀態代碼可能不直接出現在STAT列中,而是作為進程狀態的一部分)。 |
列名 | 解釋 |
---|---|
F | 內核分配給進程的系統標記 |
S | 進程的狀態 |
UID | 啟動這些進程的用戶 |
PID | 進程的進程ID |
PPID | 父進程的進程號(如果該進程是由另一個進程啟動的) |
C | 進程生命周期中的CPU利用率 |
PRI | 進程的優先級(越大的數字代表越低的優先級) |
NI | 謙讓度值用來參與決定優先級 |
ADDR | 進程的內存地址 |
SZ | 假如進程被換出,所需交換空間的大致大小 |
WCHAN | 若該進程在睡眠,則顯示睡眠中的系統函數名 |
STIME | 進程啟動時的系統時間 |
TTY | 進程啟動時的終端設備(pts/0-255代表虛擬終端,tty1-tty7代表本地控制臺終端) |
TIME | 運行進程需要的累計CPU時間 |
CMD | 進程的啟動命令 |
狀態 | 描述 |
---|---|
D | 不可被喚醒的睡眠狀態,通常用于 I/O 情況 |
R | 該進程正在運行 |
S | 該進程處于睡眠狀態,可被喚醒 |
T | 停止狀態,可能是在后臺暫停或進程處于除錯狀態 |
W | 內存交互狀態(從 2.6 內核開始無效) |
X | 死掉的進程(應該不會出現) |
Z | 僵尸進程。進程已經中止,但是部分程序還在內存當中 |
< | 高優先級(以下狀態在 BSD 格式中出現) |
N | 低優先級 |
L | 被鎖入內存 |
s | 包含子進程 |
l | 多線程(小寫 L) |
+ | 位于后臺 |
C | 進程占用CPU的百分比 |
1.2.1.1、實驗
在終端A執行 編寫vim? a.txt
打開另一個終端B
ps -aux |grep a.txt
S 表示睡眠狀態, + 表示前臺
這個終端A上 按下: ctrl+z 停止
再次查看狀態
查看狀態 T 表示停止狀態
擴展:
ctrl? -? ?c 是發送 SIGINT 信號,終止一個進程
ctrl? -? ?z 是發送 SIGSTOP 信號,掛起一個進程。將作業放置到后臺(暫停)
ctrl? -? ?d 不是發送信號,而是表示一個特殊的二進制值,表示 EOF。代表輸入完成或者注銷
?
?1.2.2、動態查看進程信息top
top? ?命令
類別 | 描述 |
---|---|
系統任務(Tasks) | |
total | 總進程數 |
running | 正在運行的進程數 |
sleeping | 休眠的進程數 |
stopped | 中止的進程數 |
zombie | 僵死無響應的進程數 |
CPU 占用 | |
us | 用戶占用 |
sy | 內核占用 |
ni | 優先級調度占用 |
id | 空閑CPU(百分比) |
wa | I/O 等待占用 |
hi | 硬件中斷占用 |
si | 軟件中斷占用 |
st | 虛擬化占用 |
內存占用(Mem) | |
total | 總內存空間 |
free | 空閑內存 |
used | 已用內存 |
buff/cache | 物理內存和交換內存的緩沖區總和 |
avail Mem | 考慮buff/cache后可用的物理內存 |
交換空間(Swap) | |
total | 總交換空間 |
free | 空閑交換空間 |
used | 已用交換空間 |
avail Mem | 注意:這里的avail Mem與內存占用中的avail Mem意義不同,如果表示Swap的可用空間,則無需此列 |
下面白色那排擴展
USER | 進程所有者的用戶名 |
PR | 優先級(由內核動態調整) |
NI | nice 值(進程優先級)。負值表示高優先級,正值表示低優先級 |
VIRT | 虛擬內存使用量(VSZ) |
RES | 常駐內存使用量(RSS) |
SHR | 共享內存大小(kb) |
S | 進程狀態(D=不可中斷的睡眠,R=運行/可運行,S=睡眠,T=已跟蹤/已停止,Z=僵停) |
%CPU | CPU 時間占用百分比 |
%MEM | 使用的物理內存百分比 |
TIME+ | 使用的 CPU 時間總計(單位:1/100 秒) |
COMMAND | 命令名/命令行 |
1.2.2.1、實驗
當我運行I/O的時候,wa占用
dd if=/dev/zero of=/mnt/a.txt count=19 bs=100M
又恢復成
?1.2.2.2、top 命令全屏操作界面快捷鍵
默認 3s 刷新一次,按 s 修改刷新時間按空格 :立即刷新。
P:按 CPU 排序
M:按內存排序
T:按時間排序
p: 進程 IP,查看某個進程狀態
N 鍵根據啟動時間進行排序
數字鍵 1:顯示每個內核的 CPU 使用率
u/U:指定顯示的用戶
h:可以獲得 top 程序的在線幫助信息
q:鍵可以正常地退出 top 程序
注:若通過 top 排名工具發現某個進程 CPU 占用率非常高,需要終止該進程的運行,可以在 top 操作界面中按 k 鍵,然后在列表上方將會出現“PID to signal/kill [default pid = 3180]:” 的提示信息,根據需要輸入指定進程的 PID 號并按 Enter 鍵, 出現“Send pid 輸入的能夠ID? signal [15/sigterm]”的二次確認的提示信息,然后按Enter 鍵確認即可終止對應的進程。
?1.2.3、pgrep根據特定條件查詢進程pid信息
pgrep? -參數
常用的參數
- -l:選項可同時輸出對應的進程名以及PID
- -U:選項查詢特定用戶的進程
- -t:選項查詢在特定終端運行的進程?
1.2.4、pstree命令以樹形結構列出進程信息
結合以下常用的參數使用:
- -p:選項使用時可以同時列出對應的PID號
- -u:選項可以列出對應的用戶名
- -a:選項可以列出完整的命令信息
執行如下的“pstree -aup”命令可以查看當前系統的進程樹,包括各進程對應的PID 號、用戶名、完整命令等信息。從輸出結果中可以看出,systemd 進程確實是 Linux 操作系統中所有進程的“始祖”。
二、控制進程
2.1、進程的啟動方式
手工啟動
- 前臺啟動:用戶輸入命令,直接執行程序
- 后臺啟動:在命令行尾加入"&"符號
例如,當使 ? 用 cp 命令從光盤中制作鏡像文件時,由于需要復制的數據較多,耗時較長,因此可結合“&” 符號將復制操作放到后臺運行,以便用戶可以繼續執行其他命令操作。
輸出信息中包括后:臺任務序號【1】,pid號 35489
調度啟動
在服務器維護工作中,經常需要執行一些比較費時而且較占用資源的任務(如數據備份),這些任務更適合在相對空閑的時候(如夜間)進行。這時就需要用戶事先進行調度安排,指定任務運行的時間,當系統到達設定時間時會自動啟動并完成指定的任務。調度啟動的計劃 任務進程均在后臺運行,不會占用用戶的命令終端。
進程的調度啟動可以通過 at、crontab 命令進行設置,其中 at 命令用于設置一次性(如12:15 時重啟網絡服務)計劃任務,crontab 命令用于設置周期性運行(如每周五 17:30 備份數據庫)的計劃任務。
2.2、進程的前后臺調度
2.2.1、掛起當前的進程
當Linux操作系統中的命令正在前臺執行時(運行尚未結束),按Ctrl+Z組合鍵可以將當前進程掛起(調入后臺并停止執行),這種操作在需要暫停當前進程并進行其他操作時特別有用。例如,打包usr并且調入后臺 ,可以按 Ctrl+Z 組合鍵將該下載任務調入后臺并暫停執行
tar czvf? usr.tar.gz /usr
2.2.2、jobs命令查看處于后臺的任務列表
常用的參數
-l:選項可以同時顯示該進程對應的PID號
jobs -l??
查看處于后臺的任務列表
2.2.3、fg、bg命令將后臺的進程恢復運行
使用 bg(BackGround,后臺)命令,可以將后臺中暫停執行(如按 Ctrl+Z 組合鍵掛起)的任務恢復運行,繼續在后臺執行操作;(注意就不能再停止了)
使用 fg 命令(ForeGround,前臺),可以將后臺任務重新恢復到前臺運行。
除非后臺中的任務只有一個,否則 bg 和 fg 命令都需要指定后臺進程的任務編號作為參數。
2.3、終止進程執行
當用戶在前臺執行某個進程時,可以按Ctrl+C組合鍵強制進行中斷(如命令長時間沒有響應的情況下)。
中斷前臺進程的運行后,系統將返回命令行提示符狀態等待用戶輸入新的命令。
當按 Ctrl+C 組合鍵無法終止程序或者需要結束在其他終端或后臺運行的進程時, 可以使用專用的進程終止工具 kill、killall 和 pkill。
2.3.1、使用 kill 命令終止進程
通過 kill 命令終止進程時,需要使用進程的 PID 號作為參數。無特定選項時,kill 命令將給該進程發送終止信號并正常退出運行,若該進程已經無法響應終止信號,則可以結合“-9” ? ?選項強行終止進程。強制終止進程時可能會導致程序運行的部分數據丟失,因此不到不得已時不要輕易使用“-9”選項。(但是一般還是會用)
-3柔和
例如,若vim 服務的 sshd 進程的 PID 號為 93333,則執行“kill 93333”命令后可以將進程 sshd 終止
?開啟一個vim
查詢這個pid?
殺死
終止?
2.3.2、使用 killall 命令終止進程
使用 killall 命令可以通過進程名稱來終止進程,當需要結束系統中多個相同名稱的進程時,使用 killall 命令將更加方便,效率更高。killall 命令同樣也有“-9”選項。例如,執行如下的“killall -9 vim”命令可將所有名為 vim 的進程都強行終止
掛起第 2?個 vim 測試進程
通過進程名終止多個進程
2.3.3、使用 pkill 命令終止進程
使用 pkill 命令可以根據進程的名稱、運行該進程的用戶、進程所在的終端等多種屬性終止特定的進程,大部分選項與 pgrep 命令基本類似,如“-U”(指定用戶)、“-t”(指定終端) 等選項,使用起來非常方便。例如,若要終止由用戶 yc666啟動的進程(包括登錄 Shell),可以執行以下操作。
pgrep –l -U "yc666"?? ?//確認目標進程相關信息56416 bash
pkill -9 -U "yc666"?? ?//強行終止用戶hackli 的進程
pgrep -l -U "yc666"?? ?//確認目標進程已被終止
三、at一次性任務設置
一次性計劃任務
在 Linux 操作系統中,除了用戶即時執行的命令操作以外,還可以配置在指定的時間、指定的日期執行預先計劃的系統管理任務(如定期備份、定期采集監測數據)。CentOS 系統中默認已安裝了 at、cronie 軟件包,通過 atd 和 crond 這兩個系統服務實現一次性、周期性計劃任務的功能,并分別通過 at、crontab 命令進行計劃任務設置
使用at命令設置的計劃任務只在指定的時間點執行一次,前提是對應的系統服務atd必須已經運行。需要注意的是,計劃執行任務的時間、日期必須安排在當前系統的時刻之后, ? 否則將無法正確設置計劃任務。
設置一次性計劃任務時,在 at 命令行中依次指定計劃執行任務的時間、日期作為參數(若只指定時間則表示當天的該時間,若只指定日期則表示該日期的當前時間),確認后將進入帶“at>”提示符的任務編輯界面,每行設置一條執行命令,可以依次設置多條語句,最后按 Ctrl+D 組合鍵提交任務。所設置的命令操作將在計劃的時間點被依次執行。
格式
at ?[HH:MM] ?[yyyy-mm-dd]
任務設置完畢后按Ctrl+D 組合鍵提交
如果錯誤,修改用ctrl+刪除修改內容
?3.1、實驗
以下操作將設置一條計劃任務,在當天的 21:30 自動關閉當前系統。
?
3.2、查詢計劃和刪除計劃
可以通過 atq 命令進行查詢
?用atrm +任務號? 刪除
四、crontab周期性任務設置
crontab命令
按照預先設置的時間周期 (分鐘,小時,天。.....)重復執行用戶指定的命令操作,屬于周期性計劃任務。
/etc/crontab 文件中設置的是維護 Linux 操作系統所需的任務,Linux 操作系統及相關程序在安裝時可自動設置,不建議用戶手動修改此文件。
該文件中包括設置 Shell 環境、可執行路徑等變量的操作,以及每小時、每天、每周、每月需要執行的任務目錄。執行如下的“cat /etc/crontab”命令可以查看/etc/crontab 文件的具體內容。
?
4.1、管理crontab計劃任務
編輯計劃任務
crontab -e【-u用戶名】
查看計劃任務
crontab -i【u用戶名】
刪除計劃任務
crontab -r【-u用戶名】
crontab -u 用戶名 #指定XX用戶的cron服務
crontab -l #列出當前用戶下的cron的詳細內容
crontab -u zx -l #列出zx用戶下的cron的詳細內容
crontab -r #刪除所有用戶的cron內容,普通用戶執行,只刪除自己的cron內容
crontab -r -u zx #刪除zx用戶的cron內容
crontab -e #編輯cron服務?
4.1.1、-e編輯內容格式
50? ? ? 3? ? ? ?2? ? 1? ? ? ? *? ? ? ?run command
分鐘 小時 日期 月份 星期? ? 命令
分時日月周
4.2、時間數值的特殊表示方法
- *表示該范圍內的任意時間
- 減號“-”:可以表示一個連續的時間范圍,如“1-4”表示整數 1、2、3、4。
- 逗號“,”:可以表示一個間隔的不連續范圍,如“3, 4, 6, 8”。
- 斜杠符號“/”:可以用來指定間隔頻率,如在日期字段中的“*/3”表示每隔 3 天。
示例
4.3、實驗
普通用戶執行“crontab -e”命令時,可以設置自己的計劃任務(需要注意命令的執行權限)。
例如,用戶 yc666設置一條計劃任務:
在每晚上的 18:36 將/etc/passwd 文件的內容復制到宿主目錄中,保存為 pwd.txt 文件
因各條計劃任務在執行時并不需要用戶登錄,所以任務配置記錄中的命令建議使用絕對路徑,以避免因缺少執行路徑而無法執行命令的情況。另外,在設置非每分都執行的任務時, ? ?“分鐘”字段也應該填寫一個具體的時間數值,而不要保留為默認的“*”,否則將會在每分鐘執行一次計劃任務。
在root下可以-u查看其他人計劃
?補充
crontab -e:編輯的是當前系統用戶作為執行者的的定時任務
conrtab -l:查看當前用戶的定時任務
/etc/cronatab:是系統級別,可以包含所有用戶的定時任務
其他的一些例子
例如,若要按固定的周期重復完成一些系統管理任務,任務內容如下:
①每天早上 7:50自動開啟 sshd 服務,22:50 關閉 sshd 服務;
②每隔五天清空一cron?? ??? ?次 FTP 服務器公共目錄/var/ftp/pub 中的數據;
③每周六的 7:30 重新啟動系統中的 httpd 服務;
④每周一、周三、周五的下午 17:30,使用 tar 命令自動備份/etc/httpd 目錄,則可由 root 用戶通過 crontab 設置以下計劃任務。
例如,若要按固定的周期重復完成一些系統管理任務,任務內容如下:①每天早上 7:50
自動開啟 sshd 服務,22:50 關閉 sshd 服務;②每隔五天清空一cron 次 FTP 服務器公共目錄
/var/ftp/pub 中的數據;③每周六的 7:30 重新啟動系統中的 httpd 服務;④每周一、周三、周五的下午 17:30,使用 tar 命令自動備份/etc/httpd 目錄,則可由 root 用戶通過 crontab 設置以下計劃任務。[root@localhost ~]# crontab -e
50 7 * * * /usr/bin/systemctl start sshd.service
50 22 * * * /usr/bin/systemctl stop sshd.servic
0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/*
30 7 * * 6 /usr/bin/systemctl httpd restart
30 17 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/
*/2 * * * * ls -lh /home/*