Linux 進程管理與計劃任務詳解
一、程序與進程的基本概念
- 程序:保存在外部存儲介質中的可執行機器代碼和數據的靜態集合,是靜態的文件實體
- 進程:在 CPU 及內存中處于動態執行狀態的計算機程序,是程序的動態執行實例
- 關聯關系:每個程序啟動后可創建一個或多個進程,進程隨程序啟動而產生,隨執行結束而消亡
二、進程查看工具
1. ps
:查看靜態進程信息
用于捕捉某一時刻的進程快照,常用選項及功能如下:
選項組合 | 功能描述 |
---|---|
-a | 顯示當前終端下的所有進程(包括其他用戶) |
-u | 以用戶為主的格式輸出進程信息 |
-x | 顯示當前用戶所在終端的進程信息(與-a 結合顯示系統所有進程) |
-e | 顯示系統內所有進程信息 |
-l | 以長格式顯示進程信息 |
-f | 以完整格式顯示進程信息 |
ps輸出字段說明:
字段 | 含義 |
---|---|
USER | 啟動進程的用戶賬號名稱 |
PID | 進程在系統中的唯一數字 ID 號 |
%CPU | CPU 占用百分比 |
%MEM | 內存占用百分比 |
VSZ | 占用虛擬內存(swap 空間)的大小 |
RSS | 占用常駐內存(物理內存)的大小 |
TTY | 進程運行的終端(“?” 表示未知或無需終端) |
STAT | 進程狀態(S 休眠、R 運行、Z 僵死、< 高優先級、N 低優先級等) |
START | 進程啟動時間 |
TIME | 進程占用 CPU 的時間 |
COMMAND | 啟動進程的命令名稱 |
2. top
:查看進程動態信息
實時監控進程資源占用,動態刷新進程狀態(默認 3 秒 / 次),核心信息如下:
(1)系統負載信息
load average
:CPU 平均負載,依次為 1 分鐘、5 分鐘、15 分鐘內的平均值。若 5 分鐘或 15 分鐘負載值超過 CPU 核心數的 2 倍,系統處于高負載狀態
(2)進程狀態統計(task)
狀態 | 含義 |
---|---|
total | 總進程數 |
running | 正在運行的進程數 |
sleeping | 休眠狀態的進程數 |
stopped | 停止狀態的進程數 |
zombie | 僵死狀態的進程數 |
(3)CPU 占用信息(% cpu)
指標 | 含義 |
---|---|
us | 用戶進程占用 CPU 時間的百分比 |
sy | 系統進程占用 CPU 時間的百分比 |
ni | 優先級調整后的用戶進程占用 CPU 百分比 |
id | 空閑 CPU 的百分比 |
wa | I/O 等待占用 CPU 時間的百分比 |
hi | 硬件中斷占用 CPU 時間的百分比 |
si | 軟件中斷占用 CPU 時間的百分比 |
st | 虛擬化環境中被占用的 CPU 時間百分比 |
(4)進程詳細字段(top
輸出)
字段 | 含義 |
---|---|
PID | 進程 ID |
USER | 進程屬主名稱 |
PR | 進程優先級 |
NI | 進程 nice 值(-20~+19,值越小優先級越高) |
VIRT | 占用虛擬內存總量(kb) |
RES | 占用物理內存總量(kb) |
SHR | 與其他進程共享的內存總量(kb) |
S | 進程狀態(D 不可中斷休眠、R 運行、S 休眠、T 停止、Z 僵死) |
%CPU | 進程使用 CPU 的百分比 |
%MEM | 進程使用內存的百分比 |
TIME+ | 進程啟動后占用的 CPU 總時間 |
COMMAND | 啟動進程的命令名稱 |
3. 其他進程查看工具
-
pgrep -l 進程名
:查看某一進程的進程號和名稱(例:pgrep -l systemd
) -
pstree
:查看進程樹形結構,常用選項:
-p
:同時列出對應 PID-u
:列出對應用戶名-a
:列出完整命令信息
三、進程控制方法
1. 手動啟動進程
- 前臺啟動:直接執行命令(如
ls
),進程占用當前終端 - 后臺啟動:命令后加
&
(如route &
),進程在后臺執行,不阻塞終端
2. 進程掛起與恢復
操作 | 命令 / 快捷鍵 | 功能 |
---|---|---|
掛起前臺進程 | Ctrl+Z | 將當前運行的前臺進程調入后臺并停止執行 |
查看后臺進程 | jobs -l | 顯示后臺進程列表(含進程號和狀態) |
恢復后臺進程(后臺運行) | bg 任務號 | 使后臺暫停的進程繼續在后臺執行 |
恢復后臺進程(前臺運行) | fg 任務號 | 將后臺進程調回前臺執行 |
3. 終止進程
命令 | 格式 | 適用場景 |
---|---|---|
kill | kill 進程號 | 正常終止指定 PID 的進程 |
kill -9 | kill -9 進程號 | 強制終止無法正常結束的進程(慎用) |
killall | killall 進程名 | 終止所有同名進程(如killall httpd ) |
pkill | pkill -U 用戶名 /pkill -t 終端 | 根據用戶或終端終止特定進程 |
四、計劃任務設置
1. at
:一次性任務
-
設置任務:
at 23:30 2020-11-23 # 指定執行時間 at> ls / > /tmp/a # 輸入要執行的命令 at> <Ctrl+D> # 按Ctrl+D確認
-
任務管理:
atq
:查詢待執行的 at 任務at -c 任務號
:查看任務具體內容atrm 任務號
:刪除指定 at 任務
2. crontab
:周期性任務
(1)核心配置
- 系統配置文件:
/etc/crontab
(系統級任務) - 用戶任務存放目錄:
/var/spool/cron/
(用戶級任務) - 時間格式:分、時、日、月、周(支持通配符:
*
任意值、*/n
每隔 n 單位、-
范圍、,
列表)
(2)常用命令
命令 | 功能 |
---|---|
crontab -e | 編輯當前用戶的周期性任務 |
crontab -u 用戶名 -e | 編輯指定用戶的周期性任務 |
crontab -l | 查看當前用戶的任務列表 |
crontab -r | 刪除當前用戶的所有任務 |
(3)權限控制
- 通過
/etc/cron.allow
(允許創建任務的用戶列表)和/etc/cron.deny
(禁止創建任務的用戶列表)限制權限 - 僅
/etc/cron.allow
中列出的用戶可創建任務(默認優先于cron.deny
)
五、計劃任務示例解析
示例 1:為用戶 natasha 配置每日定時任務
需求:每天 14:23 執行/bin/echo "RHCSA"
,僅允許 natasha 和 root 創建計劃任務
步驟:
-
創建用戶:
useradd natasha
-
配置任務:
crontab -u natasha -e
,添加內容:
23 14 * * * /bin/echo "RHCSA"
-
限制權限:編輯
/etc/cron.allow
,添加:
root natasha
-
重啟服務:
systemctl restart crond systemctl enable crond
示例 2:每月周期性任務
需求:每月 1~5 號 14:00-17:00,每隔 10 分鐘執行/bin/echo "I Love Galaxy"
配置:
crontab -e # 編輯當前用戶任務
*/10 14-17 1-5 * * /bin/echo "I Love Galaxy" # 添加任務
systemctl restart crond # 重啟服務使配置生效
systemctl enable crond # 設置開機自啟
示例 3:工作日定時記錄時間
需求:周一至周五 8:00-21:00,每 2 分鐘將當前時間附加到/home/galaxy/my_first_cron_job.txt
配置:
crontab -e # 編輯任務
*/2 8-21 * * 1-5 date >> /home/galaxy/my_first_cron_job.txt # 添加任務(注意用>>追加內容)
systemctl restart crond
systemctl enable crond
六、注意事項
crontab
任務中建議使用命令絕對路徑(如/bin/date
),避免環境變量問題- 追加內容用
>>
,覆蓋內容用>
,根據需求選擇 - 修改計劃任務后需重啟
crond
服務(systemctl restart crond
)使其生效 - 僵死進程(Z 狀態)需及時用
kill -9
手動終止,避免資源占用