[Linux]——程式管理相關

Jelly_lyj發表於2017-03-18

一些概念

程式program:通常以二進位制程式放置在儲存媒介中,以物理檔案形式存在

程式process:程式通過使用者執行被觸發後,執行者的許可權與屬性、程式的程式碼和所需資料會被載入到記憶體中,OS給予這個記憶體單元一個識別符號(PID)。可以說,程式就是一個正在執行的程式。

 

程式是如何產生的?

                

 

父/子程式

PPID與PID:

登入Linux後我們會取得一個bash的shell,而Linux之所以被稱為一個“多使用者環境”,就是因為每個人登陸後取得的shell的PID不同。

而用這個bash提供的介面去執行另一些指令程式,也會觸發成為PID。他們之間這種“我中產生了你”關係,我們就稱作父程式和子程式。

[root@centos1 ~]# bash   # bash下再觸發一個新bash
[root@centos1 ~]# ps -l  # 在這個bash下再觸發ps命令
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 126053 126049  0  80   0 - 27117 wait   pts/3    00:00:00 bash
0 S     0 127272 126053  0  80   0 - 27117 wait   pts/3    00:00:00 bash
4 R     0 127289 127272  0  80   0 - 27033 -      pts/3    00:00:00 ps

 

父子程式互相間的呼叫:

                                     

 

常駐系統中的程式:

有很多觸發的指令程式都是執行完就很快終止了的,但系統總要有一些服務各使用者任務的功能需要一直常駐在記憶體中執行。我們稱之為“服務(daemon)”

系統的服務非常的多, 不過主要大致分成系統本身所需要的服務,例如crond 、 atd、rsyslogd 等等。還有一些則是負責網路連線的服務,例如 Apache, named, postfix, vsftpd等等

 

Job Control

jobs  檢視job

-l:列出PID
-s:僅列出在後臺處於暫停狀態stop的job
-r:僅列出在後臺處於執行狀態run的job

 &  將job放到後臺去“執行”

[root@centos1 ~]# tar -zvpcf /tmp/py3.tar.gz /py3 >/tmp/log.txt 2>&1 &
[1] 128365
[root@centos1 ~]# echo "aa"    #128365這個job放到後臺後,我們可以在前臺做任意別的job
aa
[1]+ Done tar -zvpcf /tmp/py3.tar.gz /py3 > /tmp/log.txt 2>&1 #當128365執行完它會出現Done

Ctrl+z   將當前的job放到後臺中“暫停”Stopped

[root@centos1 ~]# vim  ~/.bashrc
^Z
[1]+ Stopped                 vim ~/.bashrc
[root@centos1 ~]# find / -print
^Z 
[2]+  Stopped                 find / -print

[root@centos1 ~]# jobs -l
[1]- 128722 Stopped vim ~/.bashrc
[2]+ 128754 Stopped find / -print

bg  把後臺Stopped的job重新再後臺Running起來(bg=backgroup)

[root@centos1 ~]# find / -perm +7000 >/tmp/text.txt
^Z
[3]+ Stopped find / -perm +7000 > /tmp/text.txt

[root@centos1 ~]# jobs; bg %3; jobs
[1]- Stopped vim ~/.bashrc
[2] Stopped find / -print
[3]+ Stopped find / -perm +7000 > /tmp/text.txt
[3]+ find / -perm +7000 > /tmp/text.txt &
[1]+ Stopped vim ~/.bashrc
[2] Stopped find / -print
[3]- Running find / -perm +7000 > /tmp/text.txt &

fg  將後臺Stopped的job放回到前臺(fg=foregroup)
fg %jobnumber

[root@centos1 ~]# jobs -l
[1]- 128722 Stopped vim ~/.bashrc
[2]+ 128754 Stopped find / -print
[root@centos1 ~]# fg %1 
#回到vim ~/.bashrc的介面
# ctrl+z
[1]+ Stopped vim ~/.bashrc
[root@centos1 ~]# jobs -l
[1]+ 128722 Stopped vim ~/.bashrc
[2]- 128754 Stopped find / -print

kill  管理後臺當中的job

-9    強制刪除一個job

-15  以正常的程式方式終止一個job

[root@centos1 ~]# jobs -l    
[1]+ 128722 Stopped                 vim ~/.bashrc
[2]  128754 Stopped                 find / -print
[root@centos1 ~]# kill %2 ; jobs
[1]+  Stopped                 vim ~/.bashrc
[2]   Stopped                 find / -print
[2]   Terminated              find / -print
[root@centos1 ~]# jobs -l       
[1]+ 128722 Stopped                 vim ~/.bashrc
[root@centos1 ~]# kill -9 %1 ; jobs 
[1]+  Stopped                 vim ~/.bashrc
[1]+  Killed                  vim ~/.bashrc

 

ps 命令

ps aux輸出資訊:

[root@centos1 ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   8863   8859  0  80   0 - 27117 wait   pts/0    00:00:00 bash
4 R     0   9090   8863  0  80   0 - 27035 -      pts/0    00:00:00 ps
[root@centos1 ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19360  1376 ?        Ss   Aug27   0:09 /sbin/init
root          2  0.0  0.0      0     0 ?        S    Aug27   0:00 [kthreadd]

 

F process flags程式標識,說明許可權

4:表示許可權為root

1:表示此程式僅能進行復制而服務執行

USER 程式屬於哪個使用者  
PID 程式PID  
%CPU 程式使用掉的CPU資源百分比  
%MEM 程式佔用掉的實體記憶體百分比  
VSZ 程式使用掉的虛擬記憶體量(KB)  
RSS 程式佔用掉的固定記憶體量(KB)  
TTY 程式是在哪個終端機上執行的

pts/n:遠端登入則顯示動態終端視窗

pts/0:表示網路連線進主機的程式

tty1-tty6:表示本機登入的程式

?:表示與終端機無關

STAT 程式當前的狀態

D 不可中斷 uninterruptible sleep (usually IO)
R 執行 runnable (on run queue)
S 中斷 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process

<:高優先順序
n:低優先順序
s:包含子程式
+:位於後臺的程式組

START 程式被觸發啟動的時間  
TIME 程式實際使用cpu的時間  
PRI priority 程式執行優先順序 數值越小表示優先順序越高
NI Nice    程式執行優先順序  
SZ 此程式用掉多少記憶體  
WCHAN 表示此程式是否執行中 -:表示正在執行中
ADDR 表示程式在記憶體的哪一個部分 -:running程式
COMMAND/CMD 所執行的命令command和引數arguments <defunct>:表示此程式為殭屍程式

 

例項1:顯示所有程式資訊
[root@centos1 ~]# ps -A
   PID TTY          TIME CMD
     1 ?        00:00:09 init
     2 ?        00:00:00 kthreadd
     3 ?        00:00:00 migration/0
     4 ?        00:00:01 ksoftirqd/0
     5 ?        00:00:00 migration/0
     6 ?        00:00:03 watchdog/0

例項2:顯示指定使用者資訊
[root@centos1 ~]# ps -u root
   PID TTY          TIME CMD
     1 ?        00:00:09 init
     2 ?        00:00:00 kthreadd
     3 ?        00:00:00 migration/0
     4 ?        00:00:01 ksoftirqd/0
     5 ?        00:00:00 migration/0
     6 ?        00:00:03 watchdog/0

例項3:顯示所有程式資訊,包括命令列,常配合grep使用
[root@centos1 ~]# ps -ef 
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 Aug27 ?        00:00:09 /sbin/init
root          2      0  0 Aug27 ?        00:00:00 [kthreadd]
root     126304   1523  0 02:35 ?        00:00:00 sshd: root@notty 
root     126308 126304  0 02:35 ?        00:00:00 /usr/libexec/openssh/sftp-server
postfix  130724   1614  0 08:12 ?        00:00:00 pickup -l -t fifo -u

[root@centos1 ~]# ps -ef |grep ssh
root 994 126053 0 08:30 pts/3 00:00:00 grep ssh root 1523 1 0 Aug27 ? 00:00:00 /usr/sbin/sshd root 126049 1523 0 02:34 ? 00:00:01 sshd: root@pts/3 例項4:僅檢視自己的bash相關的程式 [root@centos1 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 R 0 1076 126053 0 80 0 - 27025 - pts/3 00:00:00 ps 4 S 0 126053 126049 0 80 0 - 27118 wait pts/3 00:00:00 bash 例項5:列出正在記憶體中的所有程式 [root@centos1 ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 19360 1376 ? Ss Aug27 0:09 /sbin/init root 2 0.0 0.0 0 0 ? S Aug27 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Aug27 0:00 [migration/0] root 126053 0.0 0.2 108472 2056 pts/3 Ss 02:34 0:00 -bash root 126304 0.0 0.4 100376 4044 ? Ss 02:35 0:00 sshd: root@notty root 126308 0.0 0.2 57708 2252 ? Ss 02:35 0:00 /usr/libexec/openssh/sftp- postfix 130724 0.0 0.3 81380 3408 ? S 08:12 0:00 pickup -l -t fifo -u

 

priority/niceness

1.優先順序(priority):核心控制;動態變化;使用者不能直接調整大小;值越小越先被cpu執行。

2.優先順序(niceness):固定值;可被修改;和pr有關係:pr(新)=pr(老)+nice;
                                       root使用者可設定的niceess值範圍(-20—19)、自己或他人的程式、隨意調整;
                                       普通使用者可設定的niceness值範圍(0—19)、自己的程式、只能調高;

3.Nice優先順序調整和設定:
  (1) nice --10
  (2) renice -10
  (3) 在top中按r

 

top | htop 命令 

《top詳解》

# top -b -n 2 >/tmp/top.txt    執行兩次top並輸出到文字中

htop下載:https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/htop-1.0.3-1.el6.x86_64.rpm

 

echo $$  獲得當前bash的PID

[root@centos1 software]# echo $$
126053
[root@centos1 software]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 R     0   2861 126053  0  80   0 - 27026 -      pts/3    00:00:00 ps
4 S     0 126053 126049  0  80   0 - 27118 wait   pts/3    00:00:00 bash
[root@centos1 software]# top -d 2 -p 126053
top - 09:30:04 up 4 days, 10:00,  3 users,  load average: 0.00, 0.00, 0.00
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.5%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   894620k used,   109792k free,   117988k buffers
Swap:  1022968k total,    17988k used,  1004980k free,   244112k cached
   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                              
126053 root      20   0  105m 2052 1552 S  0.0  0.2   0:00.41 bash   

 

pstree 顯示程式樹

# pstree
# pstree -Aup

 

pgrep 根據特定條件查詢PID資訊

-P  +父程式(PPID) 可找到此父程式下所有子程式
-l 列出程式名稱
-u  +使用者名稱 查詢以這個使用者身份執行的程式
-t 根據程式所在的終端進行查詢

 

 

相關文章