LiangGaRy-学习笔记-Day13
1、Linux进程
1.1、进程概述
进程:资源分配的最小单位
- 程序执行的过程
线程:程序执行的最小单位
- 一个线程只属于一个进程,一个进程又有多个线程
程序:
- 这个是静态的,指令;
1.2、进程的作用
- 分配内存空间
- 安全属性包括所有权凭据和特权;
- 进程状态
- 二进制文件: .usr/bin/sshd 程序
- 进程:程序运行的状态
Linux中有两种进程
- 前台进程:
- 是一种交互的状态,比如是vim
- 后台进程:
- 放在后台执行;
- 守护进程;
- 进程管理:init控制
进程如何描述:
- 有pid, 用作进程的唯一标识
- 有自己的内存空间
- 文件系统资源
- 进程打开文件资源数组
- 信号相关 资源
- kill 9 nginx -->9就是一个信号
CentOS6 —>进程管理—>init管理
CentOS7–>pid进程管理–>systemd管理
僵尸进程:
- 父进程产生了子进程;父进程退出了,子进程没有退出–>这种就是僵尸进程
1.3、进程的属性
进程ID–>PID–>用于区分进程
父进程ID–>PPID–》
- 启动进程的用户ID–>这里就是UID
- 启动进程的用户组–>这里就是GID
进程的状态:
- 运行–>R
- 休眠–>S
- 僵尸–>Z
进程执行也有优先级
- 进程所连接的终端名
- 进程资源占用:
- 占用资源大小;–>内存、CPU的占用量
如何管理进程?
- 查看所有运行的进程
- 查看进程消耗的资源
- 定位个别进程并且对其执行指定操作
- 改变进程的优先级
- 杀死指定进程
- 限制进程可用的系统资源等
2、进程管理
使用命令进行进程的管理;
2.1、ps命令
作用:列出当前运行了哪些进程
语法:
- ps + 选项
选项:
- a:显示跟当前终端关联的所有进程
- u:基于用户的格式显示(U: 显示某用户ID所有的进程)
- x:显示所有进程,不以终端机来区分
- -l:长格式显示
- -A:显示所有的进程数据
- -a:显示所有用户的所有进程(包括其他用户)
- -j:工作模式
- -f:格式化输出
- -e 显示所有进程
#查看进程
[root@Node1 ~]# ps aux | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 190824 3752 ? Ss 10:14 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 10:14 0:00 [kthreadd]
...............
#-l参数
[root@Node1 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 6633 6631 0 80 0 - 28859 do_wai pts/0 00:00:00 bash
0 R 0 6676 6633 0 80 0 - 38309 - pts/0 00:00:00 ps
#常见的用法:
[root@Node1 ~]# ps -elf | grep sshd
4 S root 6364 1 0 80 0 - 28189 poll_s 10:14 ? 00:00:00 /usr/sbin/sshd -D
[root@Node1 ~]# ps -aux |grep bash
root 6633 0.0 0.1 115436 2036 pts/0 Ss 10:57 0:00 -bash
ps命令就是用于查看进程相关的;
- 它输出的内容也需要有一定的了解
[root@Node1 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 6633 6631 0 80 0 - 28859 do_wai pts/0 00:00:00 bash
0 R 0 6689 6633 0 80 0 - 38309 - pts/0 00:00:00 ps
#内容输出说明
[root@Node1 ~]# ps aux |head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 190824 3752 ? Ss 10:14 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 10:14 0:00 [kthreadd]
.............
#输出说明
user -->启动进程的用户
PID -->进程的ID
%cpu -->进程占用cpu的百分比
%mem -->内存
VSZ -->进程占用虚拟内存的大小
RSS -->进程占用物理内存的大小
TTY -->在哪个终端上运行
-? 表示与终端无关
tty1表示用第一个终端显示
STAT -->进程的状态显示
#这里状态说明一下
R:表示运行,正在运行或者运行队列中等待
S:表示睡眠,休眠中, 受阻, 在等待某个条件的形成或接受到信号
I:表示空闲
Z:僵死进程;进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放
D:不可中断进程;收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
T:停止进程;进程收到SIGSTOP、SIGSTP、SIGTIN、SIGTOU信号后停止运行运行
P:等待交换页面
W:无驻留页没有足够的记忆体分页可分配
X:死掉的进程
<:高优先级进程
N:低优先序的进程
L:内存锁页 Lock有记忆体分页分配并缩在记忆体内
s:进程的领导者(在它之下有子进程)
l:多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+:位于后台的进程组
RSTZD -->时间相关
START -->该process被触发启动的时间;
TIME -->该process实际使用CPU运作的时间。
COMMAND -->该程序的实际指令
- ps -elf 输出解释如下
[root@Node1 ~]# ps -elf |head
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 47706 ep_pol 10:14 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 10:14 ? 00:00:00 [kthreadd]
#输出的解释如下:
UID: 启动这些进程的用户
PID: 进程的ID
PPID: 父进程的进程号
C: 进程生命周期中的CPU利用率
STIME: 进程启动时的系统时间
TIME: 运行进程一共累计占用的CPU时间
date1 -date2
CMD: 启动的程序名称
ps aux 是用BSD的格式来显示进程。
ps -ef 是用标准的格式显示进程
2.2、uptime命令
作用:用于查看服务器的数值
语法:uptime
[root@Node1 ~]# uptime
13:53:29 up 3:39, 1 user, load average: 0.00, 0.01, 0.05
#输出信息解释如下:
13:53:29 #当前的时间
up 3:39 #当前系统运行了多少个小时
1 user #多少个用户在登陆
load average: 0.00, 0.01, 0.05 #服务器在1分钟、5分钟和15分钟的负载
#案例说明
每个CPU的任务数大于5,需要介入处理
每个CPU的当前活动进程数不大于3那么系统的性能就是良好
服务器1: load average: 0.15, 0.08, 0.01 1核
服务器2: load average: 4.15, 6.08, 6.01 1核
服务器3: load average: 10.15, 10.08, 10.01 4核
如果服务器的CPU为1核心
则load average中的数字 >=3 负载过高,
如果服务器的CPU为4核心,
则load average中的数字 >=12 负载过高
2.3、watch命令
作用:watch 命令以周期性的方式执行给定的命令,并全屏显示执行结果
语法:watch + 选项 + 命令
选项:
- -d:高亮显示最近两次更新之间的差异。
- -n:指定监测间隔
- -p:尝试精确地按照指定的间隔进行一次命令监视
- -t:关闭 watch 命令在顶部的时间间隔、命令、当前时间的输出
#查看执行
[root@Node1 ~]# watch uptime
[root@Node1 ~]# watch -d "ls -l |grep log"
2.4、lsof命令
作用:lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)
语法:lsof + 选项
选项:
- -i:指定条件,列出符合条件的信息
- -p:指定进程号,列出指定进程号所打开的文件
#直接查看
[root@Node1 ~]# lsof | head -3
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 234 64 /
systemd 1 root rtd DIR 253,0 234 64 /
#上述列出的信息解释如下:
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。
#文件描述符讲解:
cwd:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,
er:fd信息错误
jld:监控目录
ltx:共享库文本
mxx:十六进制内存映射类型号
m86:DOS合并映射文件
mem:内存映射文件
mmap:内存映射设备
pd:父目录
rtd:跟目录
tr:内核跟踪文件
v86 VP/ix mapped file(VP/IX映射文件);
0:表示标准输出
1:表示标准输入
2:表示标准错误
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
#指定查看端口号
[root@Node1 ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 6364 root 3u IPv4 36220 0t0 TCP *:ssh (LISTEN)
sshd 6364 root 4u IPv6 36222 0t0 TCP *:ssh (LISTEN)
2.5、lsof恢复误删除文件
文件删除的原理:
- 在Linux文件系统中,文件实际上是指向索引节点的链接,该索引节点包含文件的属性;
- rm命令删除文件时,将删除指向其索引节点的链接,但不指向索引节点的链接。其他进程仍可以将其打开。
- 如果某个进程仍打开了文件,那么数据就在某个地方,即使根据列出的目录,该文件似乎已经消失了
- 而事实上:Linux进程伪文件系统/ proc目录在这里生效
- 系统上的每个进程都有一个带有其名称的目录,其中包含许多内容,
- 例如:文件描述符,它是一个子目录,包含指向该进程已打开的所有文件的链接。
- 即使文件已从文件系统中删除,该数据的副本也将在那里:
实验如下:
##查看/var/log/messages文件-->使用lsof命令查看
[root@Node1 ~]# lsof | grep /var/log/messages
rsyslogd 6365 root 6w REG 253,0 1347593 17101440 /var/log/messages
in:imjour 6365 6375 root 6w REG 253,0 1347593 17101440 /var/log/messages
rs:main 6365 6381 root 6w REG 253,0 1347593 17101440 /var/log/messages
#查看一下数据
[root@Node1 ~]# head -3 /var/log/messages
May 18 08:12:09 Node0 journal: Runtime journal is using 8.0M (max allowed 99.0M, trying to leave 148.5M free of 982.2M available → current limit 99.0M).
May 18 08:12:09 Node0 kernel: Initializing cgroup subsys cpuset
May 18 08:12:09 Node0 kernel: Initializing cgroup subsys cpu
#然后直接删除数据
[root@Node1 ~]# rm /var/log/messages
rm: remove regular file ‘/var/log/messages’? y
#删除的操作会在进程里面体现出来
[root@Node1 ~]# lsof | grep /var/log/messages
#这里的输出可以知道-->在/proc目录下的6365文件夹里边-->有个6w-->6的数据
rsyslogd 6365 root 6w REG 253,0 1347593 17101440 /var/log/messages (deleted)
in:imjour 6365 6375 root 6w REG 253,0 1347593 17101440 /var/log/messages (deleted)
rs:main 6365 6381 root 6w REG 253,0 1347593 17101440 /var/log/messages (deleted)
[root@Node1 ~]# ls /proc/6365/fd/
0 1 2 3 4 5 6 7 8 9
#直接恢复数据
[root@Node1 ~]# cat /proc/6365/fd/6 >/var/log/messages
[root@Node1 ~]# head -3 /var/log/messages
May 18 08:12:09 Node0 journal: Runtime journal is using 8.0M (max allowed 99.0M, trying to leave 148.5M free of 982.2M available → current limit 99.0M).
May 18 08:12:09 Node0 kernel: Initializing cgroup subsys cpuset
May 18 08:12:09 Node0 kernel: Initializing cgroup subsys cpu