[Linux] Linux进程管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FightFightFight/article/details/81413631

概述

在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 auxps -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私房菜》

猜你喜欢

转载自blog.csdn.net/FightFightFight/article/details/81413631