进程管理
进程
什么是进程?
进程(Process)是一个可执行程序的运行实例,是程序的运行过程,动态的,有生命周期的运行状态。是分配资源的实体,是资源分配的基本单位。
进程的特性
动态性:进程是一个程序运行的实例,而系统中有许多程序,程序的运行是动态的,需要时开启,不需要时关闭。而进程是跟随程序的运行产生的,所以它会动态的产生,动态的消亡。 并发性:程序是可以多个同时运行的,所以进程也是如此,可以多个进程同时执行而互不影响 独立性:进程是可以独立运行互不影响的,同时也是系统分配资源的独立单位; 异步性:多个进程同时运行时,系统资源占用就会很高,为了节省资源空间,进程会在需要时运行,不需要是在后台休眠,即进程按各自独立的、不可预知的速度向前推进 结构特征:进程由程序、数据和进程控制块三部分组成
cpu中断:即计算机处于执行期间,系统内发生了非寻常或非预期的急需处理事件,CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,处理完毕后返回原来被中断处继续执行。协程(异步):目的是节省资源空间。
线程
线程是什么?
线程是进程中一个控制序列,每个进程都最少有一个线程,线程是调度的基本单位。在linux中线程也是一个轻量级的进程。
进程与线程的区别
1,进程与进程之间资源是独立的,互不影响的,即使一个进程崩溃也不会影响另一个进程。而线程与线程之间大部分资源是共享的,一个线程崩溃会导致一个进程随之崩溃。
2,在多个进程中,因为同进程下的线程之间资源大部分是共享的,所以在进程与进程之间切换比线程与线程之间切换所花费的开销要大。
3,创建和销毁进程慢,创建和销毁线程则比之要快
4,进程与进程之间存在上下级关系(父进程与子进程),而线程与线程之间是平级关系
查看进程
查看静态进程
语法:ps aux
参数:
a:显示一个终端的全部进程
u:显示进程的归属用户及内存的使用情况
x:显示没有控制终端的进程
-l:以长格式显示更加详细的信息
-e:显示所有进程
-f:完整格式显示,显示进程之间的父子关系
ps -le 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
ps -ef 与-le相似
ps -l 只能查看当前shell产生的进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER :进程所属用户
PID:进程id
%CPU:该进程占用cpu资源百分比
%MEM:该进程占用物理内存的百分比
VSZ:该进程占用虚拟内存的大小,单位为KB
RSS:该进程占用实际物理内存的大小,单位为KB
TTY :该进程在那个终端运行
tty1~tty7:代表本地终端,其中tty1~tty6是本地的字符界面终端,tty7是本地的图形化界面终端
pts/0~255:代表虚拟终端(也叫伪终端),一般为远程链接终端。
?表示没有占用终端
STAT:进程状态
-D:不可中断睡眠
-S:可中断睡眠 Sleep
-R:该进程正在运行
-T:停止状态,可能是在后台暂停或处于除错状态
-Z:僵尸状态,进程已经终止,但还有部分资源未回收导致部分进程任未终止
-l:多线程
-s:包含子进程
进程状态--了解 Sl 以线程的方式运行 Ss s进程的领导者,父进程 R+ +表示是前台的进程组 S< <优先级较高的进程 SN N优先级较低的进程
START:该进程的启动时间
TIME:该进程占用CPU的运算时间
COMMAND:产生该进程的命令
[root@localhost ~]# ps -le F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
表头 | 代表意义 | 表头 | 代表意义 |
---|---|---|---|
F | 进程标志,代表进程权限。1表示进程可以复制,但不能被执行,4表示进程使用超级用户权限 | NI | 进程的优先级,数值越小优先级越高,越早被cpu执行 |
S | 进程状态,与“ps aux”中的STAT状态一至 | ADDR | 该进程在内存的那个位置 |
UID | 运行此进程的用户ID | SZ | 该进程占用多大的内存 |
PID | 此进程的ID | WCHAH | 该进程是否在运行,'-'表示在运行 |
PPID | 该进程的父进程的ID | TTY | 该进程由那个终端运行 |
C | 该进程占用CPU资源的百分比 | TIME | 该进程占用CPU的运算时间 |
PRI | 进程的优先级,数值越小优先级越高,越早被cpu执行 | CMD | 产生该进程的命令 |
查看pid
pgrep 进程名
pidof 进程名
ps aux | grep 进程名
例:ps aux | grep sshd
#查看所有名字中包含sshd的进程
ps aux | grep sshd| grep -v grep
#与上一条命令相似,但可以过滤掉grep的进程信息,-v:不显示过滤内容(取反)
查看端口
查看端口的命令:ss,netstat
查看端口是否被占用:lsof -i:$port #lsof需要安装,yum install lsof
参数详解:
-a 显示全部的进程 -u 显示udp -n 以数字的形式显示协议名称 -t tcp -p:显示进程的名称和pid -l :只显示正在被监听的端口
<span style="background-color:#f8f8f8"><span style="color:#333333">Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
参数解释:
recv-Q:网络接收队列。表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
send-Q:网路发送队列。对方没有收到的数据或者说没有Ack的,还是本地缓冲区.如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。
Foreign Address:与本机端口通信的外部请求</span></span>
示例:lsof -i:22 #查看22端口是否被占用,22默认为sshd(远程连接服务)占用
查看当前登陆的用户(也可以查看cpu的负载均衡):w
<span style="background-color:#f8f8f8"><span style="color:#333333">21:20:30 up 1 day, 8:01, 1 user, load average: 0.09, 0.06, 0.05
执行w的时间 虚拟机状态 虚拟机运行时间 当前有几个用户 CPU负载均衡:1分钟,5分钟,15分钟
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHA
用户名 终端信息 当前登录用户的主机名或IP地址 当前用户登陆的时间 当前进程的选项及参数
==============================================================================
计算cpu负载:load average的三个值: 0.09, 0.06, 0.05,分别除cpu的个数,得出的值,如果值大于1那么那时候的负载高。</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">端口:
http 80
https 443
mysql 3306
redis 6379
tomcat 8080
nginx|httpd 80|443
sshd 22
mongo 27017
php-fpm 9000
mail 25|465</span></span>
查看当前用户登录的终端:tty
查看动态进程
top #动态查看进程,每三秒刷新一次
htop #需要安装,yum install -y htop
[root@linux-server ~]# top h|? 帮助
往下翻页
< 往上翻页
M 按内存排序
P 按cpu排序
q 退出
z 彩色显示
w 保存
PR 优先级,数值越小优先级越高 VIRT 进程使用的虚拟内存总量,单位kb。 RES 进程使用的、未被换出的物理内存大小,单位kb。 SHR 共享内存大小,单位kb
top命令的第一行与w命令的第一行十分相似,除了top第一行的第一个是top命令本身,还有第一行的其余项与w命令的一致
Tasks:任务
total:表示当前系统中存活的进程数
running:表示当前正在运行的进程数
sleeping:表示当前可中断休眠的进程数
stopped:表示当前已暂停的进程数
zombie:表示当前处于僵尸状态的进程数
%CPU(s):CPU使用率
us:用户态,用户空间占用cpu的百分比
sy:系统内核空间占用cpu的百分比
ni:niced 改变过优先级的进程占用cpu的百分比
id:cpu空闲率
wa:cpu等待硬盘写入,IO wait IO等待占用cpu的百分比
hi:硬中断(Hardware IRQ),处理硬件中断占用cpu的百分比
si:软终端(software),处理软件中断占用cpu的百分比
st:被虚拟化软件(hypervisor)偷取的cpu百分比,即 CPU 时间被虚拟化软件用于宿主机操作的百分比。
KiB Mem:内存状态
total:实际物理内存总量
free:可供使用的內存总量
used:正在被使用的内存总量
buff/cache:缓冲内存量
KiB Swap:交换分区
total:实际交换分区总量
free:可供使用的交换分区总量
used:正在被使用的交换分区总量
avail Mem :可交换分区总量
进程优先级 nice
<span style="background-color:#f8f8f8"><span style="color:#333333">nice 值越高:表示优先级越低,例如<span style="color:#981a1a">+</span><span style="color:#116644">19</span>,该进程容易将CPU 使用量让给其他进程。
nice 值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。</span></span>
修改进程优先级
<span style="background-color:#f8f8f8"><span style="color:#333333">renice <span style="color:#0000cc">-n</span> <span style="color:#0000cc">-10</span> pid</span></span>
进程控制
按进程pid杀死进程
<span style="background-color:#f8f8f8"><span style="color:#333333">语法:kill [信号] pid
kill -l #查看所有信号
常用信号:
-1 #重新加载进程或配置文件,pid不变
-9 #强制杀死进程
-15 #终止进程(可默认不写该信号)
-18 #激活进程
-19 #挂起进程</span></span>
进程状态解释--了解: +:表示运行在前台的进程 S+:休眠状态 T+:暂停,挂起状态 s:父进程
按进程名杀死进程
<span style="background-color:#f8f8f8"><span style="color:#333333">语法:pKill 进程名
例:pkill sleep #终止进程名为sleep的所有进程
例:pkill -9 sleep #强制杀死进程名为sleep的所有进程</span></span>
作业控制
作业控制之jobs:
作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程或者放到后台去运行,等一会儿再继续执行该进程。
<span style="background-color:#f8f8f8"><span style="color:#333333">语法:jobs #显示作业的状态。列出活动的作业。列出停止的作业。</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">#将在后台执行的作业移动到前台
语法:fg %工作号 </span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">#将在前台执行的作业移动到后台
bg %工作号 #创建作业后,作业与前台执行,此时要CTRL+Z暂停进程,此时在输入bg命令
作业还未创建,但已知需要将作业移动至后台执行:
例:sleep 6000 &</span></span>
作业控制拓展
将在前台执行的作业移动到后台,是工作中比较常用的,将作业放置后台执行时,即使远程链接的终端突然断开,改作业的进程也不会应此受到影响,提高了安全与稳定性。
除上面两种使用方法外,还有一种,如下:
<span style="background-color:#f8f8f8"><span style="color:#333333">语法:nohup sleep 作业 &
例:nohup java -jar demo.jar &
#将启动 Java 程序的命令放置于后台执行,nohup.out 是 nohup 命令默认创建的文件,用于存储程序的输出,该文件在执行命令的工作空间下自动生成。</span></span>
常用命令
查看内存使用
<span style="background-color:#f8f8f8"><span style="color:#333333">free (选项)
常用选项:-m(以mb为单位显示) -g(以gb为单位显示,内存较少时该方式误差大) -k(以kb为单位显示)</span></span>
查看系统版本和内核版本
<span style="background-color:#f8f8f8"><span style="color:#333333">uname -a #显示全部信息
uname -r #只显示系统版本和内核版本
只局限于红帽(redhat)发行版的Linux系统
cat /etc/redhat-release
cat /etc/centos-release</span></span>
查看CPU负载
<span style="background-color:#f8f8f8"><span style="color:#333333">uptime,w,top</span></span>
查看用户登陆历史和虚拟机重启记录
last #可以看到用户登录的历史记录,包括:用户名,登录的终端名,登录IP,登录的时间,还有重启的时间
lastlog #可以查看系统中已存在的用户(/etc/passwd)那些登陆过系统,包括:用户名,登录的终端名,登录IP,最后一次登录的时间。