linux進程管理


0.進程處理方式

standalone    獨立運行

xinetd  進程托管

atd、crond計划任務

 

(1)獨立運行:

  一直在獨立運行,比如apache、nginx服務器,一直在監聽80端口的請求,有了請求可以馬上響應,由於一直在監聽所以一直在占用CPU資源。服務啟動后一直在系統駐留,等待客戶訪問並能很快應答。

[root@VM_0_12_centos ~]# netstat -ano | grep "LISTENING" |more  #查看監聽狀態的端口
unix  2      [ ACC ]     STREAM     LISTENING     9471     /run/systemd/private

 

 

(2)xinetd 托管進程

  不會一直在系統中駐留,會交給xinetd托管,當有請求的時候xinetd調用進程。占用資源少,但是響應時間也慢。

(3)atd、crond計划任務    就是定期定時執行任務

  沒有辦法精確到秒,因為at,crond執行任務的時候不像standalone一直在監聽請求,也不會像xinetd有請求就啟動進程回應,它們的處理方式是每隔一分鍾醒來一次查看計划任務列表中是否有計划,有就執行,沒有就繼續休眠。

 

1.進程和程序的區別

  程序是經驗概念,本身作為一種軟件資源長期保存,而進程是程序是執行過程,它是動態概念,有一定的生命周期,是動態產生和消亡的。

  程序和進程無一一對應關系,一個程序可以由多個進程共有;另外,一個進程在活動中可以有序的執行若干個程序。

2.父進程和子進程的概念

1.子進程是一個由父進程所產生的進程,產生這個子進程的進程成為父進程。

2.在linux中,系統使用fork創建進程。fork復制的內容包括和堆棧段以及父進程的進程環境

3.父進程終止子進程自然終止。

  如果父進程終止,死了子進程沒死,這種進程成為孤兒進程,子進程的父進程ID會自動指向init進程(PID為0)

  如果子進程死亡,父進程存活,這種進程稱為僵屍進程。

3.前台進程和后台進程:

  前台進程:在shell中輸入一條命令,創建一個子進程,運行命令,shell等待命令退出,然后返回給用戶提示。這條命令與shell異步運行,用戶 在完成之前不能執行另一條命令。例如如下命令,在沒有給出結果之前我們不能執行其他操作:

[root@VM_0_12_centos ~]# find / -name init

 

 

  后台進程:在shell提示處打出命令,隨后給一個&,shell創建的子進程運行此命令,但不等待命令退出,而直接返回到對童虎提示,這條命令與shell命令同步運行,即在后台運行。后台進程是非交互式的。例如我們可以將上面查找命令后面加一個&標識符,並將結果重定向到一個文件中,這個進程就是后台進程:

[root@VM_0_12_centos ~]# find / -name init > ./test.find &

 

 

4.進程狀態:

 

 

 

 

 

 

 4.進程狀態查看的命令: ps

   ps命令用於報告當前系統的進程狀態。可以搭配kill指令隨時中斷、刪除不必要的程序。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。

   ps(選項)

 

常用選項:

  a:顯示所有用戶的進程

  u:顯示用戶名和啟動時間

  x:顯示沒有控制終端的進程

  e:顯示所有進程,包括沒有控制終端的進程

  l:采用詳細的格式來顯示程序狀況。

  w:寬行顯示,可以使用多個w進程寬行顯示。

例如:

(1)查看屬於當前用戶自己的進程信息:

[root@VM_0_12_centos ~]# ps
  PID TTY          TIME CMD
 5819 pts/0    00:00:00 bash
 6493 pts/0    00:00:00 ps

 

(2)查看屬於自己的進程詳細信息: ps -l或者ps -u(一般用  ps -le  顯示的信息更詳細)

[root@VM_0_12_centos ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  5819  5817  0  80   0 - 29042 wait   pts/0    00:00:00 bash
0 R     0  6499  5819  0  80   0 - 34343 -      pts/0    00:00:00 ps

 

 

[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3485  0.0  0.1 115508  2120 pts/0    Ss   12:12   0:00 -bash
root      3509  0.0  0.1 115508  2084 pts/1    Ss   12:13   0:00 -bash
root      3529  0.0  0.1 187520  2336 pts/1    S    12:13   0:00 su qlq
root      3627  0.0  0.0 151052  1836 pts/0    R+   12:13   0:00 ps -u
root     30845  0.0  0.1 115380  2112 tty1     Ss+  Mar30   0:00 -bash

 

PID:進程ID

PPID:父進程ID

TTY:登錄的終端(本地為tty,遠程為pts)

STATE:進程當前狀態

  S:休眠,D:不可中斷的休眠狀態,R:運行狀態,Z:僵死狀態,T:停止狀態。

NI:進程優先級 

 TIME:進程自啟動以來占用cpu時間

CMD:進程的命令

USER:用戶名

%CPU:占用CPU時間和總時間的百分比

%MEM:占用內存和系統總內存的百分比

 

 (3)查看所有用戶執行的進程的詳細信息:ps -le  顯示的是UID或者 ps -aux 會顯示進程的所屬用戶名字,最好加more分頁顯示:

[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -aux | more
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  43252  3432 ?        Ss   Mar29   0:07 /usr/lib/syste
d/systemd --switched-root --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    Mar29   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Mar29   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   Mar29   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S    Mar29   0:00 [migration/0]
root         8  0.0  0.0      0     0 ?        S    Mar29   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        R    Mar29   0:08 [rcu_sched]

 

[root@VM_0_12_centos sshDemo]# ps -le | more
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 - 30759 ep_pol ?        00:00:42 systemd
1 S     0     2     0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0     3     2  0  80   0 -     0 smpboo ?        00:00:10 ksoftirqd/0

 

 

 

 

(4)一般使用是加管道過濾:(例如查看和apache的httpd相關進程)

[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -aux | grep http
root       977  0.0  0.2 226224  5184 ?        Ss   Mar29   0:03 /usr/sbin/httpd
 -DFOREGROUND
qlq       4919  0.0  0.0 112644   968 pts/1    R+   12:17   0:00 grep --color=au
to http
apache   14260  0.0  0.1 226360  3744 ?        S    Mar30   0:00 /usr/sbin/httpd
 -DFOREGROUND
apache   14261  0.0  0.1 226360  3748 ?        S    Mar30   0:00 /usr/sbin/httpd
 -DFOREGROUND
apache   14262  0.0  0.1 226360  3748 ?        S    Mar30   0:00 /usr/sbin/httpd
 -DFOREGROUND
apache   14263  0.0  0.1 226360  3748 ?        S    Mar30   0:00 /usr/sbin/httpd
 -DFOREGROUND
apache   14264  0.0  0.1 226360  3740 ?        S    Mar30   0:00 /usr/sbin/httpd
 -DFOREGROUND
apache   31451  0.0  0.1 226360  3748 ?        S    Mar30   0:00 /usr/sbin/httpd
 -DFOREGROUND
apache   31509  0.0  0.1 226360  3748 ?        S    Mar30   0:00 /usr/sbin/httpd
 -DFOREGROUND

 

 

 (5)如果希望按某一順序排序:

[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -le --sort pid | more #按pid排序
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 - 10813 ep_pol ?        00:00:07 systemd
1 S     0     2     0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0     3     2  0  80   0 -     0 smpboo ?        00:00:00 ksoftirqd/0
1 S     0     5     2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0     7     2  0 -40   - -     0 smpboo ?        00:00:00 migration/0
1 S     0     8     2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_bh

 

 

 (6)查看某一用戶的進程:

[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -uU qlq #查看qlq用戶的進程信息
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
qlq       3530  0.0  0.1 115380  2108 pts/1    S    12:13   0:00 bash
qlq       5806  0.0  0.0 151052  1832 pts/1    R+   12:20   0:00 ps -uU qlq

 

 

 (7)查看系統的進程樹信息: pstree

[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ pstree #查看進程樹
systemd─┬─AliYunDun───15*[{AliYunDun}]
        ├─AliYunDunUpdate───3*[{AliYunDunUpdate}]
        ├─aliyun-service
        ├─atd
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon
        ├─httpd───7*[httpd]
        ├─java───27*[{java}]
        ├─login───bash
        ├─miniserv.pl
        ├─mysqld_safe───mysqld───23*[{mysqld}]
        ├─ntpd───ntpd
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd─┬─sshd───bash───su───bash───pstree
        │      └─sshd───bash
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tmpnam_epbkCH
        ├─tuned───4*[{tuned}]
        ├─wipefs───5*[{wipefs}]
        └─wrapper─┬─java───13*[{java}]
                  └─{wrapper}

 

 

 5.進程殺死命令  kill

1. 為什么要殺死進程?

該進程占用了過多的cpu時間

該進程鎖住了一個終端,其他嵌套進程無法運行。

運行時間過長但沒有效果

產生了過多到屏幕或者磁盤文件的輸出

無法正常退出程序。

2 kill用法:

 kill pid  直接殺死進程

kill -9 pid   強制殺死進程

kill -1 pid 重啟進程

killall 進程名   可以關閉所有進程名相同的進程

例如:

(1)查看httpd相關進程

[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd
4 S     0   977     1  0  80   0 - 56556 poll_s ?        00:00:03 httpd
5 S    48 14260   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14261   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14262   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14263   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14264   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 31451   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 31509   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd

 

 (2)殺死pid為31509的進程:

[root@iz2ze46xi6pjjj69ailg9lz ~]# kill 31509   #殺掉pid為31509的進程
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd
4 S     0   977     1  0  80   0 - 56556 poll_s ?        00:00:03 httpd
5 S    48 14260   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14261   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14262   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14263   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14264   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 31451   977  0  80   0 - 56590 inet_c ?        00:00:00 httpd

 

 (3)如果我們想殺死所有與httpd相關的進程,我們可以殺死其父進程,其父進程pid為977(父進程死亡,子進程也全部死亡)

[root@iz2ze46xi6pjjj69ailg9lz ~]# kill -9 977  #殺死PID為977的進程
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd
5 S    48 14260     1  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14261     1  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14262     1  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14263     1  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 14264     1  0  80   0 - 56590 inet_c ?        00:00:00 httpd
5 S    48 31451     1  0  80   0 - 56590 inet_c ?        00:00:00 httpd

 

  殺死其父進程我們發現其父進程ID自動轉為1,也就是變成孤兒進程。等過一會又會自動死亡。 

 

(4)killall  殺死名稱相同的進程:

[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd
4 S     0 11155     1  0  80   0 - 56556 poll_s ?        00:00:00 httpd
5 S    48 11157 11155  0  80   0 - 56556 inet_c ?        00:00:00 httpd
5 S    48 11158 11155  0  80   0 - 56556 inet_c ?        00:00:00 httpd
5 S    48 11159 11155  0  80   0 - 56556 inet_c ?        00:00:00 httpd
5 S    48 11160 11155  0  80   0 - 56556 inet_c ?        00:00:00 httpd
5 S    48 11161 11155  0  80   0 - 56556 inet_c ?        00:00:00 httpd
[root@iz2ze46xi6pjjj69ailg9lz ~]# killall httpd      #殺死名為httpd的進程
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd

 

 

(5)/proc目錄簡介:

注意:

  /proc存儲的數據在內存鏡像中,存的主要是進程的信息,每個數字對應的是PID的進程信息,也存放了系統的基本信息,數據是動態的:

[root@iz2ze46xi6pjjj69ailg9lz ~]# ls /proc/
1      19    28     40    92           fb           meminfo       sysrq-trigger
10     2     2844   41    978          filesystems  misc          sysvipc
10277  212   2855   429   982          fs           modules       timer_list
10649  213   2865   452   997          interrupts   mounts        timer_stats
1085   232   2866   456   acpi         iomem        mtrr          tty
11473  233   29     460   buddyinfo    ioports      net           uptime
11912  234   3      5     bus          irq          pagetypeinfo  version
12     235   30838  529   cgroups      kallsyms     partitions    vmallocinfo
1213   2359  30845  532   cmdline      kcore        sched_debug   vmstat
13     237   31993  60    consoles     keys         schedstat     zoneinfo
1348   25    32063  7     cpuinfo      key-users    scsi
14     252   326    7366  crypto       kmsg         self
15     2533  344    8     devices      kpagecount   slabinfo
16     259   37     8072  diskstats    kpageflags   softirqs
1651   26    373    8075  dma          loadavg      stat
17     260   38     8838  driver       locks        swaps
18     27    39     9     execdomains  mdstat       sys

 

 

 (6)查看服務進程號  pgrep   服務名稱

[root@iz2ze46xi6pjjj69ailg9lz ~]# pgrep httpd
12678
12680
12681
12682
12683
12684

 

 因此重啟httpd服務變得很簡單:

[root@iz2ze46xi6pjjj69ailg9lz ~]# kill -1 `pgrep httpd`

 

(7)pkill 服務名稱   根據服務名稱殺死所有相關進程:

[root@iz2ze46xi6pjjj69ailg9lz ~]# pkill httpd

 

 

 (8)nice和renice指定進程優先級

 

 

 (9)nohup命令  用戶退出后仍繼續執行命令

  使用戶退出登錄后仍繼續執行,nohup命令將執行后的數據和信息默認保存到文件nohup.out中

格式:

  nohup program &

 

 

 例如:我們想查詢所有以conf結尾的文件,然后寫到nohup.out文件中。(默認會寫,如果加上重定向不會寫。)

[root@VM_0_12_centos ~]# nohup find / -name *.conf &

 

 

 6.進程的掛起和結束:

掛起:Ctrl+Z

終止: Ctrl +C

 

jobs  查看被掛起的進程

 

fg   恢復到前台繼續執行

bg   恢復到后台執行

 

例如:

[root@VM_0_12_centos ~]# top  #執行top命令
  
top - 13:17:14 up 11 days,  3:59,  1 user,  load average: 0.44, 0.14, 0.12
Tasks:  89 total,   1 running,  88 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.2 sy,  0.0 ni, 99.0 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1883844 total,   157056 free,   115172 used,  1611616 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1569072 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root      20   0   41104   3372   2192 S  0.0  0.2   0:38.78 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:10.07 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:+
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
    8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S  0.0  0.0   0:44.25 rcu_sched
   10 root      rt   0       0      0      0 S  0.0  0.0   0:03.31 watchdog/0
   12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs
   13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns
   14 root      20   0       0      0      0 S  0.0  0.0   0:00.14 khungtaskd
   15 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback
   16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd
   17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset
   18 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kblockd
   19 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 md
   25 root      20   0       0      0      0 S  0.0  0.0   0:00.57 kswapd0
   26 root      25   5       0      0      0 S  0.0  0.0   0:00.00 ksmd
   27 root      39  19       0      0      0 S  0.0  0.0   0:02.23 khugepaged
   28 root      20   0       0      0      0 S  0.0  0.0   0:00.04 fsnotify_m+
   29 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 crypto
   37 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kthrotld
   39 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kmpath_rda+
   40 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kpsmoused
   41 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 ipv6_addrc+
   60 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 deferwq
  102 root      20   0       0      0      0 S  0.0  0.0   0:06.57 kauditd
  219 root      20   0       0      0      0 S  0.0  0.0   0:04.25 kworker/u2+
  220 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 ata_sff
  222 root      20   0       0      0      0 S  0.0  0.0   0:00.00 scsi_eh_0
  224 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 scsi_tmf_0
  228 root      20   0       0      0      0 S  0.0  0.0   0:00.00 scsi_eh_1
  230 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 scsi_tmf_1
  241 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 ttm_swap
[1]+  Stopped                 top  #按下Ctrl+Z掛起命令
[root@VM_0_12_centos ~]# jobs  #查看被掛起的命令
[1]+  Stopped                 top
[root@VM_0_12_centos ~]#fg 1     #在前台啟動被掛起的top命令

 

 

7.top命令查看進程的信息:  進程狀態顯示和控制,每5s中自動刷新一次(動態顯示)

top - 13:20:21 up 11 days,  4:02,  2 users,  load average: 0.06, 0.11, 0.12
Tasks:  93 total,   1 running,  92 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1883844 total,   151244 free,   120668 used,  1611932 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1563372 avail Mem

KiB Mem :  1883844 total,   152036 free,   119996 used,  1611812 buff/cache
 1850 root      20   0  717064   8420   2624 S  0.3  0.4   8:49.45 YDService
 1934 root      20   0  534612  10024   1824 S  0.3  0.5  25:58.77 barad_agent
    1 root      20   0   41104   3372   2192 S  0.0  0.2   0:38.79 systemd
.................

  顯示系統的信息,開機天數,登錄了2個用戶,內存信息UI及負載信息等

 

常用選項:(下面選項都是在輸入top之后命令執行中按對應按鍵)

  d: 指定刷新的時間間隔

  c:指定顯示整個命令行而不是顯示命令

  u:查看指定用戶的進程

  k:殺死執行中的進程

  h或者?:顯示幫助

  r:重新設置優先級

  s:改變刷新的時間間隔

  W;將當前設置寫入~/.toprc文件中

  Esc:退出編輯回到top主界面。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM