概述
在Linux中,触发任何一个事件时,系统会将该事件的执行者、权限、程序代码等加载到一个内存中去,然后给这块内存一个标识符,这块内存就可以说是一个进程,内存标识符就是PID
了。一般来说,正在运行的程序就是一个进程。
进程查看
ps命令
ps命令可以将当前系统中所有的进程状态打印到终端,该命令有许多的参数,可通过man ps
来查看其详细用法,这里只列举几个常用参数.
如果只是查看当前bash的进程信息,则使用ps -l
:
jyq@ubuntu:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 4340 2726 0 80 0 - 5668 wait pts/6 00:00:00 bash
0 R 1000 4385 4340 0 80 0 - 7229 - pts/6 00:00:00 ps
jyq@ubuntu:~$
-l
表示格式化输出长信息,输出的每个自段子如下:
F:进程标识
S:进程状态,有R(Running)、S(Sleep)、D(不可被唤醒)、T(Stop)、Z(Zombie)
PID:进程id
PPID:父进程ID
C:CPU使用率
PRI:进程优先级
NI:同PRI
ADDR:该进程在内存中的位置
SZ:使用了多少内存
WCHAN:当前进程是否运行中,-表示在运行中
TTY:登录终端,如果远程登录或虚拟终端登录使用动态终端接口
TIME:使用CPU的时间
CMD:触发此进程的命令
如果要打印当前系统所有的进程,则使用ps -lA
:
jyq@ubuntu:~$ ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 46363 - ? 00:00:33 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 I 0 4 2 0 60 -20 - 0 - ? 00:00:00 kworker/0:0H
ps aux
和ps -ef
也可以打印全部进程,前者是BSD格式,后者是标准格式,如:
jyq@ubuntu:~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.3 185452 6140 ? Ss 13:52 0:22 /sbin/init aut
root 2 0.0 0.0 0 0 ? S 13:52 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< 13:52 0:00 [kworker/0:0H]
字段意义如下:
USER:用户账号
PID:进程ID
%CPU:该进程使用的CPU百分比
%MEN:该进程使用的内存百分比
VSZ:该进程使用的虚拟内存
RSS:该进程占用的固定内存大量
TTY:该进程所登录的终端,tty1-tty6,如果是虚拟终端或远程终端登录,显示pty
STAT:该进程当前的状态
START:该进程启动时间
TIME:该进程使用CPU时间
COMMAND:该进程的时机命令
其中STAT字段的值有如下几种:
D:无法中断的休眠状态
R:正在运行可中在队列中可过行的;
S:处于休眠状态;
T:被作乐控制信号停止
X 死掉的进程(很少见)
Z 失效(“僵尸”)进程,终止但未被回收
< 优先级高的进程
N 优先级低的进程
L 进程中有页面被锁进内存;
s 进程的领导者
l 进程中存在多线程;
+ 处于前台进程组中
top命令
ps
命令查看进程时是静态的,而top
命令则是动态的。
top
命令将为当前运行的进程提供一个动态的、实时的视图,如果不指定执行的次数,则将一直执行下去,直到按q键退出,更多命令请man top
,这里只列举常用的参数。
top -d [secs] | -bnp
d:后接秒数,指定整个界面更细的时间,默认5s。
n:后接次数,指定top运行的次数,如果不指定,将一直运行下去
p:后接pid,查看某个pid的进程状态
b:以批处理的方式执行top,一般和-n连用将结果输出至文件
如:
$ top -d 2 # 每2秒刷新一次界面
$ top -n 3 # 刷新3次后退出top程序
$ top -n 3 -p 1839 # 只查看pid为1839的进程,刷新3次后退出
$ top -b -d 1 -n 2 > test.log # 将结果输出到文件中
pstree命令
pstree
命令将以树的形式显示当前运行的进程。常用参数如下:
pstree [-A|U] [-up]
-A:以ASCII码字符来绘制树
-U:以utf-8的字符来绘制树
-u:显示对应进程的uid
-p:显示对应进程的pid
如:
# 使用ASCII字符来连接树
jyq@ubuntu:~$ pstree -Aup
systemd(1)-+-ModemManager(844)-+-{gdbus}(950)
| `-{gmain}(948)
|-NetworkManager(842)-+-dhclient(4835)
| |-dnsmasq(1003,nobody)
| |-{gdbus}(947)
| `-{gmain}(942)
# 使用utf-8字符来连接树
jyq@ubuntu:~$ pstree -Uup
systemd(1)─┬─ModemManager(844)─┬─{gdbus}(950)
│ └─{gmain}(948)
├─NetworkManager(842)─┬─dhclient(4835)
│ ├─dnsmasq(1003,nobody)
进程的管理
进程的互相管理,就是通过给予进程一个信号,告知让进程去做什么。
可通过kill -l
命令查看所有的信号,这些信号含义就不一一说明了,常见的几个信号含义如下:
1) SIGHUP:启动被终止的进程
2) SIGINT:终止当前进程,相当于ctrl+c
9) SIGKILL:强制杀死一个进程
15) SIGTERM:正常结束该进程
19) SIGSTOP:暂停该进程,相当于ctrl+z
结束进程
kill 命令
kill
命令用于给对应PID的进程发送信号,使用如下:
kill -signal PID
如要强制杀死PID为4253的进程时:
$ kill -9 4253
kill
命令由于需要用到PID,因此和ps
等命令配合使用。
killall命令
killall
命令则用于给指定名字的进程发送信号,使用如下:
killall -signal commandname
如杀死当前所有的bash进程:
$ killall -9 bash
调整进程优先级
在使用top
命令时,列出的PRI和NI列表示进程的优先级,PRI值越小,则优先级越高,然而,这个PRI值由内核进行动态调整,用户是无法进行调整的。如果想要调整进程的优先级,则可以调整NI字段的值,其关系如下:
PRI(new) = PRI(old) + NI
调整NI值,有两个命令:
- 1.给定一个优先级运行进程:
nice -n command
- 2.修改正在运行的进程优先级:
renice [number] PID
如:我们先运行vim /etc/passwd
,查看该进程信息:
$ ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 7959 7751 0 80 0 - 13445 poll_s pts/4 00:00:00 vim
现在PRI为80,NI为0,现在来使用nice命令在执行vim时给定一个优先级:
# 给定优先级执行 vim /etc/passwd
nice -n 18 vim /etc/passwd
再来查看进程信息:
$ ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 8007 7751 1 98 18 - 13445 poll_s pts/4 00:00:00 vim
此时可以通过renice
命令来修改vim进程的优先级,如:
$ renice 19 8007
8007 (process ID) old priority 18, new priority 19
再来查看进程信息:
$ ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 8007 7751 0 99 19 - 13445 poll_s pts/4 00:00:00 vim
但需要注意的是:
- 1.NI可调整的范围为-20~19;
- 2.普通用户只能调高NI数,且可调整范围为0~19,往低调时会出现
Permission denied
提示,避免抢占系统资源; - 3.root用户可随意调整NI值。
参考资料:《鸟哥的Linux私房菜》