Linux系統程序

Linux小菜鸟發表於2024-11-25

系統程序

【1】、程序基本概述

當我們執行一個程式,那麼我們將執行的程式叫程序

​ PS1:當程式執行為程序後,系統會為該程序分配記憶體,以及程序執行的身份和許可權

​ PS2:在程序執行的過程中,伺服器上會有各種狀態來表示當前程序的指標資訊

程式和程序的區別

​ 程式是資料和指令的集合,是一個靜態的概念,比如/bin/ls /bin/cp 等二進位制檔案,同時程式可以長期存在系統中

​ 程序是程式執行的過程,是一個動態的概念,程序是存在生命週期概念的,也就是說程序隨著程式的終止而銷燬,不會永久存在系統中

程式的生命週期

​ 一個物件從無到有、從有到無過程稱為生命週期

img

當父程序接收到任務排程時,會透過fock派生子程序來處理,子程序會繼承父程序衣缽(相當於完全複製了一份父程序的資訊)

  1. 子程序在處理任務程式碼時,父程序會進入等待狀態中,在一個程序中一般都是子程序去幹活

  2. 子程序在處理任務程式碼後,會執行退出,然後喚醒父程序來回收子程序的資源

  3. 如果子程序在處理任務過程中,父程序退出,子程序沒有退出,子程序沒有被父程序管理,則變為殭屍程序

  4. 每個程序都有自己的PID號,子程序稱為PPID

祖先程序

  1. pid=1的程序
  2. 在系統啟動時,會首先啟動一個祖先程序,在啟動別的程序
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字元顯示樹狀結構,表達程序間的相互關係

image-20241125150128940

標誌 意義
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的時間

什麼是中斷?

中斷就是終止當前在做的事情 去執行另一段程式

會保留現場,執行的那段程式做完之後會在回來執行剛來尚未完成的部分

image-20241125160520458

軟中斷和硬中斷的區別

軟中斷 硬中斷
是否有隨機性 突發性
是否有中斷響應週期
中斷型別號的提供方法 固定或由指令提供 由中斷控制器提供,硬體提供

【3】、管理程序狀態

當程式執行為程序後,如果希望停止程序,怎麼辦呢?那麼此時我們可以使用linux的kill命令對程序傳送關閉新號,當然除了kill 還有killall pkill

使用kill –l列出當前系統所支援的訊號

image-20241125161406952

雖然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

image-20241125170420489

nice指定程式的優先順序,語法格式nice -n 優先順序數字 程序名稱

相關文章