RHCE8学习过程(十)Linux系统进程管理

十、Centos8-系统进程管理

10.1、进程概述和 ps 管理进程

10.1.1 什么是进程?

进程: 是程序运行的过程, 动态,有生命周期及运行状态,是已启动的可执行程序的运行实例。
进程有以下组成部分:
• 已分配内存的地址空间;
• 安全属性,包括所有权凭据和特权;
• 程序代码的一个或多个执行线程;
• 进程状态
线程:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
程序: 二进制文件(程序即二进制文件),静态实体 /bin/date,/usr/sbin/sshd
下图所示的是进程的生命周期:

在这里插入图片描述

父进程复制自己的地址空间(fork [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
centos5 或 6PID 为 1 的进程是: init
centos7 PID 为 1 的进程是: systemd
centso8 PID 为 1 的进程是: systemd
僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
人话:父进程退出了, 子进程没有退出, 那么这些子进程就没有父进程来管理,就变成僵尸进程。

10.1. 2 进程的属性

进程 ID(PID):是唯一的数值,用来区分进程
父进程的 ID(PPID)
启动进程的用户 ID(UID)和所归属的组(GID)
进程状态:状态分为运行 R(running)、休眠 S(sleep)、僵尸 Z(zombie)
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU 占用量)

10.1.3 使用 ps 查看进程工具

1、ps 查看进程工具

例 1:常用的参数:
a: 显示跟当前终端关联的所有进程
u: 基于用户的格式显示(U: 显示某用户 ID 所有的进程)
x: 显示所有进程,不以终端机来区分
#####常用的选项组合是:ps -aux

[root@Hengji ~]# ps aux | more
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.6  0.1 245368 14104 ?        Ss   14:45   0:02 /usr/lib/systemd/sys
temd --switched-root --system --deserialize 18
root           2  0.0  0.0      0     0 ?        S    14:45   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   14:45   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   14:45   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I    14:45   0:00 [kworker/0:0-events]
root           6  0.0  0.0      0     0 ?        I<   14:45   0:00 [kworker/0:0H-kblock
d]
root           7  0.0  0.0      0     0 ?        I    14:45   0:00 [kworker/u256:0-even
ts_unbound]
root           8  0.0  0.0      0     0 ?        I<   14:45   0:00 [mm_percpu_wq]
root           9  0.0  0.0      0     0 ?        S    14:45   0:00 [ksoftirqd/0]
root          10  0.0  0.0      0     0 ?        I    14:45   0:00 [rcu_sched]
root          11  0.0  0.0      0     0 ?        S    14:45   0:00 [migration/0]
root          12  0.0  0.0      0     0 ?        S    14:45   0:00 [watchdog/0]
root          13  0.0  0.0      0     0 ?        S    14:45   0:00 [cpuhp/0]
root          14  0.0  0.0      0     0 ?        S    14:45   0:00 [cpuhp/1]
root          15  0.0  0.0      0     0 ?        S    14:45   0:00 [watchdog/1]
root          16  0.0  0.0      0     0 ?        S    14:45   0:00 [migration/1]
root          17  0.0  0.0      0     0 ?        S    14:45   0:00 [ksoftirqd/1]
root          19  0.0  0.0      0     0 ?        I<   14:45   0:00 [kworker/1:0H-kblock
d]
root          20  0.0  0.0      0     0 ?        S    14:45   0:00 [cpuhp/2]
root          21  0.0  0.0      0     0 ?        S    14:45   0:00 [watchdog/2]
root          22  0.0  0.0      0     0 ?        S    14:45   0:00 [migration/2]

上面的参数输出每列含意:
USER:启动这些进程的用户
PID:进程的 ID
%CPU:进程占用的 CPU 百分比;
%MEM:占用内存的百分比;
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
STAT:该程序目前的状态,Linux 进程有 5 种基本状态:
R:该程序目前正在运行,或者是可被运行;
S:该程序目前正在睡眠当中,但可被某些讯号(signal) 唤醒。
T:该程序目前正在侦测或者是停止了;
Z:该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (僵尸) 程序的状态
D:不可中断状态。
5 个基本状态后,还可以加一些字母,比如:Ss、R+,如下图:
在这里插入图片描述
它们含意如下:
<:表示进程运行在高优先级上
N:表示进程运行在低优先级上
L:表示进程有页面锁定在内存中
s:表示进程是控制进程
l:表示进程是多线程的
+:表示当前进程运行在前台
START:该 process 被触发启动的时间;
TIME:该 process 实际使用 CPU 运作的时间。
COMMAND:该程序的实际指令

查看进程状态
[root@Hengji ~]# vim a.txt
在另一个终端执行:
[root@Hengji ~]# ps -aux | grep a.txt     #查看状态 S 表示睡眠状态, + 表示前台
root        2676  0.0  0.1  48872  8492 pts/0    S+   15:01   0:00 vim a.txt
root        2686  0.0  0.0  12320  1056 pts/1    S+   15:01   0:00 grep --color=auto a.txt
在 vim a.txt 这个终端上 按下: ctrl+z
[1]+  已停止               vim a.txt
在另一个终端执行:
[root@Hengji ~]# ps -aux | grep a.txt          #查看状态 S 表示停止状态
root        2676  0.0  0.1  48872  8492 pts/0    T    15:01   0:00 vim a.txt
root        2700  0.0  0.0  12320   988 pts/1    S+   15:02   0:00 grep --color=auto a.txt

ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP 信号,挂起一个进程。将作业放置到后台(暂停)
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销

D 不可中断状态
[root@Hengji ~]# tar -zcvf usr-tar.gz /usr/ 

然后在另一个终端不断查看状态,由 S+或R+变为 D+
在这里插入图片描述

2、ps 常用的参数: ps -ef

-e:显示所有进程
-f:显示完整格式输出
我们常用的组合:ps -ef

[root@Hengji ~]# ps -ef | head
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 14:45 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root           2       0  0 14:45 ?        00:00:00 [kthreadd]
root           3       2  0 14:45 ?        00:00:00 [rcu_gp]
root           4       2  0 14:45 ?        00:00:00 [rcu_par_gp]
root           5       2  0 14:45 ?        00:00:00 [kworker/0:0-events_freezable_power_]
root           6       2  0 14:45 ?        00:00:00 [kworker/0:0H-kblockd]
root           7       2  0 14:45 ?        00:00:00 [kworker/u256:0-events_unbound]
root           8       2  0 14:45 ?        00:00:00 [mm_percpu_wq]
root           9       2  0 14:45 ?        00:00:00 [ksoftirqd/0]

包含的信息如下:
UID:启动这些进程的用户
PID:进程的 ID
PPID:父进程的进程号
C:进程生命周期中的 CPU 利用率
STIME:进程启动时的系统时间
TTY:表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外,tty1-tty6是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME:运行进程一共累计占用的 CPU 时间
CMD:启动的程序名称

测试 CPU 使用时间
[root@Hengji ~]# dd if=/dev/zero of=/a.txt count=10 bs=100M
记录了10+0 的读入
记录了10+0 的写出
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.23885 s, 200 MB/s
[root@Hengji ~]# ps -axu | grep dd
root           2  0.0  0.0      0     0 ?        S    17:35   0:00 [kthreadd]
root          55  0.0  0.0      0     0 ?        I    17:35   0:00 [kworker/3:1-ipv6_addrconf]
root         207  0.0  0.0      0     0 ?        I<   17:35   0:00 [ipv6_addrconf]
dbus         861  0.8  0.1  91872  8744 ?        Ssl  17:36   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
gdm         1460  0.1  0.0  83064  6112 ?        Ssl  17:36   0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
gdm         1526  0.0  0.0  82616  5784 ?        Sl   17:36   0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
root        1796  0.6  0.0  83532  6720 ?        Ssl  17:37   0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root        1930  0.0  0.0  82620  5560 ?        Sl   17:37   0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
root        2160  0.2  0.3 837576 29716 ?        Ssl  17:37   0:00 /usr/libexec/evolution-addressbook-factory
root        2192  0.6  0.4 1122228 36268 ?       Sl   17:37   0:00 /usr/libexec/evolution-addressbook-factory-subprocess --factory all --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.AddressBookx2160x2 --own-path /org/gnome/evolution/dataserver/Subprocess/Backend/AddressBook/2160/2
root        2405  0.0  0.0  12320  1032 pts/0    S+   17:37   0:00 grep --color=auto dd

注:
ps aux 是用 BSD 的格式来显示进程。
ps -ef 是用标准的格式显示进程。

10.2、uptime 查看系统负载-top 动态管理进程

10.2.1 uptime 查看 CPU 负载工具

[root@Hengji ~]# uptime
13:22:30 up 20days, 2 users, load average: 0.06, 0.60, 0.48

弹出消息含意如下:

实例含义
13:22:30当前时间
up 20days系统运行时间 ,说明此服务器连续运行 20 天了
2 user当前登录用户数
load average: 0.06, 0.60,0.48系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5 分钟、15 分钟前到现在的平均值。

10.2.2 top 命令

[root@Hengji ~]# top    弹出的每行信息含意如下:

第一行内容和 uptime 弹出的信息一样
进程和 CPU 的信息( 第二、三行)
在这里插入图片描述

实例含义
Tasks: 279 total进程总数
1 running正在运行的进程数
278 sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数
Cpu(s): 0.8% us系统用户进程使用 CPU 百分比。
0.7% sy内核中的进程占用 CPU 百分比
0.0% ni用户进程空间内改变过优先级的进程占用 CPU 百分比
98.4% id空闲 CPU 百分比
0.0% wacpu 等待 I/0 完成的时间总量
0.1% hi 硬中断消耗时间硬中断,占的 CPU 百分比。
0.0% si 软中断消耗时间软中断,占的 CPU 百分比。
0.0 st (steal 偷)st:虚拟机偷取物理的时间。比如:物理机已经运行了 KVM,XEN 虚拟机。KVM 虚拟机占用物理机的 cpu 时间

内存信息(第四五行)
在这里插入图片描述

实例含义
Mem: 7944.5 total物理内存总量
4954.8 free空闲内存总量
1416.5 used使用的物理内存总量
1573.3 buff/cache用作内核缓存的内存量。
Swap: 2048.0 total交换区总量
2048.0 free空闲交换区总量
0.0 used使用的交换区总量
6241.9 avail Mem总的可利用内存是多少

注:如果 swap 分区,被使用,那么你的内存不够用了。

第 7 行进程信息
在这里插入图片描述

列名含义
PID进程 id
USER进程所有者的用户名
PR优先级(由内核动态调整),用户不能
NI进程优先级。 nice 值。负值表示高优先级,正值表示低优先级,用户可以自己调整
VIRT(virtual memory usage)虚拟内存,是进程正在使用的所有内存(ps 中标为 VSZ)
RES(resident memory usage)是进程所使用的物理内存。实际实用内存(ps 中标为 RSS)
SHR共享内存大小,单位 kb
S进程状态。D=不可中断的睡眠状态 R=运行中或可运行 S=睡眠中 T=已跟踪/已停止 Z=僵停
%CPU上次更新到现在的 CPU 时间占用百分比
%MEM进程使用的物理内存百分比
TIME+进程使用的 CPU 时间总计,单位 1/100 秒
COMMAND命令名/命令行

top 快捷键:
默认 3s 刷新一次,按 s 修改刷新时间
按空格:立即刷新。
q:退出
P:按 CPU 排序
M:按内存排序
T:按时间排序
p:进程 IP,查看某个进程状态
数字键 1:显示每个内核的 CPU 使用率
u/U:指定显示的用户
h:帮助

使用 TOP 动态只查看某个或某些进程的信息找到进程 ID
[root@Hengji ~]# ps -axu | grep vim
root        3097  0.0  0.0  12320  1100 pts/1    S+   15:15   0:00 grep --color=auto vim
[root@Hengji ~]# top -p 3097
找出系统中使用 CPU 最多的进程

运行 top , 找出使用 CPU 最多的进程 ,按大写的 P,可以按 CPU 使用率来排序显示
在这里插入图片描述

在 linux 系统中一个进程,最多可以使用 100%cpu 对吗?
如下图,可以看到 dirtycow(脏牛漏洞,用于提权) 进程使用 196.8%
在这里插入图片描述
这是你第一次看见: 1
如果你的 4 核心的 cpu,你可以运行 400%

10.2.4 lsof 命令

lsof 命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件。

[root@Hengji ~]# vim a.txt
[root@Hengji ~]# ps -axu | grep a.txt
root        3358  0.0  0.1  48804  8552 pts/0    S+   15:23   0:00 vim a.txt
root        3360  0.0  0.0  12320  1072 pts/1    S+   15:23   0:00 grep --color=auto a.txt

[root@Hengji ~]# lsof -p 3358    #一般用于查看木马进程,在读哪些文件
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
vim     3358 root  cwd    DIR                8,2     4096  67160193 /root
vim     3358 root  rtd    DIR                8,2      224       128 /
...
[root@Hengji ~]# lsof -i :22       #用于查看端口,或查看黑客开启的后门端口是哪个进程在使用
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1027 root    5u  IPv4  31451      0t0  TCP *:ssh (LISTEN)
sshd    1027 root    7u  IPv6  31453      0t0  TCP *:ssh (LISTEN)

10.2.5 free 显示系统中可用内存和已用内存的数量

free 命令查看内存使用状态
子选项:
-b:以字节为单位表示。
-k:以 KB 为单位显示,默认是以 KB 为单位显示。
-m:以 MB 为单位显示。
-g:以 GB 为单位显示。

[root@Hengji ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           7944        1397        4833          18        1712        6259
Swap:          2047           0        2047

其中:
第一行:total 是总内存量,used 是已经使用的内存量,free 是空闲的内存,shared 是多个进程共享的内存总数,buffers 是缓冲内存数,cache 是缓存内存数。默认单位是 KB。available 实际可用(case 加速读,buffers 加速写。)
第二行:total 系统中有 972MB 的物理内存,used 是已经使用的内存数量。free 是空闲的内存数量。shared 是多个进程共享的内存数量。buff/cache 用来作为缓冲和缓存的空间,内核会在内存将要耗尽时释放这部分内存给其他进程使用。availble:可使用空间,评估有多少内存可用于启动新应用程序,不包括swap,不同于 free 和 cache 字段。available 字段考虑了页缓存,而不是所有可回收的内存。正因为这个原因所以通常 free+buff/cache 的数值要比 available 的数值大。
第三行: swap 虚拟内存。
如果我们发现 swap 区域一直被大量使用,这就说明物理内存不足。可能需要考虑系统上 swap 使用比例或者添加物理内存。

10.3、前后台进程切换- nice 进程优先级-实战 screen 后台执行命令

10.3.1 Linux 后台进程与前台进程的区别

前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随着消失。
后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互。
Linux 的大多数服务器就是用守护进程实现的。比如,Web 服务器 httpd 等。
###10.3.2 进程的前台与后台运行
跟系统任务相关的几个命令:

实例含义
&用在一个命令的最后,可以把这个命令放到后台执行.
ctrl + z将一个正在前台执行的命令放到后台,并且暂停.
jobs查看当前有多少在后台运行的进程.它是一个作业控制命令
fg(foreground process)将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后台正在执行的命令的序号(不是 pid)
bg(background process)将一个在后台暂停的命令,变成继续执行; 如果后台中有多个命令,可以用bg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后台正在执行的命令的序号(不是 pid)

####恢复被挂起的进程

[root@Hengji ~]# ps -axu | grep vim
root        3639  0.0  0.0  12320   976 pts/1    S+   15:39   0:00 grep --color=auto vim
[root@Hengji ~]# vim a.txt      #打开后,然后执行 ctrl+z

[1]+  已停止               vim a.txt
[root@Hengji ~]# vim a.txt 

[2]+  已停止               vim a.txt
[root@Hengji ~]# ps -axu | grep vim
root        3654  0.0  0.1  48844  8584 pts/1    T    15:40   0:00 vim a.txt
root        3661  0.1  0.1  48848  8620 pts/1    T    15:40   0:00 vim a.txt
root        3669  0.0  0.0  12320  1036 pts/1    S+   15:40   0:00 grep --color=auto vim
[root@Hengji ~]# jobs         #查看当前有多少在后台运行的进程
[1]-  已停止               vim a.txt
[2]+  已停止               vim a.txt
[root@Hengji ~]# fg 1      #将后台挂起的进程恢复到前台运行
vim a.txt 

10.3.3 kill 关闭进程

关闭进程 3 个命令:kill killall pkill
kill 关闭进程:kill 进程号 关闭单个进程
killall 和 pkill 命令:用于杀死指定名字的进程

[root@Hengji ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

信号编号 信号名
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断 crtl+c
3) SIGQUIT 退出
9) SIGKILL 强制终止
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 停止
20) SIGTSTP 暂停 crtl+z

kill 和 killall 终止进程
[root@Hengji ~]# kill -9 2342
[root@Hengji ~]# killall sshd
[root@Hengji ~]# pkill sshd

10.3.4 进程的优先级管理

优先级取值范围为(-20,19),越小优先级越高, 默认优先级是 0
优先级越高占用的 CPU 值就越高
命令 1:nice 指定程序的运行优先级
格式:nice n command
命令 2:renice 改变程序的运行优先级
格式:renice -n pid

指定运行 vim 的优先级为 5
[root@Hengji ~]# nice -n 5 vim a.txt    #输入内容,然后 ctrl+z 挂起

[1]+  已停止               nice -n 5 vim a.txt
[root@Hengji ~]# ps -aux|grep vim    #通过 ps 查看这个文件的 PID 号
root        3876  0.0  0.1  48812  8512 pts/0    TN   15:46   0:00 vim a.txt
root        3888  0.0  0.0  12320  1104 pts/0    S+   15:46   0:00 grep --color=auto vim
[root@Hengji ~]# top -p 3876      #通过 top 命令查看优先级
top - 15:47:22 up  1:02,  1 user,  load average: 0.03, 0.04, 0.00
Tasks:   1 total,   0 running,   0 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.6 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
MiB Mem :   7944.5 total,   4835.5 free,   1393.9 used,   1715.1 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   6263.8 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
   3876 root      25   5   48812   8512   5712 T   0.0   0.1   0:00.00 vim 

在这里插入图片描述

改变正在运行的进程的优先级
[root@Hengji ~]# renice -10 3876
3876 (process ID) 旧优先级为 5,新优先级为 -10
[root@Hengji ~]# top -p 3876

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crazy_Hengji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值