«

进程

指尖二进制 • 1 年前 • 861 次点击 • LINUX


什么是进程?
进程是已启动的可执行程序的运行实例,进程有以下组成部分:
已分配内存的地址空间;
安全属性,包括所有权凭据和特权;
程序代码的一个或多个执行线程;
进程状态;

下图所示的是进程的生命周期:

描述如下:
父进程复制自己的地址空间(fork [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
centos5或6PID为1的进程是:init
centos7PID为1的进程是:systemd
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
自己的理解:父进程退出了,子进程没有退出,那么这些子进程就没有父进程来管理了,就变成僵尸进程。

进程的属性
进程ID(PID):是唯一的数值,用来区分进程
父进程的ID(PPID)
启动进程的用户ID(UID)和所归属的组(GID)
进程状态:状态分为运行R、休眠S、僵尸Z
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU占用量)

使用ps查看进程工具
a: 显示跟当前终端关联的所有进程
u: 基于用户的格式显示(U: 显示某用户ID所有的进程)
x: 显示所有进程,不以终端机来区分


注: 最后一列[xxxx]使用方括号括起来的进程是内核态的进程。 没有括起来的是用户态进程。

上面的参数输出每列含意:


它们含意如下:
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示进程是控制进程
l: 表示进程是多线程的
+: 表示当前进程运行在前台

START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运作的时间。
COMMAND:该程序的实际指令

ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP信号,挂起一个进程。将作业放置到后台(暂停)
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销

ps常用的参数: ps -ef
-e 显示所有进程
-f 显示完整格式输出

UID启动这些进程的用户
PID进程的ID
PPID父进程的进程号
c进程生命周期中的CPU利用率
STIME进程启动时的系统时间
TTY表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME运行进程一共累计占用的CPU时间
CMD启动的程序名称

注:
ps aux 是用BSD的格式来显示进程。
ps -ef 是用标准的格式显示进程。

lsof命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;

[root@localhost ~]# ps -aux|grep a.txt|grep -v grep
root       1618  0.0  0.4 151492  4888 pts/0    T    10:55   0:00 vim a.txt
[root@localhost ~]# lsof -p 1618    #一般用于查看木马进程,在读哪些文件
[root@localhost ~]# lsof -i:22      #用于查看端口,或查看黑客开启的后门端口是哪个进程在使用

pstree工具使用
pstree:(display a tree of processes)以树状图显示进程,只显示进程的名字,且相同进程合并显示。
格式:pstree 或 pstree -p
以树状图显示进程,还显示进程PID。

[root@localhost ~]# pstree -p

Linux后台进程与前台进程的区别
前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随着消失;
后台进程: 也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要与终端交互,Linux的大多数服务器就是用守护进程实现的。比如,Web服务器httpd等。

进程的前台与后台运行
跟系统任务相关的几个命令(了解):

&用在一个命令的最后,可以把这个命令放到后台执行
ctrl + z将一个正在前台执行的命令放到后台,并且暂停
jobs查看当前有多少在后台运行的进程.它是一个作业控制命令
fg(foreground process)将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg(background process)将一个在后台暂停的命令,变成继续执行; 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

恢复被挂起的进程

[root@localhost ~]# vim a.txt
[root@localhost ~]# ps -aux|grep vim |grep -v grep
[root@localhost ~]# jobs 
[1]+  已停止               vim a.txt
[root@localhost ~]# fg 1
vim a.txt

kill关闭进程
关闭进程3个命令:kill killall pkill
kill关闭进程:kill 进程号 关闭单个进程
killall和pkill 命令用于杀死指定名字的进程
通过信号的方式来控制进程的
kill -l ---> 列出所有支持的信号(了解) 用最多的是: 9 信号

信号编号

td>
信号编号信号名
1)SIGHUP重新加载配置
2)SIGINT键盘中断 crtl+c
3)SIGQUIT退出
9)SIGKILL强制终止
15)SIGTERM终止(正常结束),缺省信号
18)SIGCONT继续
19)SIGSTOP停止
20)SIGTSTP暂停 crtl+z

进程的优先级管理
优先级取值范围为(-20,19),越小优先级越高, 默认优先级是0
nice 指定程序的运行优先级
renice 改变程序的运行优先级

[root@localhost ~]# nice -n 5 vim a.txt

改变正在运行的进程的优先级

[root@localhost ~]# renice -10 4784
4784 (进程 ID) 旧优先级为 5,新优先级为 -10
还没收到回复