基於Linux下的進程管理

進程:

定義:進程也就是cpu未完成的工作。這和我們windows裏面的進程概念基本類似。

ps命令:

ps

a                關於當前shell運行的所有進程

x | -A           所有進程,x顯示狀態-A不會。這是兩個命令

f                顯示進程從屬關係

e                顯示進程調用環境工具的詳細信息

l                長列表顯示進程的詳細信息

u                顯示進程的用戶信息

-a               顯示shell前臺運行命令的進程,但不包括shell本身

下圖ps a等命令由於進程過多就不展示結果了,命令的格式如下:


ps的相關命令操作:

[[email protected] Desktop]# whatis ps          查看ps命令的含義

ps (1)               - report a snapshot of the current processes.

ps (1p)              - report process status

[[email protected] Desktop]# ps

  PID TTY          TIME CMD

  886 pts/1    00:00:00 ps

 2791 pts/1    00:00:00 bash

[[email protected] Desktop]# ps a    關於當前shell運行的所有進程

  PID TTY      STAT   TIME COMMAND                             

[[email protected] Desktop]# ps ae  關於當前shell運行的所有進程運行環境的詳細信息

  PID TTY      STAT   TIME COMMAND

[[email protected] Desktop]# ps aef  關於當前shell運行的所有進程運行環境以及進程附屬關係(簡略顯示幾行,不然看起來太多太複雜)

  PID TTY      STAT   TIME COMMAND

[[email protected] Desktop]# ps -A | head -n 2 顯示所有進程

  PID TTY          TIME CMD

    1 ?        00:00:01 systemd

[[email protected] Desktop]# ps x | head -n 2  顯示所有進程,還有狀態顯示(與ps -A的區別)

  PID TTY      STAT   TIME COMMAND

    1 ?        Ss     0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 19

[[email protected] Desktop]# ps -a  顯示shell前臺運行命令的進程,但不包括shell本身

  PID TTY          TIME CMD

  904 pts/1    00:00:00 ps

 3067 pts/0    00:00:00 su

 3068 pts/0    00:00:00 bash

[[email protected] Desktop]# bash   重新打開shell

[[email protected] Desktop]# ps -a  顯示shell前臺運行命令的進程,但不包括shell本身

  PID TTY          TIME CMD

  905 pts/1    00:00:00 bash

  938 pts/1    00:00:00 ps

 3067 pts/0    00:00:00 su

 3068 pts/0    00:00:00 bash

ps -o %cpu,%mem,user,group,comm,nice,pid,stat           

指定顯示進程的某些信息

[[email protected] Desktop]# ps -o comm 指定顯示進程名稱。

COMMAND

bash

ps


bash

%cpu                                顯示進程cpu負載

%mem                                顯示進程內存負載

user                                 進程用戶

group                                進程組

comm                                 進程名稱

nice                                 進程優先級

pid                                  進程的id

stat                                 進程狀態

stat中顯示的信息

S                                    進程狀態

l                                    內存中有鎖定空間

N                                    優先級低

<                                    優先級高

+                                    前臺運行

s                                    頂級進程


ps ax -o %cpu,comm --sort <+|-%cpu > <+|-%mem>             按照進程信息排序

+                                             正序

-                                             倒序

%cpu                                          cpu負載排序

%mem                                          內存負載


具體操作演示:

[[email protected] Desktop]# ps ax --sort=%mem  按照內存負載排序

 PID TTY      STAT   TIME COMMAND

    2 ?        S      0:00 [kthreadd]

    3 ?        S      0:00 [ksoftirqd/0]


[[email protected] Desktop]# ps ax --sort=-%mem -o %mem  按照內存負載進行倒序排序

%MEM

20.9

 4.1


[[email protected] ~]# ps ax --sort=-%mem -o %mem,comm 按照內存負載進行倒序排序同時顯示進程名稱。

%MEM COMMAND

20.9 gnome-shell

 4.1 Xorg

[[email protected] ~]# ps ax --sort=-%cpu -o pid | head -n 6 | tail -n 5    ax所有程序 --sort=-%cpu按照cpu逆序排序  按照pid順序,方法一。

 1865

  595

    1

    2

    3

[[email protected] ~]# ps ax --sort=-%cpu -o pid,%cpu|awk 'NR<=6&&NR>=2{print}'   方法二。

 1865  0.7

  595  0.1

    1  0.0

    2  0.0

    3  0.0


進程優先級:

1.進程的優先級範圍

-20~19

2.優先級查看

ps ax -o pid,nice,comm

3.指定某個優先級開啓進程

nice -n 優先級數字 進程名稱

nice -n -5 vim &                         開啓vim並且指定程序優先級爲-5

4.改變進程優先級

reince -n                     優先級數字 進程pid

renice -n -5 1806              改變1806進程的優先級爲-5

相關具體操作:

[[email protected] ~]# renice -n 0 1128   改變1128的優先級爲0

1128 (process ID) old priority 0, new priority 0

[[email protected] ~]# renice -n -1 905      改變905的優先級爲-1

905 (process ID) old priority 0, new priority -1

下圖展示我們使用renice更改bash優先級之後,優先級從0變成了-6


[[email protected] ~]# nice -n -5 vim &       指定優先級建立文件

[1] 1148

[[email protected] ~]# renice -n -5 1159    改變1159的優先級爲-5

1159 (process ID) old priority -1, new priority -5

[[email protected] ~]# ps -o nice,comm,pid,stat 查看1159的優先級

 NI COMMAND           PID STAT

 -1 bash              905 S<

 -5 vim              1159 T<

 -1 ps               1163 R<

  0 bash             2791 Ss

[[email protected] ~]# nice -n 5 vim &     以-5的優先級建立文件

[1] 1164


環境中進程的前後臺調用:

[[email protected] Desktop]# jobs  查看被打入環境後臺的進程

[[email protected] Desktop]# fg 2  把序號2後臺進程調回前臺

bash: fg: 2: no such job

jobs                     查看被打入環境後臺的進程

ctrl+z                   把佔用終端的進程打入後臺

fg jobsnum               把後臺進程調回前臺

bg jobsnum               把後臺暫停的進程運行

comm &                   讓命令直接在後臺運行

相關具體命令操作:

[[email protected] ~]# gedit   佔用後臺打開一個文件

** (gedit:1339): WARNING **: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-Py9xsAJdi1: Connection refused

^Z

[1]+  Stopped                 gedit

[[email protected] ~]# jobs    查看被打入環境後臺的進程

[1]+  Stopped                 gedit

[[email protected] ~]# vim &     在後臺打開文件

[2] 1344

[[email protected] ~]# jobs    查看被打入環境後臺的進程

[1]-  Stopped                 gedit

[2]+  Stopped                 vim

[[email protected] ~]# bg 1    把後臺暫停的進程1運行

[1]- gedit &

[[email protected] ~]# fg 2    把後臺進程2調回前臺

vim

[[email protected] ~]# fg 1    把後臺進程1調回前臺

gedit

^Z

[1]+  Stopped                 gedit

[[email protected] ~]# jobs

[1]+  Stopped                 gedit

[[email protected] ~]# fg

gedit

^Z

[1]+  Stopped                 gedit


進程信號:

1.常用信號等級

1                                 進程不結束僅僅重新加載配置

2                                 刪除進程在內存中的數據

3                                 刪除鼠標在內存中的數據

9                                  強行結束單個進程(不能被阻塞)

15                                 正常關閉進程  (可能會被阻塞)

18                                 運行暫停的進程    

19                                 暫停某個進程  (不能被阻塞)

20                                 把進程打入後臺 (可以被阻塞)


man 7 signal           查看信號詳細信息

第二張圖爲信號的詳細信息:



kill -信號 進程pid                   結束單一進程


killall -信號 進程名字               結束同一名字的進程


pkill -u student -信號               切換到普通用戶關閉vim同時關閉student的shell