进程的基本概述

1
2
3
程序:它是一个静态的概念,开发人员写好的代码
进程:它是一个动态的概念,将程序运行起来的过程,就叫做进程
运行环境:能让程序正常运行的环境,对应开发语言写的代码,需要对应的环境来运行

注意:

1
2
1.当程序运行为进程后,系统会为该进程分配内存,以及运行的身份和权限。 
2.在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息。

进程的生命周期

image-20240424145131410

1
2
3
4
5
6
7
8
9
10
11
12
#进程/父进程:
- 等待:
1)有没有用户的新请求来
2)子进程是否处理完返回结果
#线程/子进程
1)处理请求
2)将结果返回给父进程
#进程状态:
1)正常结束
2)僵尸进程
3)孤儿进程
#协程:python

僵尸进程

1
2
3
4
#僵尸进程:
子进程比父进程先结束,父进程没有回收子进程的资源,此时的子进程就称为"僵尸进程"
#产生原因:
子进程的结束和父进程的运行是异步的,父进程永远不知道子进程什么时候结束,子进程在结束时,父进程繁忙来不及Wait子进程则会导致,子进程变成"僵尸进程"

孤儿进程

1
2
3
4
#孤儿进程:
父进程比子进程先结束,子进程还在执行任务,没有父进程管理,此时的子进程就称为"孤儿进程"
#产生原因:
子进程的结束和父进程的运行是异步的,父进程永远不知道子进程什么时候结束,当父进程正常完成工作或其他原因被终止,则会导致,子进程变成"孤儿进程"
1
2
3
4
1.当父进程接收到任务调度时,会通过fork派生子进程来处理,那么子进程会集成父进程的衣钵。
2.子进程在处理任务代码时,父进程会进入等待的状态...
3.如果子进程在处理任务过程中,父进程退出了,子进程没有退出,那么这些子进程就没有父进程来管理了,就变成了孤儿进程。
4.每个进程都会有自己的PID号,(process id)子进程则PPID

进程管理命令

ps命令(静态)

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
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@yum_repo ~]# ps aux	[root@yum_repo ~]# ps -ef也可以
a:显示系统中所有和终端相关的进程
u:显示每个进程运行的用户
x:显示系统中所有和终端无关的进程
[root@yum_repo ~]# ps aux|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 127864 6500 ? Ss 08:38 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 08:38 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 08:38 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 08:38 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 08:38 0:00 [kworker/u256:0]

#个列代信息表意思
USER:运行程序的用户
PID:每个进程运行起来后,都会有自己的一个PID号,进程号Process ID
%CPU:该进程占用CPU的百分比
%MEM:该进程占用内存的百分比
VSZ:该进程占用虚拟内存的大小
RSS:该进程占用真实内存的大小
TTY:终端
- ?:由内核发起的终端
- pts/0 pts/1:用户的虚拟终端
- tty1:物理终端
STAT:程序运行状态
START:服务启动的时间
TIME:该进程实际使用CPU的运行时间
COMMAND:服务运行起来的命令

#STAT:状态
D:无法中断的休眠状态(通IO的进程) 磁盘IO Input/Output 吞吐量(磁盘既写入又输出,例如tar打包数据时候)
R:Running 正在运行的进程
S:Sleeping 处于休眠状态的进程
T:被暂停的进程状态 (Ctrl+z暂停进程)
Z: 僵尸进程
<:优先级较高的进程
N:优先级较低的进程
s:父进程(并且它下面有子进程在运行)
l:以线程的方式运行的进程
|:多进程
+:在前台运行的进程
L:被锁进内存页的进程
X:死掉的进程(少见)
W:进入内存交换(从内核2.6开始无效)

stat命令

介绍

1
##stat命令来自英文单词status的缩写,其功能是显示文件的状态信息。在Linux系统中,每个文件都有3个“历史时间”——最后访问时间(ATIME)、最后修改时间(MTIME)、最后更改时间(CTIME),用户可以使用stat命令查看到它们,进而判别有没有其他人修改过文件内容。

image-20240505095811234

应用

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
31
32
33
34
35
36
37
##[root@localhost ~]# stat /etc/passwd
File: ‘/etc/passwd’
Size: 945 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 8902609 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2024-04-21 21:52:14.512000577 +0800
Modify: 2024-04-20 13:49:48.339236224 +0800
Change: 2024-04-20 13:49:48.341236224 +0800
Birth: -


## -c直接看权限
[root@localhost ~]# stat -c%a /etc/passwd
644
[root@localhost ~]# stat -c%A /etc/passwd
-rw-r--r--

##-c直接看inode结点号
[root@localhost ~]# stat -c%i /etc/passwd
8902609

##-c直接看uid和属主
[root@localhost ~]# stat -c%u /etc/passwd
0
[root@localhost ~]# stat -c%U /etc/passwd
root

##-c直接看gid和属组
[root@localhost ~]# stat -c%g /etc/passwd
0
[root@localhost ~]# stat -c%G /etc/passwd
root

##-c直接看文件大小
[root@localhost ~]# stat -c%s /etc/passwd
945
1
2
3
4
5
6
7
## -f
[root@localhost ~]# stat -f /etc/passwd
File: "/etc/passwd"
ID: fd0000000000 Namelen: 255 Type: xfs
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 2361856 Free: 1896798 Available: 1896798
Inodes: Total: 4728832 Free: 4664790
1
2
3
4
5
6
7
-c后可以跟哪些占位符
stat -c %a file 显示文件的八进制权限
stat -c %N file 显示完整路径
stat -c %n file 显示文件名。
stat -c %x file 显示最后访问时间
stat -c %y file 显示最后修改时间
stat -c "%n %s %y" filename.txt 这将输出文件名、文件大小和最后修改时间。

内存/端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# free 查看内存信息
free -h 以人类可读方式读取显示内存信息

# 端口:
[root@localhost ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
6866/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
6950/master
tcp6 0 0 :::22 :::* LISTEN
6866/sshd
tcp6 0 0 ::1:25 :::* LISTEN
6950/master

ps其他选项

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 查看最占用内存的进程
[root@yum_repo ~]# ps aux|sort -k 4 -nr
[root@yum_repo ~]# ps aux --sort %mem (默认占比最小的显示最前)

# 自定义列
[root@yum_repo ~]# ps axo user,pid,ppid,%mem,command,%cpu

#如何检测服务是否启动成功?
1.先查还有没有这个服务
[root@localhost ~]# ps aux|grep nginx
root 10021 0.0 0.0 39304 940 ? Ss 16:44 0:00 nginx: master
process /usr/sbin/nginx
nginx 10022 0.0 0.1 39692 1896 ? S 16:44 0:00 nginx: worker
process
2.使用端口号命令来查看该端口是否被监听。如果端口处于监听状态,则说明服务已经启动(nginx默认80端口,http协议)

[root@lb01 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8752/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6625/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6708/master
tcp6 0 0 :::80 :::* LISTEN 8752/nginx: master
tcp6 0 0 :::22 :::* LISTEN 6625/sshd
tcp6 0 0 ::1:25 :::* LISTEN 6708/master
[root@lb01 ~]# netstat -tulun
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN

## 写脚本用,判断服务是否存活
[root@yum_repo ~]# ps aux |grep nginx|grep -v grep
[root@yum_repo ~]# ps aux|grep nginx
root 19740 0.0 0.1 39312 1044 ? Ss 12:00 0:00 nginx: master process /usr/sbin/nginx
nginx 19741 0.0 0.1 39700 1816 ? S 12:00 0:00 nginx: worker process
nginx 19742 0.0 0.1 39700 1816 ? S 12:00 0:00 nginx: worker process
nginx 19759 0.0 0.1 39700 1816 ? S 12:00 0:00 nginx: worker process
nginx 19760 0.0 0.1 39700 1556 ? S 12:00 0:00 nginx: worker process
root 19823 0.0 0.0 112812 980 pts/2 R+ 12:05 0:00 grep -- color=auto nginx

[root@yum_repo ~]# ps aux|grep [n]ginx grep nginx
root 19823 0.0 0.0 112812 980 pts/2 R+ 12:05 0:00 grep -- color=auto [n]ginx

#检索pid号码 pgrep
#pgrep常用参数, -l -a
[root@zls ~]# pgrep sshd
869
1194
1307
1574
[root@zls ~]# pgrep -l sshd 显示进程名及ID
869 sshd
1194 sshd
1307 sshd
1574 sshd
[root@zls ~]# pgrep -l -a sshd
869 /usr/sbin/sshd -D
1194 sshd: root@pts/0
1307 sshd: root@pts/1
1574 sshd: root@pts/2
#查看进程的pid
[root@zls ~]# pidof sshd
1574 1307 1194 869
## 树状形式显示进程 需要安装psmisc支持pstree
[root@yum_repo ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─auditd───{auditd}
├─crond───crond───sh───ntpdate
├─dbus-daemon
├─gssproxy───5*[{gssproxy}]
├─nginx───20*[nginx]
├─polkitd───6*[{polkitd}]