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
05-19 02:54