管理Linux系统中的进程
1.什么是進程?
(1)進程與程序
????在Linux系統當中,觸發任何一個事件時,系統都會將它定義成為一個進程,并且給予這個進程一個ID,稱為PID,同時依據啟發這個進程的用戶與相關屬性關系,給予這個PID一組有效的權限設定。之后,這個PID能夠在系統上面進行的動作,就和這個PID的權限有關。
????程序是為了完成某種任務而設計的軟件,是存儲在磁盤上包含可執行的機器指令和數據的靜態實體。
????進程是一個程序一次執行的過程,在操作系統中執行特定的任務,是一個隨執行過程不斷變化的實體,和程序要包含指令和數據一樣,進程也包含程序計數器和所有CPU寄存器的值,同時它的堆棧中存儲著如子程序參數、返回地址以及變量之類的臨時數據。當前的執行程序,或者說進程,包含著當前處理器中的活動狀態。進程是Linux系統中基本的調度單位。
????進程具有獨立的權限與職責,如果系統中某個進程崩潰,它不會影響到其余的進程,每個進程運行在其各自虛擬地址空間中,通過內核控制下的通信機制,它們之間才能發生聯系。
進程在生命期內將使用系統中的資源,它利用系統中的CPU來執行指令,用物理內存來放置指令和數據。使用文件系統提供的功能打開并使用文件,同時直接或間接地使用物理設備。)
(2)進程狀態
| R | 可執行狀態(RUNNING,READY) |
| S | 可喚醒睡眠狀態 |
| D | 不可喚醒睡眠狀態 |
| T | 暫停狀態 |
| Z | 僵死態 |
????R:ready準備完全,所有東西都已經加載完畢,就等著cpu對它進行處理(處在進程隊列),running是cpu正在進行處理的那個進程。
????S:程序在使用cpu進行處理時,所使用的cpu時間已經到達了限制,那么cpu就會立即把它終止掉,去處理下一個進程,等處理完畢,再去喚醒剛才的程序。
????D:一般情況下,程序不可喚醒狀態發生在一個程序需要去加載磁盤里比較大的文件時,在程序運行時突然需要這個數據了,它需要去磁盤里面加載,當它在沒有加載完畢之前,它的狀態是不可被喚醒的。
????T:停止狀態,打開一個gedit,編輯內容,然后在shell界面執行“ctrl+z”將gedit進程打入后臺,gedit編輯任務就暫停了(一個進程停止不等于進程結束)。
????Z:在系統當中,程序在運行過程中,會用到系統資源,程序結束后,程序所占用的系統資源應該全部被釋放掉。
????有一類程序:這個程序本身已經結束了,但它所使用到的系統資源還抓著不放,這樣的進程狀態叫做僵死態。一般情況下,是因為系統當中的程序在編寫時候bug所導致的,就是它在結束以后仍然持續的去抓著系統當中的資源不放。
(3)線程與進程的區別在哪里?
????線程是程序調用的最小單位;進程是資源調用的最小單位。
????進程和進程之間的溝通,因為系統資源分配問題,溝通不容易,為了使資源調用更加快捷,所以提出了線程;
????線程和線程之間的數據是互通的,它們共用了一部分環境變量,使得線程和線程之間的溝通更快捷一點。
2.進程查看
(1)圖形方式查看:gnome-system-monitor
(2)進程查看命令ps:靜態查看進程信息
pstree 查看進程樹
系統啟動后,systemd為初始化程序,不會自己關閉結束自己,只有關機才可以,或者結束所有子進程后,該初始化進程才會被關閉;
一般由初始化程序來控制其它進程的開始和結束;
并不是父級進程結束以后子進程一定會結束,剩下的子進程被稱為孤兒進程
ps自己所在shell中運行的進程
直接執行不加任何選項的ps命令時,則只顯示當前用戶會話中打開的進程。
PID表示該進程的唯一ID號
TTY表示該進程在哪個終端上運行。不是從終端啟動的進程或者與終端機無關的進程顯示為 ?
TIME該進程使用CPU的累計時間
CMD該進程所運行的命令
ps a 在shell中運行的所有進程,包括shell的環境bash
[root@workstation Desktop]# ps aPID TTY STAT TIME COMMAND1155 tty1 Ssl+ 0:00 /usr/libexec/gdm-wayland-session gnome-session --auto1239 tty1 Sl+ 0:00 /usr/libexec/gnome-session-binary --autostart /usr/sh1279 tty1 Sl+ 0:05 /usr/bin/gnome-shell2328 tty2 SNl+ 0:00 /usr/libexec/tracker-miner-fs2350 tty2 Sl 0:00 /usr/libexec/ibus-engine-simple2549 pts/0 Ss 0:00 bash3039 pts/0 R+ 0:00 ps a [root@workstation Desktop]#ps -a 在shell中運行的所有進程,不包括shell環境本身信息bash
[root@workstation Desktop]# ps -aPID TTY TIME CMD1239 tty1 00:00:00 gnome-session-b1279 tty1 00:00:05 gnome-shell2316 tty2 00:00:00 seapplet2325 tty2 00:00:00 tracker-miner-a2328 tty2 00:00:00 tracker-miner-f2350 tty2 00:00:00 ibus-engine-sim2768 pts/0 00:00:00 ps [root@workstation Desktop]#ps -u 以用戶為歸類來顯示進程狀態信息
| USER | 用戶名稱 |
| PID | 進程ID |
| %CPU | CPU用量百分比 |
| %MEM | 內存用量百分比 |
| VSZ | 占用虛擬內存大小 |
| RSS | 常駐內存集大小 |
| TTY | 字符終端 |
| STAT | 進程狀態 |
| START | 運行時間 |
| TIME | 占用cpu時間 |
| COMMAND | 進程名稱 |
ps -e 顯示所有進程信息,與-A選項功能相同
[root@workstation Desktop]# ps -ePID TTY STAT TIME COMMAND1893 ttyS0 Ss+ 0:00 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9601932 tty2 Ssl+ 0:00 /usr/libexec/gdm-x-session --run-script env GNOME_SHE1936 tty2 Rl+ 0:01 /usr/libexec/Xorg vt2 -displayfd 3 -auth /run/user/0/1967 tty2 Sl+ 0:00 /usr/libexec/gnome-session-binary --session gnome-cla2057 tty2 Sl+ 0:09 /usr/bin/gnome-shell MODULES_RUN_QUARANTINE=LD_LIBRAR2103 tty2 Sl 0:00 ibus-daemon --xim --panel disable MODULES_RUN_QUARANT2107 tty2 Sl 0:00 /usr/libexec/ibus-dconf MODULES_RUN_QUARANTINE=LD_LIBps x 顯示所有與終端無關進程
[root@workstation Desktop]# ps xPID TTY STAT TIME COMMAND1 ? Ss 0:02 /usr/lib/systemd/systemd --switched-root --system --d2 ? S 0:00 [kthreadd]3 ? I< 0:00 [rcu_gp]4 ? I< 0:00 [rcu_par_gp]6158 ? I 0:00 [kworker/1:0-xfs-cil/vda1]6264 ? I 0:00 [kworker/1:1-xfs-reclaim/vda1]6289 ? S 0:00 sleep 606290 pts/0 R+ 0:00 ps x [root@workstation Desktop]#ps f 層級結構顯示進程信息
[root@workstation Desktop]# ps fPID TTY STAT TIME COMMAND2549 pts/0 Ss 0:00 bash6306 pts/0 R+ 0:00 \_ ps f1932 tty2 Ssl+ 0:00 /usr/libexec/gdm-x-session --run-script env GNOME_SHE1936 tty2 Sl+ 0:08 \_ /usr/libexec/Xorg vt2 -displayfd 3 -auth /run/use1967 tty2 Sl+ 0:00 \_ /usr/libexec/gnome-session-binary --session gnome2057 tty2 Sl+ 0:49 \_ /usr/bin/gnome-shell2103 tty2 Sl 0:00 | \_ ibus-daemon --xim --panel disable2107 tty2 Sl 0:00 | \_ /usr/libexec/ibus-dconf2108 tty2 Sl 0:00 | \_ /usr/libexec/ibus-extension-gtk32350 tty2 Sl 0:00 | \_ /usr/libexec/ibus-engine-simple2186 tty2 Sl+ 0:00 \_ /usr/libexec/gsd-power2187 tty2 Sl+ 0:00 \_ /usr/libexec/gsd-print-notificationsps -f 顯示完整格式信息
[root@workstation Desktop]# ps -f UID PID PPID C STIME TTY TIME CMD root 2549 2542 0 04:01 pts/0 00:00:00 bash root 6525 2549 0 07:38 pts/0 00:00:00 ps -f [root@workstation Desktop]#ps -o 顯示進程的指定信息
(3)常用ps組合命令查看進程
ps aux 顯示系統當中的所有進程并顯示進程用戶
ps ax 顯示當前系統中的所有進程(在此只截取一部分進程代碼,以上同是)
[root@workstation Desktop]# ps axPID TTY STAT TIME COMMAND1 ? Ss 0:02 /usr/lib/systemd/systemd --switched-root --system --d2 ? S 0:00 [kthreadd]3 ? I< 0:00 [rcu_gp]4 ? I< 0:00 [rcu_par_gp]6576 ? I 0:00 [kworker/1:1-events_power_efficient]6656 ? S 0:00 sleep 606657 pts/0 R+ 0:00 ps ax [root@workstation Desktop]#(4)進程排序
命令格式:ps ax --sort=要顯示的內容
顯示cpu使用量排在前五的pid:ps axo pid,comm,%cpu --sort=-%cpu | head -n 6
(5)進程的stat列顯示的信息意義
| s | 沒有父進程,頂級進程 |
| l | 在內存中有鎖定空間(進程結束前不會被系統回收) |
| + | 正在前臺運行的進程 |
| N | 進程優先級低 |
| < | 進程優先級高 |
(6)pgrep顯示指定信息進程
| pgrep -u uid | 顯示指定用戶進程 |
| pgrep -U name | 顯示指定用戶進程 |
| pgrep -t tty | 顯示指定終端進程 |
| pgrep -l | 顯示進程名稱 |
| pgrep -a | 顯示完整格式進程名 |
| pgrep -P pid | 顯示指定進程的子進程 |
超級用戶執行一個切換到普通用戶命令的進程
pgrep -u 1000 查看用戶1000進程號(pid)
普通用戶student執行一個watch進程
pgrep -P 6808(父進程student進程號)查看子進程watch的進程號
(7)pidof根據進程名稱獲取pid
超級用戶觸發watch進程
pidof watch 獲取watch進程pid
(8)top:動態觀察進程變化
相比于ps是取一個時間點的進程狀態,top則可以持續偵測進程運作的狀態!
top內部參數
| M | 內存百分比 |
| T | 累計占用cpu時間 |
| l | 開啟/關掉uptime信息 |
| t | 開啟/關閉task&cpu信息 |
| s | 調整刷新頻率 |
| k | 終止進程 |
| u | 查看指定用戶進程 |
| r | 給與某個pid重新制定一個nice值 |
| q | 離開top軟件的按鍵 |
top命令參數
| -b | 以批次方式顯示 |
| -n | 與-b搭配,顯示批次數量 |
| -p | 指定某些個PID來進行觀察檢測 |
top主要分為兩個部分,上半部分為整個系統的資源使用狀態,下半部分是每個process使用的資源情況。
top顯示進程信息詳解
| up | 開機到目前為止所經過的時間 |
| user | 登陸當前系統的用戶數量 |
| load average | 平均負載1分鐘,5分鐘,15分鐘的隊列長度 |
| task | 顯示的是目前進程的總量與個別進程在什么狀態 |
| %CPU | CPU占用百分比(顯示的是CPU的整體負載) |
| Mem | 物理內存 |
| swap | 交換分區占用 |
| 空行 | 當在top程序中輸入指令時,顯示狀態的地方 |
%CPU內部參數說明
| sy | 內核空間 |
| ni | nice調整時間 |
| id | 空閑時間 |
| wa | 等待I/O(通常系統會變慢都是I/O產生的問題比較大) |
| hi | 處理硬件中斷 |
| si | 處理軟件中斷 |
| st | 被虛擬化程序占用的百分比 |
3.進程優先級
(1) 按照資源占用劃分進程類型
| cpu使用密集 | CPU-Bound |
| I/O使用密集 | I/O-Bound |
對cpu使用密集的程序多分配cpu,但是一定要調高I/O使用密集的程序的優先級,I/O雖然使用的不多,但當I/O出現時一定要讓它優先使用cpu,否則輸入的內容延遲會非常高
(2)優先級范圍
對Linux而言優先級被劃分成固定個數(0-139,140個優先級)
1-99為實時有優先級,數字越大優先級越高,不用手動處理系統自用(不能人為干預)
100-139為靜態優先級,數字越小優先級越高,這40個優先級對應安排成了一個nice值(-20—19)
一般情況下,我們所說的應用程序的默認優先級都是120(0是nice值)
(3)調整進程的優先級
renice -n -10 3912 更改vim進程優先級為110(nice=-10)< 表示優先級高于默認優先級
renice -n 10 3912 更改vim進程優先級為130(nice=10)N 表示優先級低于默認優先級
(4)開啟進程的同時指定進程優先級
nice -n 5 vim & 開啟vim進程時指定它的優先級為125(nice=5)
4.進程前后臺調用
進程前后臺調用相關命令
| jobs | 查看后臺任務 |
| ctrl+z | 將前臺運行進程打入后臺 |
| bg | 激活后臺進程 |
| fg | 調回進程 |
| & | 運行在后臺 |
(1)在workstation主機中執行gedit(圖形的文本編輯器)命令,該進程會占用終端
(2)ctrl+z直接將gedit前臺運行進程打入后臺
(3)執行jobs命令查看被打入后臺的進程
(4)fg job號 將被打入后臺的進程調回到前臺
(5)bg job號 把后臺掛起(暫停)的進程運行起來,但是u不能把vim這個進程運行起來,因為vim這個工具必須占用終端,提供它的操作界面,才能夠正常運行起來,所以用bg job號去運行vim,它運行完畢后,又讓vim掛起了,這樣的狀態就是我們所說的不可喚醒狀態,因為它一直在等待資源,但是資源現在不讓它用,只能用fg job號 把vim調回前臺來,才能讓vin運行起來
(6)vim & 表示讓vim進程在后臺運行,沒有占用你的終端
注意:
1.先打入后臺的優先級低,后打入后臺的優先級高
2.+表示正在運行,-表示次優先
3.如果沒有+(把一個進程調回前臺),-就會被自動變為+(優先級提高)
4.優先處理和優先調用不一樣
5.常用進程信號
進程和系統進行溝通時用到的信號
man 7 signal 查看信號詳細信息
(1)常用信號等級
| 1 | 刷新(進程重新加載配置,進程號不變) |
| 2 | 中斷鍵盤輸入(刪除進程在內存中的數據) |
| 3 | 退出鼠標捕捉(刪除鼠標在內存中的數據) |
| 9 | 強制結束(不會被阻塞) |
| 15 | 正常關閉進程(可能會被阻塞) |
| 18 | 激活進程(運行暫停的進程) |
| 19 | 強制暫停 (不會被阻塞) |
| 20 | 正常暫停(可能會被阻塞) |
1> kill -2 進程號 效果和ctrl+c效果一樣,鍵盤終止,進行下一次新的捕捉
2> kill -3 進程號 退出鼠標捕捉 可用==ctrl+/==快捷鍵操作
3> kill -9 進程號 強制結束gedit進程,不被阻塞
4> kill -15 進程號 執行完以后沒有效果,是因為信號15的關閉被系統阻塞掉了,當系統接收到15這個信號的時候,它去處理這個任務時,內核會認為這個程序不適合被關閉,所以它把這個執行動作就給阻塞掉了,但信號9是不會去考慮這個進程是重要還是不重要的,這個關閉是不會被阻塞掉的。
5> kill -20 進程號 和信號15同理
kill -20 2550 會發現暫停shell(命令行輸入字符)被阻塞
kill -20 3069 gedit進程被暫停(不能編輯)
6> kill -18 3069 gedit進程被激活(可以編輯)
7> kill -19 2550 暫停shell不會被阻塞,在命令行后邊輸入內容時沒有反應
kill -18 2550 剛才輸入的內容系統是捕捉到的,只不過捕捉后的程序不響應,程序響應后會立即發送給這個程序;I/O已經捕捉到了,但是往程序加載時受阻塞了
(2)信號的控制命令
kill 信號 pid
killall 信號 進程名稱
pkill 參數 target
kill表示的不是殺死,是發送信號的意思
1> 將三個vim進程打入后臺
kill -9 2821 需要知道進程號才能結束掉
2> killall -9 vim killall后面加的是進程名稱時,會把名稱叫這個指定字符的所有進程全部結束掉,而kill處理的是單一進程
3> pkill 參數 target 按照一定條件對進程結束
用student用戶身份開啟一個進程,pkill -u 1000 進程結束
6.系統守護進程
(1)設定實驗環境
1> 在workstation虛擬機進行網絡配置設定:nm-connection-editor
網卡設備:enp1s0
鏈接名:westos(任意起)網絡選擇IPv4,靜態方式(manual)
172.25.254.165 前三位是ip的網段,最后一位是真實主機的ip,
24表示的是子網掩碼
2> 查看設定好的workstation虛擬機網絡配置:ip addr show enp1s0
3> 檢查網絡是否連通:查看真機ip,用真機ping一下虛擬機,ping 172.25.254.165
能夠ping通,說明網絡配置成功
4> 遠程連接:用真機連接虛擬機ssh -l root 172.25.254.165
(2)服務的理解
????現在所使用的虛擬機是可以讓真機通過網絡連接它的,是因為在這臺主機(虛擬機)里開啟了一個程序這個程序的名字是994(sshd)
這個程序是由很多個程序組成的程序簇,我們把它叫做服務
????本機開啟的服務軟件就是提供給我所提供服務的享有者使用的,安裝了服務性軟件的電腦叫做服務器(如sshd)像這種服務型軟件,它的控制是不能夠用kill、killall這種單獨的程序管理工具去進行管理的,而用到的是systemctl命令
(3)系統守護進程及systemctl命令
1> 守護進程的定義
????守護進程就是通常講的Daemon進程,是linux后臺執行的服務進程,是獨立于控制終端、周期性地執行某種任務或等待處理某些發生事件,不會隨終端關閉而停止,直到接受停止信息才會結束
2> 守護進程類型
| Sysv init | 經典的守護進程類型延用到rhel6 |
| upstart | 做到并行啟動rhel6中應用 |
| systemd | 獨立完成啟動,rhel7中使用 |
3> systemctl命令用法
| systemctl list-unit-files | 查看服務開機運行情況 |
| systemctl list-units | 查看服務當前運行情況 |
| systemctl list dependencies | 查看服務依賴性 |
| systemctl status service | 查看服務狀態 |
| systemctl start service | 開啟服務 |
| systemctl stop service | 關閉服務 |
| systemctl reload service | 重新加載服務配置 |
| systemctl restart service | 重新啟動服務 |
| systemctl enable service | 設定服務開啟啟動 |
| systemctl enable –now service | 設定服務開機啟動并開啟服務 |
| systemctl disable service | 設定服務開機關閉 |
| systemctl set-default multi-user.target | 設定系統運行級別為無圖形網絡模式 |
| systemctl set-default graphical.target | 設定系統運行級別為圖形網絡模式 |
查看系統當中所有服務當前的運行狀況:systemctl list-units --type=service
查看系統當中的這些服務在開機的時候會不會自動打開:systemctl list-unit-files --type=service
enabled表示這個服務在開機的時候會自動打開
disabled表示這個服務在開機時不會自動打開
static表示這個服務的狀態是不需要進行管理的,是靜態的,就是當它需要的時候會自動打開,不需要的時候就不會打開,這樣的服務通常是其它一些服務的依賴性,會自動地根據某些服務的需要而打開
查看sshd服務在工作時需要哪些服務的支持:systemctl list-dependencies sshd
當打開sshd這個服務的時候,底下的這些所有進程都會自動開啟
列出sshd服務當前的狀態:systemctl status sshd
sshd這個服務是可用的,能被遠程連接的,id是994,它現在的任務只有一個,占用內存2.2M,底下這些是它的日志,它的重大事件的一個記錄
關閉sshd服務:systemctl stop sshd 不能被遠程連接
開啟sshd服務:systemctl start sshd 可以被遠程連接
sshd服務的配置文件在/etc/ssh/sshd_config下,可以在配置文件里設定它的工作方式,在改了這個配置文件后是需要對這臺主機的服務進行重啟或重新初始化的
重啟sshd服務:systemctl restart sshd 進程id會發生變化,原來是994現在變為4349
重新加載配置:systemctl reload sshd 進程id不會發生變化,相當于kill -1 刷新(重新加載)
設定sshd服務在開機時不會自動開啟:systemctl disabled sshd 這個disabled命令不會影響這個服務的d當前狀態 ,服務當前狀態的更改用systemctl stop sshd命令更改
設定服務開機啟動并開啟服務:systemctl enable --now sshd
設定系統開機時為無圖形網絡模式:systemctl set-default multi-user.target
設定不會影響當前的圖形狀態,需要reboot,可以用init 3命令關閉當前的圖形狀態,
在無圖形模式界面下,可以用 init 5 開啟圖形,但這只是臨時的
設定系統開機時為圖形網絡模式:systemctl set-default graphical.target
設定不會影響當前的圖形狀態,需要reboot,永久圖形模式
總結
以上是生活随笔為你收集整理的管理Linux系统中的进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大学物理复习-静电场
- 下一篇: 高新技术企业代办费用多少?