系統程序
【1】、程序基本概述
當我們執行一個程式,那麼我們將執行的程式叫程序
PS1:當程式執行為程序後,系統會為該程序分配記憶體,以及程序執行的身份和許可權
PS2:在程序執行的過程中,伺服器上會有各種狀態來表示當前程序的指標資訊
程式和程序的區別
程式是資料和指令的集合,是一個靜態的概念,比如/bin/ls /bin/cp 等二進位制檔案,同時程式可以長期存在系統中
程序是程式執行的過程,是一個動態的概念,程序是存在生命週期概念的,也就是說程序隨著程式的終止而銷燬,不會永久存在系統中
程式的生命週期
一個物件從無到有、從有到無過程稱為生命週期
當父程序接收到任務排程時,會透過fock派生子程序來處理,子程序會繼承父程序衣缽(相當於完全複製了一份父程序的資訊)
-
子程序在處理任務程式碼時,父程序會進入等待狀態中,在一個程序中一般都是子程序去幹活
-
子程序在處理任務程式碼後,會執行退出,然後喚醒父程序來回收子程序的資源
-
如果子程序在處理任務過程中,父程序退出,子程序沒有退出,子程序沒有被父程序管理,則變為殭屍程序
-
每個程序都有自己的PID號,子程序稱為PPID
祖先程序
- pid=1的程序
- 在系統啟動時,會首先啟動一個祖先程序,在啟動別的程序
root@xu-ubuntu:~/scripts# pstree -p
systemd(1)─┬─ModemManager(935)─┬─{ModemManager}(960)
[root@kylin-xu ~]# pstree -p
systemd(1)─┬─NetworkManager(874)─┬─{NetworkManager}(882)
【2】、監控程序狀態
程式在執行後,我們需要了解程序的執行狀態,檢視程序的狀態分為:靜態和動態兩種方式
1、ps命令
使用ps命令檢視當前的程序狀態(靜態)
ps –auxf常用組合方式檢視程序、PID、佔用cpu百分比,佔用記憶體百分比,狀態、執行的命令等
- -a 顯示所有終端機下執行的程序,除了階段作業領導者之外
- -u 以使用者為主的格式來顯示程序狀況
- -x 顯示所有程序,不以終端機來區分
- -f 用ASCII字元顯示樹狀結構,表達程序間的相互關係
標誌 | 意義 |
---|---|
USER | 該 process 屬於那個使用者賬號的 |
PID | 該 process 的號碼 |
%CPU | 該 process 使用掉的 CPU 資源百分比 |
%MEM | 該 process 所佔用的實體記憶體百分比 |
VSZ | 該 process 使用掉的虛擬記憶體量 (Kbytes) |
RSS | 該 process 佔用的固定的記憶體量 (Kbytes) |
TTY | 該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?。另外, tty1-tty6 是本機上面的登入者程式,若為 pts/0 等等的,則表示為由網路連線進主機的程式。 |
STAT | 該程式目前的狀態 |
START | 該 process 被觸發啟動的時間 |
TIME | 該 process 實際使用 CPU 運作的時間 |
COMMAND | 該程式的實際指令[]核心態程序 無[] 使用者程序 |
STAT基本狀態 | 描述 | STAT狀態+符號 | 描述 |
---|---|---|---|
R | 程序執行 | s | 程序是控制程序, Ss程序的領導者,父程序 |
S | 可中斷睡眠 | < | 程序執行在高優先順序上,S<優先順序較高的程序 |
T | 程序被暫停 | N | 程序執行在低優先順序上,SN優先順序較低的程序 |
D | 不可中斷睡眠 | + | 當前程序執行在前臺,R+該表示程序在前臺執行 |
Z | 殭屍程序 | l | 程序是多執行緒的,Sl表示程序是以執行緒方式執行 |
案例1:
1)在終端1上執行vim
vim test
2)在終端2上執行ps命令檢視狀態
[root@kylin-xu ~]# ps aux | grep vim
root 434314 0.2 0.3 227272 6960 pts/1 S+ 18:27 0:00 vim test.txt
3)在終端1上掛起vim命令按下: ctrl+z
4) 回到終端2再次執行ps命令檢視狀態
[root@kylin-xu ~]# ps aux | grep vim
root 434314 0.0 0.3 227272 6960 pts/1 T 18:27 0:00 vim test.txt
案例2
PS命令檢視不可中斷狀態程序
使用tar打包檔案時,可以透過中斷不斷檢視狀態,由S+,R+變為D+
[root@xu ~]# ps axu|grep tar|grep -v grep
root 14289 2.6 0.1 124268 1888 pts/2 S+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@xu ~]# ps axu|grep tar|grep -v grep
root 14289 2.7 0.2 124380 2240 pts/2 R+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@xu ~]# ps axu|grep tar|grep -v grep
root 14289 2.9 0.2 124916 2724 pts/2 D+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
2、top命令
使用top命令檢視當前的程序狀態 動態
任務 | 含義 |
---|---|
Tasks:73 total | 當前程序的總數 |
2 running | 正在執行的程序數 |
71 sleeping | 睡眠的程序數 |
0 stopped | 停止的程序數 |
0 zombie | 殭屍程序數 |
%Cpu(s): 49.2 us | 系統使用者程序使用CPU百分比 |
5.7 sy | 核心程序佔用CPU百分比,核心是於硬體進行互動 |
ni | 調整過優先順序程序佔用百分比 |
45.2 id | 空閒CPU的百分比 |
0.0 wa | CPU等待IO完成的時間 |
0.0 hi | 硬中斷,佔的CPU百分比 |
0.0 si | 軟中斷,佔的CPU百分比 |
0.0 st | 比如虛擬機器佔用物理CPU的時間 |
什麼是中斷?
中斷就是終止當前在做的事情 去執行另一段程式
會保留現場,執行的那段程式做完之後會在回來執行剛來尚未完成的部分
軟中斷和硬中斷的區別
軟中斷 | 硬中斷 | |
---|---|---|
是否有隨機性 突發性 | 否 | 是 |
是否有中斷響應週期 | 無 | 是 |
中斷型別號的提供方法 | 固定或由指令提供 | 由中斷控制器提供,硬體提供 |
【3】、管理程序狀態
當程式執行為程序後,如果希望停止程序,怎麼辦呢?那麼此時我們可以使用linux的kill命令對程序傳送關閉新號,當然除了kill 還有killall pkill
使用kill –l列出當前系統所支援的訊號
雖然Linux訊號很多,但是我們僅僅使用最常用的3個訊號
1) SIGHUP 重新載入配置檔案 1 不停機維護
2) SIGKILL 強制殺死程序 9 不管記憶體中是否有沒有資料,直接殺程序,可能會丟檔案,類似拔電源
3) SIGTERM 終止程序,預設kill使用該訊號 15 如果記憶體中還有和當前程序相關的資訊,將記憶體中的資訊寫入磁碟後,在殺死程序
[root@kylin-xu ~]# ps -ef | grep httpd
root 272889 1 0 06:45 ? 00:00:03 /usr/sbin/httpd -DFOREGROUND
apache 272972 272889 0 06:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 272973 272889 0 06:45 ? 00:00:11 /usr/sbin/httpd -DFOREGROUND
apache 272974 272889 0 06:45 ? 00:00:12 /usr/sbin/httpd -DFOREGROUND
apache 272975 272889 0 06:45 ? 00:00:11 /usr/sbin/httpd -DFOREGROUND
[root@kylin-xu ~]# kill -9 272889
[root@kylin-xu ~]# ps aux | grep httpd
# 修改httpd埠,使用kill -1 重新載入,不停機維護
root@kylin-xu ~]# ss -tunlp | grep httpd
tcp LISTEN 0 128 *:80 *:* users:(("httpd",pid=470759,fd=4),("httpd",pid=470758,fd=4),("httpd",pid=470757,fd=4),("httpd",pid=470213,fd=4))
vim /etc/httpd/conf/httpd.conf
[root@kylin-xu ~]# kill -1 470213
[root@kylin-xu ~]# ss -tunlp | grep httpd
tcp LISTEN 0 128 *:8080 *:* users:(("httpd",pid=471610,fd=9),("httpd",pid=471609,fd=9),("httpd",pid=471608,fd=9),("httpd",pid=470213,fd=9))
killall命令
# 可以根據程序名字殺死程序
[root@kylin-xu ~]# killall httpd
[root@kylin-xu ~]# ps -ef | grep httpd
root 474240 430910 0 19:41 pts/1 00:00:00 grep httpd
pkill命令
使用pkill踢出從遠端登入到本機的使用者,終止pts1上所有程序,使用者強制退出
[root@lzy ~]# pkill -9 -t pts/1
【4】、後臺程序
1、臨時後臺程序
1) 什麼是後臺程序
執行的程序預設在終端前臺執行,一旦關閉終端,程序隨著結束,此時希望程序在後臺執行不退出,這樣關閉終端也不影響程序的正常執行
2) 如何把程式放在後臺
# 把程序放入後臺執行 使用 &
[root@kylin-xu ~]# sleep 5000 &
[1] 480069
[root@kylin-xu ~]# ps aux | grep sleep
root 480069 0.0 0.0 212380 760 pts/1 S 19:54 0:00 sleep 5000
root 480151 0.0 0.0 213156 892 pts/1 R+ 19:54 0:00 grep sleep
# jobs檢視後臺程序
[root@kylin-xu ~]# jobs
[1]+ 執行中 sleep 5000 &
# 調回前臺執行
[root@kylin-xu ~]# fg %1
sleep 5000
# ctrl + c 終止
# CTRL + z 後臺停止,bg 程序在後臺執行
[root@kylin-xu ~]# sleep 5000
^Z
[1]+ 已停止 sleep 5000
[root@kylin-xu ~]# bg %1
[1]+ sleep 5000 &
放入後臺的程序,如果再終端斷開連線後 ,重新連上程序會消失,我們現在不想讓他消失
2、持久化後臺程序
screen的使用 常用
screen的原理:開闢一個新的bash space ,將程序放入新的 bash space 中,
yum install -y screen
# 開創新的 bash ---- -S bash空間名稱
[root@kylin-xu ~]# screen -S wget_install
# 進入了screen 開闢的新的bash,在新的bash中執行命令,就相當於在後臺執行命令了
[root@kylin-xu ~]# sh 1.sh
# ctrl +a+d 表示退出當前bash空間,放入後臺,會到前臺
[root@kylin-xu ~]# ps aux | grep wget
root 491586 0.0 0.1 228240 2360 ? Ss 20:27 0:00 SCREEN -S wget_install
root 491633 1.0 0.6 227348 12832 pts/1 S+ 20:27 0:01 wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm --no-check-certificate
# 透過screen建立的後臺程序在斷開終端後也會正常執行
ctrl + d,重連終端,程序依舊存在
[root@kylin-xu ~]# ps aux | grep wget
root 491586 0.0 0.1 228240 2360 ? Ss 20:27 0:00 SCREEN -S wget_install
--list:檢視當前有哪些bash空間
[root@kylin-xu ~]# screen -list
There is a screen on:
491586.wget_install (Detached)
1 Socket in /run/screen/S-root.
-r:進入指定的bash space ,可以透過程序號或bash space name
[root@kylin-xu ~]# screen -r 491586
nohup
[root@kylin-xu ~]# nohup sleep 300 &
[1] 494330
【5】、程序優先順序
1) 在啟動程序時,為不同的程序使用不同的排程策略
- nice 值越高 表示優先順序越低,例如+19 該程序容易將CPU使用量讓給其他程序
- nice值越低 表示優先順序越高,例如-20, 改程序更不傾向於讓出CPU
使用top或ps敏玲檢視程序的優先順序
使用top可以檢視nice優先順序 NI:實際nice級別,預設是0 動態修正CPU排程。範圍(-20~19)。越大,cpu排程越一般,越小,cpu排程越偏向它。一般用於後臺程序,調整也是往大了調,用來給前臺程序讓出CPU資源
PR: 優先順序 顯示nice值,PR預設是20,越小,優先順序越高。修改nice可以同時修改PR -20對映到0, +19對映到39
nice指定程式的優先順序,語法格式nice -n 優先順序數字 程序名稱