1. 进程
进程定义
- 进程是正在运行的程序的实例。
- 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
2. 进程运行的状态
3. ps命令
查看指定的进程:
ps [参数]
a ##关于当前环境的所有进程
x| -A ##所有进程
f ##显示进程从属关系
e ##显示进程调用环境工具的详细信息
l ##长列表显示进程的详细信息
u ##显示进程的用户信息
-a ##显示shell前台运行命令的进程,但不保函shell本身
现在进行测试:
3.1 单个参数的使用
ps a 显示现行终端机下的所有程序,包括其他用户的程序。
[root@study ~]# ps a
PID TTY STAT TIME COMMAND
1455 tty1 Ss+ 0:00 /usr/bin/Xorg :0 -background none -verbose -auth /run
1460 ttyS0 Ss+ 0:00 /sbin/agetty --keep-baud ttyS0 115200 38400 9600
1618 pts/0 Ss 0:00 -bash
1841 pts/0 R+ 0:00 ps a
ps -A | x :选择所有进程。与-e相同
[root@study ~]# ps -A
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 rcuob/0
10 ? 00:00:00 rcu_sched
11 ? 00:00:00 rcuos/0
12 ? 00:00:00 watchdog/0
ps -a :显示shell前台运行命令的进程,但不保函shell本身(显示所有终端机下执行的程序,除了阶段作业领导者之外)
[root@study ~]# ps -a
PID TTY TIME CMD
1935 pts/0 00:00:00 ps
ps -d :与A类似 ,没有允许环境(shell)
[root@study ~]# ps -d
PID TTY TIME CMD
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 rcuob/0
ps -e :选择所有进程。与-A相同
[root@study ~]# ps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 rcuob/0
ps x 显示所有输出设备终端的进程
[root@study ~]# ps x
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --system --d
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
5 ? S< 0:00 [kworker/0:0H]
7 ? S 0:00 [migration/0]
8 ? S 0:00 [rcu_bh]
ps f 显示进程的从属关系:
[root@study ~]# ps f
PID TTY STAT TIME COMMAND
1618 pts/0 Ss 0:00 -bash # 这个bash进程下的子进程是ps f 进程
1868 pts/0 R+ 0:00 \_ ps f
1455 tty1 Ss+ 0:00 /usr/bin/Xorg :0 -background none -verbose -auth /run
1460 ttyS0 Ss+ 0:00 /sbin/agetty --keep-baud ttyS0 115200 38400 9600
ps e :显示进程调用环境工具的详细信息(例LANG=en_US.UTF-8 USER=root)
[root@study ~]# ps e
PID TTY STAT TIME COMMAND
1455 tty1 Ss+ 0:00 /usr/bin/Xorg :0 -background none -verbose -auth /run
1460 ttyS0 Ss+ 0:00 /sbin/agetty --keep-baud ttyS0 115200 38400 9600 PATH
1618 pts/0 Ss 0:00 -bash XMODIFIERS=@im=ibus LANG=en_US.UTF-8 USER=root # 将使用的环境信息表示出来了
1885 pts/0 R+ 0:00 ps e XDG_SESSION_ID=1 HOSTNAME=study.example.com TERM
ps l :长列表显示进程的详细信息 (类似于查看文件时的ll)
[root@study ~]# ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1455 576 20 0 160732 17804 poll_s Ss+ tty1 0:00 /usr/bin/Xo
4 0 1460 1 20 0 110004 832 n_tty_ Ss+ ttyS0 0:00 /sbin/agett
4 0 1618 1616 20 0 116144 2764 wait Ss pts/0 0:00 -bash
0 0 1909 1618 20 0 121260 984 - R+ pts/0 0:00 ps l
ps u:显示进程的用户信息(直接显示USER是谁)
[root@study ~]# ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1455 0.0 1.8 160732 17804 tty1 Ss+ 23:05 0:00 /usr/bin/Xorg :
root 1460 0.0 0.0 110004 832 ttyS0 Ss+ 23:05 0:00 /sbin/agetty --
root 1618 0.0 0.2 116144 2764 pts/0 Ss 23:06 0:00 -bash
root 1918 0.0 0.1 123356 1324 pts/0 R+ 23:31 0:00 ps u
3.2 常用组合
ps aux :显示系统当中的所有进程并显示进程用户
[root@study ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 50468 4000 ? Ss 23:05 0:01 /usr/lib/system
root 2 0.0 0.0 0 0 ? S 23:05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 23:05 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 23:05 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 23:05 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 23:05 0:00 [rcu_bh]
USER | 进程的属主; |
---|---|
PID | 进程的ID; |
PPID | 父进程; |
%CPU | 进程占用的CPU百分比; |
%MEM | 占用内存的百分比; |
NI | 进程的NICE值,数值大,表示较少占用CPU时间; |
VSZ | 进程使用的虚拟內存量(KB); |
RSS | 该进程占用的固定內存量(KB)(驻留中页的数量); |
TTY | 该进程在那個終端上運行(登陸者的終端位置),若與終端無關,則顯示(?)。若为pts/0等,则表示由网络连接主机进程 |
WCHAN | 当前进程是否正在進行,若为-表示正在進行; |
START | 该进程被触发启动时间; |
TIME | 該进程實際使用CPU運行的时间; |
COMMAND | 命令的名称和参数; |
解释stat中的含义:
D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换 (从内核2.6开始无效);
X 死掉的进程 (基本很少見);
Z 僵尸进程;
< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组;
ps ef 显示当前系统当中所有父子关系的进程,列出他的详细信息
[root@study ~]# ps ef
PID TTY STAT TIME COMMAND
1618 pts/0 Ss 0:00 -bash XMODIFIERS=@im=ibus LANG=en_US.UTF-8 USER=root
2219 pts/0 R+ 0:00 \_ ps ef XDG_SESSION_ID=1 HOSTNAME=study.example.com
1455 tty1 Ss+ 0:00 /usr/bin/Xorg :0 -background none -verbose -auth /run
1460 ttyS0 Ss+ 0:00 /sbin/agetty --keep-baud ttyS0 115200 38400 9600 PATH
pstree:显示当前系统的进程树
[root@study ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─agetty
├─alsactl
├─at-spi-bus-laun─┬─dbus-daemon
│ └─3*[{at-spi-bus-laun}]
并不是父级进程结束以后子进程一定会结束 :
- 剩下的子进程叫孤儿进程 ,因为父级进程被强行关闭 ,这样会影响系统的正常运行
- 正常应该先结束子进程,再结束父进程
一般由系统的初始化程序来控制其他进程的开始和结束:
- 可以用pstree查看系统的进程树(父进程和子进程关系一目了然)
- systemd为初始化程序,是所有程序的父级程序,不会自己关闭结束自己。
- 只有关机才可以,或者结束了所有子进程以后,该初始化进程才会被关闭
3.3 显示指定信息
我们可以通过要求显示指定的信息:
ps ax -o %cpu,%mem,user,group,comm,nice,pid,stat ##指定显示进程的某些信息
%cpu ##显示进程cpu负载
[root@study ~]# ps ax -o %cpu
%CPU
0.0
0.0
0.0
0.0
0.0
%mem 显示进程内存负载
[root@study ~]# ps ax -o %mem
%MEM
0.4
0.0
0.0
0.0
0.0
0.0
0.0
user 进程用户
[root@study ~]# ps ax -o user
USER
root
root
root
root
root
root
group 进程组
[root@study ~]# ps ax -o group
GROUP
root
root
root
root
comm 进程名称
[root@study ~]# ps ax -o comm
COMMAND
systemd
kthreadd
ksoftirqd/0
kworker/0:0H
nice 进程优先级
[root@study ~]# ps ax -o nice
NI
0
0
0
-20
-
pid 进程的id
[root@study ~]# ps ax -o pid
PID
1
2
3
5
7
8
9
stat 进程状态
[root@study ~]# ps ax -o stat
STAT
Ss
S
S
S<
3.4 进程排序
格式为:
ps ax --sort=%men -o %men(升序)
ps ax --sort=-%men -o %men(降序)
进行测试:
不跟-o:
[root@study ~]# ps ax --sort=%mem
PID TTY STAT TIME COMMAND
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
5 ? S< 0:00 [kworker/0:0H]
7 ? S 0:00 [migration/0]
8 ? S 0:00 [rcu_bh]
跟上-o:
[root@study ~]# ps ax --sort=%mem -o %mem
%MEM
0.0
0.0
0.0
0.0
0.0
倒叙查看:
[root@study ~]# ps ax --sort=-%mem -o %mem
%MEM
10.1
2.1
1.9
1.8
1.6
1.6
1.2
第一部分表示显示所有进程
第二部分表示对mem内存或者cpu占用进行排序, -表示降序
第三部分表示只显示mem内存或者cpu占用情况
测试:memory +5 pid 显示内存当中前五个的pid
[root@study ~]# ps ax --sort=-%mem -o pid | head -n 6 # 倒数前5个
PID
1554
479
1493
1455
1707
[root@study ~]# ps ax --sort=%mem -o pid | head -n 6 # 正数前5个
PID
2
3
5
7
8
3.5 调整进程的优先级
进程的优先级范围: -20~19 数字越大优先级越高
优先级的查看:ps ax -o pid,nice,comm
[root@study ~]# ps ax -o pid,nice,comm
PID NI COMMAND
1 0 systemd
2 0 kthreadd
3 0 ksoftirqd/0
5 -20 kworker/0:0H
7 - migration/0
怎样调整进程的优先级:
命令设定进程优先级,以下都是直接在shell里面输入命令即可:
指定某个优先级开启进程(先指定,后开启),nice -n 优先级数字 进程名称
比如:
nice -n 5 vim 开启vim并且指定该程序的优先级为5
[root@study ~]# nice -n 5 vim
[root@study ~]# ps a -o stat,comm,pid,nice
STAT COMMAND PID NI
Ss+ Xorg 1455 0
Ss+ agetty 1460 0
Ss bash 1618 0
Ss bash 2469 0
SN+ vim 2507 5 # 指定该程序的优先级为5
R+ ps 2508 0
改变进程的优先级(先开启,后改变)
renice -n 优先级数字 进程pid
renice -n -5 2507 改变2507进程的优先级为-5
[root@study ~]# ps a -o stat,comm,pid,nice
STAT COMMAND PID NI
Ss+ Xorg 1455 0
Ss+ agetty 1460 0
Ss bash 1618 0
Ss bash 2469 0
S+ vim 2548 0 # 之前的优先级
R+ ps 2549 0
[root@study ~]# renice -n -5 2548
2548 (process ID) old priority 0, new priority -5
[root@study ~]# ps a -o stat,comm,pid,nice
STAT COMMAND PID NI
Ss+ Xorg 1455 0
Ss+ agetty 1460 0
Ss bash 1618 0
Ss bash 2469 0
S<+ vim 2548 -5 # 修改之后的优先级
R+ ps 2551 0