8月21日 程式管理

weixin_33976072發表於2017-08-21

1、程式概念

程式編號是PID,磁碟檔案編號是inode
程式(process)和執行緒(thread):一個程式可能包含一個或多個執行緒,比如蓋一座大樓,團隊就是一個程式,一個人就是一個執行緒,執行緒佔用的記憶體空間小,省資源。
如下圖http程式有很多個子程式,子程式又分成多個執行緒


6854348-8f833914569a5d3a.png
QQ截圖20170821224749.png

2、程式優先順序

6854348-c9ed81dae0175dda.jpg
Linux優先順序.jpg

程式優先順序:
系統優先順序:數字越小,優先順序越高,各有140個執行佇列和等待佇列
0-139(CentOS4,5)
0-98,99(CentOS6)
實時優先順序realtime:99-0:值最大優先順序最高
nice值:-20到19,對應系統優先順序100-139或99

3、程式記憶體

記憶體分頁儲存,一頁是4k。
LRU演算法:來了一個資料就放到最上面,把下面的擠下去,如果來的資料記憶體中本來就有,則把它調到最上面。

6854348-cfa27e7253f3beba.png
Paste_Image.png

4、程式分類

守護程式: daemon,在系統引導過程中啟動的程式,和終端無關程式
前臺程式:跟終端相關,通過終端啟動的程式,是使用者登入之後啟動的程式。

5、程式狀態

執行態:running
就緒態:ready
睡眠態:sleep,睡眠態又分為可中斷和不可中斷的睡眠態
可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped,暫停於記憶體,但不會被排程,除非手動啟動
僵死態:zombie,在記憶體中,不會被啟動的程式,出了問題的程式,會一直佔用記憶體。

6、PS命令

[root@centos6 html]#ps axu   ---檢視所有程式,包括前臺程式和守護程式,u表示顯示程式生效的所有者

VSZ: Virtual memory SiZe,虛擬記憶體集,線性記憶體,也就是系統承諾給的記憶體
RSS: ReSidentSize, 常駐記憶體集,實際用的記憶體
一般情況下系統承諾給的記憶體很多,但實際用的很少。


6854348-5ab85a732653c7a6.png
QQ截圖20170822093926.png
[root@centos6 ~]#ps auxf --    f表示顯示程式的父程式
6854348-db34211d923a4455.png
QQ截圖20170822094536.png
[root@centos6 ~]#ps axo pid,cmd,nice  --指定顯示哪些特性
[root@centos6 ~]#ps -C vim f1 -C vim f2 o pid,cmd,nice  ---   -C選項可以顯示單獨的某一個程式,預設是全部顯示
[root@centos6 ~]#ps axu |grep 2078  --還可以過濾
root       2078  0.0  0.3 177464  3880 ?        Ss   09:37   0:00 /usr/sbin/httpd
root       2485  0.0  0.0 103328   868 pts/0    R+   10:19   0:00 grep 2078

STAT:程式狀態
R:running 執行
S: interruptablesleeping 可中斷的睡眠態
D: uninterruptable sleeping 不可中斷的睡眠態
T: stopped --停止態,手動可以被啟動
Z: zombie ---僵死態,不可被啟動
+: 前臺程式
l: 多執行緒程式
L:記憶體分頁並帶鎖
N:低優先順序程式
<: 高優先順序程式
s: session leader,會話(子程式)發起者

7、程式優先順序的調整

[root@centos6 ~]#renice -n -10 2410  ---調整nice優先順序為-10,2410是程式編號
root@centos6 app]#nice -n -10 vim f1  ---指定優先順序開啟某個程式

8、搜尋程式pgrep

[root@centos6 ~]#pgrep -lu dufu   ---顯示生效者
2493 bash
[root@centos6 ~]#pgrep -lU dufu  ---顯示正真發起執行命令者
2493 bash
2571 passwd
[root@centos6 ~]#pgrep -lt pts/1 ---指定終端的程式
2307 bash
2492 su
2493 bash
2571 passwd
-l 顯示程式名
[root@centos6 ~]#pidof vim
[root@centos6 ~]#echo $?
1
[root@centos6 ~]#pidof httpd
2088 2087 2086 2085 2084 2083 2082 2081 2078
[root@centos6 ~]#echo $?
0

總結:檢視某個程式的編號,此方法可以寫到指令碼里,用來判斷電腦上是否跑了某個程式,如果跑了這個程式

9、uptime

顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載(1、5、10分鐘的平均負載,一般不會超過1)
系統平均負載:
指在特定時間間隔內執行佇列中的平均程式數
通常每個CPU核心的當前活動程式數不大於3,那麼系統的效能良好。如果每個CPU核心的任務數大於5,那麼此主機的效能有嚴重問題
如果linux主機是1個雙核CPU,當Load Average 為6的時候說明機器已經被充分使用

[root@centos6 ~]#uptime
 10:41:06 up  2:28,  4 users,  load average: 0.00, 0.00, 0.00

10、top命令

可以動態的顯示程式的資訊
選項:
-d #: 指定重新整理時間間隔,預設為3秒
-b: 全部顯示所有程式
-n #: 重新整理多少次後退出

[root@centos6 ~]#top 
top - 11:02:49 up  2:50,  4 users,  load average: 0.00, 0.00, 0.00
Tasks: 156 total,   1 running, 155 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004112k total,   210440k used,   793672k free,     9580k buffers
Swap:  4194300k total,        0k used,  4194300k free,    55164k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND          
     1 root      20   0 19236 1496 1228 S  0.0  0.1   0:01.43 init              
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.01 kthreadd          
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0       
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/0       
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0         
     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/0        
     7 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 migration/1       
     8 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/1         
     9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1       
    10 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/1        
    11 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/2
6854348-3e62e2df5563f3bf.png
QQ截圖20170822195529.png

欄位資訊簡介
us:使用者空間;sy:核心空間;ni:調整nice時間;id:空閒;wa:等待IO時間;hi:硬中斷;si:軟中斷(模式切換);st:虛擬機器偷走的時間

內建命令
排序:
P:以佔據的CPU百分比,%CPU
M:佔據記憶體百分比,%MEM
T:累積佔據CPU時長,TIME+
首部資訊顯示:
uptime資訊:l命令
tasks及cpu資訊:t命令
cpu分別顯示:1 (數字)
memory資訊:m命令
退出命令:q
修改重新整理時間間隔:s
終止指定程式:k
儲存檔案:W
查詢幫助資訊:h

11、vmstat命令

[root@centos6 yum.repos.d]#vmstat  ---顯示虛擬記憶體資訊
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 710432  12100 135420    0    0     3     1    9    5  0  0 100  0  0   
[root@centos6 yum.repos.d]#vmstat 5 10  ---表示5秒顯示一次,顯示10次

swap:
si:從磁碟交換進記憶體的資料速率(kb/s),從交換分割槽到進記憶體,
so:從記憶體交換至磁碟的資料速率(kb/s),從記憶體出到swap分割槽,因swap在磁碟上,所以是從記憶體到磁碟
io:
bi:從塊裝置讀入資料到系統的速率(kb/s),從塊裝置讀入資料寫到記憶體
bo: 儲存資料至塊裝置的速率,從記憶體讀資料寫到塊裝置

12、iostat命令

統計CPU和裝置IO資訊

[root@centos6 yum.repos.d]#iostat
Linux 2.6.32-696.el6.x86_64 (centos6.9.magedu.com)  08/22/2017  _x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.28    0.03    0.00   99.63

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.03         0.17         0.00       3628          0
sda              10.08      1768.54       319.54   37974826    6861312
[root@centos6 yum.repos.d]#iostat sda
只統計某個磁碟[root@centos6 yum.repos.d]#iostat 1 10
表示1秒顯示一次,顯示10次

13、用glances命令監控遠端主機

伺服器模式:
glances -s -B IPADDR
IPADDR: 指明監聽的本機哪個地址,也可以不用-B指監聽本地的所有IP地址。
客戶端模式:
glances -c IPADDR
IPADDR:要連入的伺服器端地址

例項
centos7做為伺服器,centos6做為客戶端,並且兩臺機器都安裝了glances

[root@redhat7 yum.repos.d]#glances -s  ---指明glances服務已經開啟,埠是61209,可以監聽本地的所有ip地址
Glances server is running on 0.0.0.0:61209
[root@redhat7 yum.repos.d]#glances -s -B 172.18.21.7 
-B指明監控本地的172.18.21.7的ip地址
Glances server is running on 172.18.21.7:61209
[root@centos6 yum.repos.d]#glances -c 172.18.21.7  ---在客戶端指明要監控遠端主機的哪個ip地址,就可以遠端監控別的主機了
6854348-b4da206ddd86a145.png
QQ截圖20170822144703.png

14、dstat命令

系統資源統計,代替vmstat,iostat

6854348-f6275d364e1d9a96.png
QQ截圖20170822150548.png

-c: 顯示cpu相關資訊
-C #,#,...,total
-d: 顯示disk相關資訊
-D total,sda,sdb,...
-g:顯示page相關統計資料
-m: 顯示memory相關統計資料
-n: 顯示network相關統計資料
-p: 顯示process相關統計資料
-r: 顯示io請求相關的統計資料
-s: 顯示swapped相關的統計資料
--tcp
--udp
--unix
--raw
--socket
--ipc
--top-cpu:顯示最佔用CPU的程式
--top-io: 顯示最佔用io的程式
--top-mem: 顯示最佔用記憶體的程式
--top-latency: 顯示延遲最大的程式

15、kill命令

向程式傳送控制訊號,以實現對程式管理,每個訊號對應一個數字,訊號名稱以SIG開頭(可省略),不區分大小寫
顯示當前系統可用訊號:kill –l,trap-l
常用訊號:man 7 signal

  1. SIGHUP: 無須關閉程式而讓其重讀配置檔案
  2. SIGINT: 中止正在執行的程式;相當於Ctrl+c
  3. SIGQUIT:相當於ctrl+=quit
  4. SIGKILL: 強制殺死正在執行的程式
  5. SIGTERM:終止正在執行的程式
  6. SIGCONT:繼續執行
  7. SIGSTOP:後臺休眠
    指定訊號的方法:
    (1) 訊號的數字標識:1, 2, 9
    (2) 訊號完整名稱:SIGHUP(3) 訊號的簡寫名稱:HUP

以下三種形式都可以

[root@centos6 app]#kill -1 4691 
[root@centos6 app]#kill -HUP 3915
[root@centos6 app]#kill -SIGHUP 3915
[root@centos6 app]#kill -0 4691 &>/dev/null ||service httpd restart 
發零訊號可以監控某個程式是否正常執行,但這種方法要知道程式編號,如果程式退出程式編號可能發生改變
[root@centos6 app]#killall -0 httpd &>/dev/null ||service httpd restart
killall 後面可以給跟名稱

按模式:pkill[options] pattern
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正發起執行命令者
-t terminal: 與指定終端相關的程式
-l: 顯示程式名(pgrep可用)
-a: 顯示完整格式的程式名(pgrep可用)
-P pid: 顯示指定程式的子程式

[root@centos6 app]#pkill -9 -u dufu  ---強制殺死dufu這個使用者的所有程式

16、作業管理

[root@centos6 ~]#ping 172.8.0.1 &  ---表示直接後臺執行
[root@centos6 ~]#ping 172.18.0.1   ---按ctrl+z ping程式進入後臺休眠
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.535 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.453 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.407 ms
^Z
[1]+  Stopped                 ping 172.18.0.1
[root@centos6 ~]#sleep 100  ---按ctrl+z sleep程式進入後臺休眠
^Z
[2]+  Stopped                 sleep 100
[root@centos6 ~]#jobs ---檢視當前終端所有作業,注意每個程式的前面的號碼,用於轉入後臺執行和後臺休眠時用
[1]-  Stopped                 ping 172.18.0.1
[2]+  Stopped                 sleep 100
[root@centos6 ~]#bg 2  ---將sleep程式轉入後臺執行,因sleep的jobs號碼是2,所以bg 後面加2,bg為background後臺的簡寫
[2]+ sleep 100 &
[root@centos6 ~]#jobs ---只能看當前這個終端,不能在其他終端裡看
[1]+  Stopped                 ping 172.18.0.1
[2]-  Running                 sleep 100 &
6854348-f650312a46bf80cd.png
Paste_Image.png

其中用killall 或者kill命令發訊號時,可以在其他終端進行,發19訊號是由後臺執行轉為後臺休眠,發18訊號是由後臺休眠轉為後臺執行

17 斷網恢復後仍可以在後臺執行

之前學過的方法是用screen可以將斷網後的程式恢復,先輸入screen,然後執行程式,斷網後,輸入screen -ls檢視一下,再輸入screen -r 就可以恢復,下面是一種新的方法。

[root@centos6 ~]#nohup ping 172.18.0.1&>/dev/null &  ---使用nohup並且後臺執行
[1] 4737
[root@centos6 ~]#jobs
[1]+  Running                 nohup ping 172.18.0.1 &>/dev/null &
斷網後恢復
[root@centos6 ~]#pstree -p ---檢視程式樹,發現仍然在執行
init(1)─┬─atd(1681)
        ├─auditd(1424)───{auditd}(1425)
        ├─automount(1505)─┬─{automount}(1506)
        │                 ├─{automount}(1507)
        │                 ├─{automount}(1522)
        │                 └─{automount}(1525)
        ├─crond(1666)
        ├─dhclient(1367)
        ├─master(1652)───qmgr(1659)
        ├─mingetty(1694)
        ├─mingetty(1696)
        ├─mingetty(1698)
        ├─mingetty(1700)
        ├─mingetty(1702)
        ├─mingetty(1704)
        ├─ping(4737)   ---仍然在執行
        ├─rsyslogd(1446)─┬─{rsyslogd}(1447)
        │                ├─{rsyslogd}(1448)
        │                └─{rsyslogd}(1449)
        ├─sshd(1573)─┬─sshd(4691)───bash(4696)
        │            └─sshd(4742)───bash(4747)───pstree(4766)
        └─udevd(576)─┬─udevd(1711)
                     └─udevd(1712)
[root@centos6 ~]#ps aux|grep ping   ---搜尋也可以搜到
root       4737  0.0  0.0 103268   740 ?        S    19:53   0:00 ping 172.18.0.1
root       4769  0.0  0.0 103328   880 pts/0    S+   19:55   0:00 grep ping
[root@centos6 ~]#killall ping  ---殺死程式
[root@centos6 ~]#ps aux|grep ping
root       4815  0.0  0.0 103328   880 pts/0    S+   20:00   0:00 grep ping
[root@centos6 ~]#nohup ping 172.18.0.1 ---使用nohup並且前臺執行
斷網後恢復
[root@centos6 ~]#ps aux |grep ping  ---發現仍然在執行
root       4872  0.0  0.0 103268   740 ?        S    20:07   0:00 ping 172.18.0.1
root       4897  0.0  0.0 103328   880 pts/0    S+   20:08   0:00 grep ping
[root@centos6 ~]#pstree -p
init(1)─┬─atd(1681)
        ├─auditd(1424)───{auditd}(1425)
        ├─automount(1505)─┬─{automount}(1506)
        │                 ├─{automount}(1507)
        │                 ├─{automount}(1522)
        │                 └─{automount}(1525)
        ├─crond(1666)
        ├─dhclient(1367)
        ├─master(1652)─┬─pickup(4767)
        │              └─qmgr(1659)
        ├─mingetty(1694)
        ├─mingetty(1696)
        ├─mingetty(1698)
        ├─mingetty(1700)
        ├─mingetty(1702)
        ├─mingetty(1704)
        ├─ping(4872)   ---程式樹發現也在執行
        ├─rsyslogd(1446)─┬─{rsyslogd}(1447)
        │                ├─{rsyslogd}(1448)
        │                └─{rsyslogd}(1449)
        ├─sshd(1573)─┬─sshd(4691)───bash(4696)
        │            └─sshd(4873)───bash(4877)───pstree(4898)
        └─udevd(576)─┬─udevd(1711)
                     └─udevd(1712)

採用此種方法,將正在前臺執行的程式或者正在後臺執行的程式,斷網後,恢復網路程式仍然在後臺正在進行,直到執行結束程式才會終止。

18、kill命令終止後臺正在執行的程式和後臺休眠的程式

[root@centos6 ~]#ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.494 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.486 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.481 ms
^Z[1]   Terminated              ping 172.18.0.1  ---ctrl +z 轉為後臺休眠

[2]+  Stopped                 ping 172.18.0.1
[root@centos6 ~]#jobs 
[2]+  Stopped                 ping 172.18.0.1
[root@centos6 ~]#kill %2   ---2是jobs的編號

[2]+  Stopped                 ping 172.18.0.1
[root@centos6 ~]#jobs  ---顯示已經終止
[2]+  Terminated              ping 172.18.0.1
[root@centos6 ~]#ps aux |grep ping  ---檢視程式已經查不到了
root       4867  0.0  0.0 103328   884 pts/0    S+   20:05   0:00 grep ping

對於後臺正在執行的程式,此種方法也可以使用,先用jobs查一下編號,然後用kill %jobnum 就可以終止在後臺執行的程式,此種方法必須在同一個終端,因為jobs只能顯示在本終端的作業。

19 centos6和centos7斷網後的區別

[root@centos6 ~]#ping 172.18.0.1&
斷網後恢復
[root@centos6 ~]#ps aux|grep ping  ---發現仍然在後臺執行
root       4958  0.0  0.0 103268   744 ?        S    20:20   0:00 ping 172.18.0.1
root       4985  0.0  0.0 103328   884 pts/2    S+   20:21   0:00 grep ping
[root@centos6 ~]#pstree -p  
init(1)─┬─atd(1681)
        ├─auditd(1424)───{auditd}(1425)
        ├─automount(1505)─┬─{automount}(1506)
        │                 ├─{automount}(1507)
        │                 ├─{automount}(1522)
        │                 └─{automount}(1525)
        ├─crond(1666)
        ├─dhclient(1367)
        ├─master(1652)─┬─pickup(4767)
        │              └─qmgr(1659)
        ├─mingetty(1694)
        ├─mingetty(1696)
        ├─mingetty(1698)
        ├─mingetty(1700)
        ├─mingetty(1702)
        ├─mingetty(1704)
        ├─ping(4958)  ---發現程式仍然在進行
        ├─rsyslogd(1446)─┬─{rsyslogd}(1447)
        │                ├─{rsyslogd}(1448)
        │                └─{rsyslogd}(1449)
        ├─sshd(1573)─┬─sshd(4691)───bash(4696)
        │            └─sshd(4960)───bash(4964)───pstree(4988)
        └─udevd(576)─┬─udevd(1711)
                     └─udevd(1712)
[root@redhat7 app]#ping 172.18.0.1&
斷網後恢復
[root@redhat7 ~]#ps aux |grep ping   --發現已經查不到了
root       5684  0.0  0.0 112660   972 pts/0    S+   20:21   0:00 grep --color=auto ping

總結:centos6中後臺執行的程式即使斷網了恢復後仍然在後臺執行,但centos7卻不可以。

相關文章