什么是进程? 是程序在内存中的表现形式

进程是已启动的可执行程序的运行实例,是程序运行的过程, 动态的,有生命周期及运行状态。

进程和线程的区别

线程被称作轻量级进程,在进程中包含线程。进程有独立的内存空间,不同进 程间不能直接共享其他进程资源,同一个进程内的线程共享进程内存空间;相 比进程,线程切换对系统开销更小一些;进程是资源分配的最小单位,线程是 程序执行的最小单位。

静态查看进程

1
2
3
4
5
6
7
ps aux
参数解释:
ps :process nsapashot
a 只能查看系统里面运行的所有终端进程
u 显示进程拥有者
x 显示系统内所有进程
f 显示进程之间的父子关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@linux-server ~]# ps aux 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
============================================================================
USER: #运行进程的用户
PID: #进程ID
%CPU: #CPU占用率
%MEM: #内存占用率
VSZ 进程占用的虚拟内存大小
RSS 占用的物理内存大小
? 表示没有占用终端
STAT: #进程状态 ---了解
R 运行
S 可中断睡眠 Sleep
D 不可中断睡眠
T 停止的进程
Z 僵尸进程
X 死掉的进程
START: #进程的启动时间
TIME: #进程占用CPU的总时间
COMMAND: #进程文件,进程名
# 僵尸进程表示进程已经退出,但它的父进程还没有回收子进程占用的资源。短暂的僵尸状态通常不必理会,但进程长时间处于僵尸状态,就应该注意了,可能有应用程序没有正常处理子进程的退出。

# S 可中断睡眠 Sleep----类似于挂起,等待接收socket链接或者是一些信号从而重新被唤起
# D 不可中断睡眠 --不可中断状态,表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不允许其他进程或中断打断这个进程。 进程长时间处于不可中断状态,通常表示系统有 I/O 性能问题。
进程状态--了解
Sl 以线程的方式运行
Ss s进程的领导者,父进程
R+ +表示是前台的进程组
S< <优先级较高的进程
SN N优先级较低的进程

进程PID在1000以内的服务大多都是开机自动启动的(不完全是)!

查看单个进程的PID

1
2
3
4
[root@linux-server ~]# yum install -y httpd  #安装apache软件
[root@linux-server ~]# systemctl start httpd #启动
[root@linux-server ~]# cat /var/run/httpd/httpd.pid
1043

查看指定PID

1
2
3
[root@linux-server ~]# ps aux | grep sshd
root 1043 0.0 0.2 105996 4120 ? Ss 01:32 0:00 /usr/sbin/sshd -D
grep:过滤

查看端口

1
2
3
4
[root@linux-server ~]# yum install lsof  #安装软件包
[root@linux-server ~]# lsof -i:80 #端口号,这能查看带端口的进程
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 64249 root 4u IPv6 1373628 0t0 TCP *:http (LISTEN)
1
2
3
4
5
6
7
8
9
#查网络进程和正在监听的端口
[root@linux-server ~]# netstat -lntp (该命令对应的包名:net-tools)
参数详解:
-a 显示全部的进程
-u 显示udp
-n 以数字的新式显示协议名称
-t tcp
-p:显示进程的名称和pid
-l :只显示正在被监听的端口

动态查看进程

top

1
[root@linux-server ~]# top  #动态显示信息,三秒刷新一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
第一行,任务队列信息,同 uptime 命令的执行结果
系统时间:16:23:40
运行时间:up 1:57
当前登录用户: 3 user
在工作中必须监控的东西 load average(平均负载)等待cpu处理的队列长度 也是个数。
1分钟 第一个数字
5分钟 第二个数字
15分钟 第三个数字
计算cpu负载:load average的三个值: 0.10, 0.16, 0.12,分别除cpu的个数,得出的值,如果值大于1那么那时候的负载高。
第二行,Tasks — 任务(进程)
总进程:150 total, 运行:1 running, 休眠:149 sleeping, 停止: 0 stopped, 僵尸进程: 0 zombie
第三行,cpu状态信息
us :用户空间占用CPU的百分比
sy :内核空间占用CPU的百分比
ni :nice值
id: cpu空闲率
wa:cpu等待,等待输入/输出的进程占用的 CPU 百分比。如果使用率过高,表示硬盘该换了
hi:硬中断占用CPU的百分比
si:软中断占用CPU的百分比
第四行,内存状态
第五行,swap交换分区信息

top操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@linux-server ~]# top
h|? 帮助
> 往下翻页
< 往上翻页
M 按内存排序
P 按cpu排序
q 退出
z 彩色显示
W 保存
=============================
PID 进程ID
USER 运行进程的用户
PR 优先级 最终优先级=初始优先级(20)+nice值 #如PID为4的PR=20+(-20)=0
NI nice值
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。
SHR 共享内存大小,单位kb
S 进程状态
%CPU CPU占用率
%MEM 内存占用率
TIME+ 进程占用CPU的总时间
COMMAND 进程文件,进程名

进程优先级 nice

1
2
nice 值越高:表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。

进程控制

1
2
3
4
5
6
7
8
9
kill,pkill
语法: kill 信号 PID #信号也是进程间通信的一种方式,如果杀的是子进程,子进程死后父进程会再诞生出一个子进程,与之前杀掉的PID不同
pkill 信号 进程名(服务名) #pkill可以指定进程名,一次会把该进程的父进程子进程都干掉
[root@linux-server ~]# kill -l #查看所有信号
-1 HUP 重新加载进程或者重新加载配置文件,PID不变,一般用于修改了配置文件后不关闭重启服务使其生效
-9 KILL 强制杀死 #不管你在不在处理手中工作,直接杀死
-15 TERM 正常杀死(这个信号可以默认不写)#正常杀死就是他不会立即被杀死,他会先把自己手中工作处理完
-18 CONT 激活进程
-19 STOP 挂起(暂停)进程

作业控制

作业控制之jobs:

作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程或者放到后台去运行,等一会儿再继续执行该进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@linux-server~]# sleep 7000 &   #&:让命令或者程序后台运行
[1] 5441
[root@linux-server ~]# sleep 8000 #ctrl+z 把程序放到后台(这方法会让程序在后台暂停)
^Z
[2]+ Stopped sleep 8000

[root@linux-server ~]# jobs #查看后台的工作号
[1]- Running sleep 7000 &
[2]+ Stopped sleep 8000
[root@linux-server ~]# bg %2 #让暂停的程序在后台运行,%是用来修饰job number,2就是job number。(程序的工作号)
[2]+ sleep 8000 &
[root@linux-server ~]# jobs
[1]- Running sleep 7000 &
[2]+ Running sleep 8000 &

[root@linux-server ~]# fg %1 #将后台的程序调到前台
sleep 7000

[root@linux-server ~]# jobs
[2]+ Running sleep 8000 &
[root@linux-server ~]# kill -9 %2 #通过kill杀死进程
[root@linux-server ~]# jobs
[2]+ Killed sleep 8000
[root@linux-server ~]# jobs #再次查看没有了

#注:bgfg命令后可以省略%,直接加后台程序编号即可。但是kill -9后面的后台程序编号前必须要加%,否则不生效,会杀不死。

常用命令

1.查看当前CPU负载

1
2
[root@linux-server ~]# uptime 
17:35:01 up 16:02, 3 users, load average: 0.00, 0.02, 0.05

脚本中会常用到该命令,其实也就是top命令返回结果的第一行。但是top命令是动态的,他并不能在脚本中使用。

2.查看内存使用

1
2
3
4
5
6
7
8
9
[root@linux-server ~]# free -m 
total used free shared buff/cache available
Mem: 1984 154 1508 8 321 1632
Swap: 2047 0 2047

-m:单位M

echo 3 > /proc/sys/vm/drop_caches
#临时清理内存,有点类似于Windows的加速球,但是在工作当中应当谨慎使用,尤其是在公司的服务器配置不是很高时。

3.查看系统的版本和内核

1
2
3
4
5
6
[root@linux-server ~]# cat /etc/redhat-release  #查看版本
CentOS Linux release 7.4.1708 (Core)
[root@linux-server ~]# uname -a #看查正在运行的内核版本
Linux linux-server 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@linux-server ~]# uname -r #查看内核版本
3.10.0-693.el7.x86_64

4.修改主机名

1
2
3
4
5
6
7
8
方法一
[root@linux-server ~]# hostnamectl set-hostname xxxx #主机名,修改完之后断开与终端连接,然后在重新连接即可。或者直接bash回车即可。但是此方法修改主机名会有许多限制,如不支持大写、特殊字符和中文,名字长度有所限制等等。
方法二
[root@linux-server ~]# vim /etc/hostname
#直接在该文件中输入你想要的主机名,该方法修改主机名没有限制

查看主机名
[root@linux-server ~]# hostname