麒麟操作系统基础知识保姆级教程(十八)进程管理

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情

在 Linux 系统中,存在一个独特的特性,即 “一切皆文件”。这意味着无论是普通文件,还是目录,都能够采用管理文件的方式来进行操作和管理。那么,当遇到一些问题时,比如文件过大从而占用了大量磁盘空间,或者是小文件数量过多进而占用了大量 inode 号,我们该如何去排查这些情况呢?

目录

一、磁盘相关案例

案例一、由于进程占用大量的内存导致系统出现oom报错信息

案例二、磁盘爆满,如何查找大文件

案例三、inode满,如何查找小文件

案例四、磁盘满通过增加磁盘的方式解决

案例五、文件被占用,磁盘空间不释放

二、kill

1、kill命令

2、kill的进阶

三、进程

1、进程的概述

2、监控进程的状态

3、top命令

4、管理进程状态

5、管理后台进程

6、screen命令

7、进程的优先级


💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!

👍点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!

🚀推广给更多人:如果你认为这篇文章对你有帮助,欢迎分享给更多对Linux感兴趣的朋友,让我们一起进步,共同提升!

一、磁盘相关案例

案例一、由于进程占用大量的内存导致系统出现oom报错信息

1.由于进程占用大量的内存导致系统出现oom报错信息
oom内存溢出:会导致系统杀死占用内存最高的进程
导致内存飙升的原因:
1).由于大量的用户访问 正常现象 增加内存即可解决
2).开发写的程序错误导致(java)找开发解决问题
3).由于网络波动导致内存升高  增加swap解决
4).其他原因:内存测试,拷贝,压力测试...
解决方法总结:
外部原因:增加内存
内部原因:代码 个人操作 使用swap解决
​
swap:磁盘划分的分区充当内存使用,在内存不够时,临时充当内存使用,目的就算为了解决oom内存溢出
swap可以在磁盘分区的时候进行划分
swap大小:内存的1-1.5倍,如果内存大于8G,最多给swap8G
还可以在安装完操作系统后进行划分
磁盘分区:
/boot
swap 2G  #磁盘速度比内存慢很多 狗骑兔子和高铁的区别
/
企业分区:
/boot
/
案例一.
如何在系统中创建swap分区:
查看swap分区的大小:
[root@yunzhongziedu ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        312M        120M        9.5M        1.5G        1.4G
Swap:          2.0G          0B        2.0G
1.生成一个2G空间的文件
[root@yunzhongziedu ~]# dd if=/dev/zero of=/tmp/2g bs=1M count=2000
[root@yunzhongziedu ~]# ll -h /tmp/2g
-rw-r--r-- 1 root root 2.0G Mar 27 17:44 /tmp/2g
2.格式化为swap分区
[root@yunzhongziedu ~]# mkswap /tmp/2g
Setting up swapspace version 1, size = 2047996 KiB
no label, UUID=448c7af1-7919-4201-b02e-dd5a0c3c775a
3.激活swap空间(挂载到源swap基础上)
[root@yunzhongziedu ~]# swapon /tmp/2g
swapon: /tmp/2g: insecure permissions 0644, 0600 suggested.
4.查看是否成功
[root@yunzhongziedu ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        238M        104M        9.5M        1.6G        1.5G
Swap:          4.0G          0B        4.0G #原有2G,变为4G成功
5.查看swap分区组成
[root@yunzhongziedu ~]# swapon -s
Filename                Type        Size    Used    Priority
/dev/sda2                               partition   2097148 0   -2      #原有的swap分区
/tmp/2g                                 file    2047996 0   -3          #临时挂载的swap分区()
6.卸载swap分区
[root@yunzhongziedu ~]# swapoff /tmp/2g
查看:
[root@yunzhongziedu ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        237M        105M        9.5M        1.6G        1.5G
Swap:          2.0G          0B        2.0G  #卸载成功

案例二、磁盘爆满,如何查找大文件

案例二.磁盘爆满,如何查找大文件#(慎重删除!!搞懂干啥的)
方法1.find
[root@yunzhongziedu ~]# find / -type f -size +100M
/proc/kcore
方法2.du
[root@yunzhongziedu ~]# du -h / |awk '$1 ~ /G$/'

案例三、inode满,如何查找小文件

案例三.inode满,如何查找小文件
通过目录查找,小文件越多目录越大
[root@yunzhongziedu ~]# mkdir yunzhongzi
[root@yunzhongziedu ~]# touch ./yunzhongzi/{1..100000}.txt
-bash: /usr/bin/touch: Argument list too long   #太长了,不让创建,建个小点的
[root@yunzhongziedu ~]# touch ./yunzhongzi/{1..10000}.txt  #1万个
[root@yunzhongziedu ~]# ll -h
total 396K
drwxr-xr-x 2 root root 240K Mar 27 18:03 yunzhongzi  #才240k
ot@yunzhongziedu ~]# find / -type d -size +200k
/root/yunzhongzi

案例四、磁盘满通过增加磁盘的方式解决

1.插入4T磁盘
2.格式化
3.挂载到/data
4.文件被占用,磁盘空间不释放
[root@yunzhongziedu ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G   14G  4.4G  76% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0
5.将大文件移动到/data目录并做软链接
[root@yunzhongziedu ~]#  mv /var/log/1.log /data/
[root@yunzhongziedu ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  3.7G   15G  21% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/sdb        4.0T  9.8G  3.9T   1% /data
[root@yunzhongziedu ~]# ln -s  /data/1.log 
[root@yunzhongziedu ~]# ll
total 476
lrwxrwxrwx 1 root root     11 Mar 27 19:21 1.log -> /data/1.log
drwxrwxrwx 2  500  500   4096 Mar 27 18:54 cmatrix-1.2a
-rw-r--r-- 1 root root  74376 Apr  1  2002 cmatrix-1.2a.tar.gz
drwxr-xr-x 2 root root 245760 Mar 27 18:03 yunzhongzi
[root@yunzhongziedu ~]# ll -h /data/1.log
-rw-r--r-- 1 root root 9.8G Mar 27 19:15 /data/1.log

案例五、文件被占用,磁盘空间不释放

1.生成一个10G的大文件
[root@yunzhongziedu ~]# ll -h /data/1.log
-rw-r--r-- 1 root root 9.8G Mar 27 19:15 /data/1.log
2.模拟文件被调用
[root@yunzhongziedu ~]# tail /data/1.log
3.进入到/data目录删除1.log
[root@yunzhongziedu data]# rm -rf 1.log
发现磁盘进程依然存在
[root@yunzhongziedu data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.6M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  3.7G   15G  21% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/sdb        4.0T  9.8G  3.9T   1% /data

这如何解决呢?

通过lsof命令查找被哪个进程所调用
[root@yunzhongziedu ~]# lsof |grep 1.log
vim       1551         root    3r      REG               8,16 10485760000         67 /data/1.log (deleted)  #采用tail直接被删除,用vim打开
[root@yunzhongziedu ~]# kill  1551  杀死进程
Terminated      #第二页面被迫退出
[root@yunzhongziedu ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.6M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  3.7G   15G  21% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/sdb        4.0T   33M  4.0T   1% /data       # 结束进程后磁盘释放
过滤进程信息,取消显示本身进程号
[root@db01 ~]# ps axu|grep test.txt
 root      15655  0.1  0.2 149520  5248 pts/0    S+   15:08   0:00 vim test.txt
 root      15735  0.0  0.0 112808   972 pts/1    S+   15:09   0:00 grep --color=auto test.txt
 [root@db01 ~]# ps axu|grep test.txt|grep -v grep
 root      15655  0.1  0.2 149520  5248 pts/0    S+   15:08   0:00 vim test.txt

二、kill

1、kill命令

在 Linux 系统中,kill命令用于向进程发送信号,通常用于终止进程。
​
基本语法
kill [选项] <进程号>
常用选项:
-l:列出所有可用的信号名称。
-9:强制杀死进程(发送 SIGKILL 信号)。
-15:默认的终止信号(发送 SIGTERM 信号),这是比较 “温和” 的终止方式,允许进程在终止前进行一些清理操作。
​
注意事项
谨慎使用-9选项
强制杀死进程(-9)可能会导致数据丢失或文件损坏,因为进程没有机会进行清理操作。只有在正常终止(-15)无效时才考虑使用。
信号的作用
Linux 系统中有很多不同的信号,每个信号都有特定的作用。例如,SIGHUP(1)信号通常用于通知进程重新读取配置文件,SIGINT(2)信号类似于在终端中按Ctrl + C来中断进程。kill命令可以发送这些不同的信号来控制进程的行为。
总之,kill命令是 Linux 系统管理中非常重要的工具,用于有效地控制和管理正在运行的进程。
​

2、kill的进阶

killall需要安装才可使用
yum -y install psmisc
pkill pid号码     #杀死某个进程
killall nginx     #杀死所有名为nginx的进程
pkill nginx       #杀死所有名为nginx的进程

三、进程

1、进程的概述

1.什么是进程?
当运行一个程序,那么将这个运行的程序叫做进程
PS1:当程序运行为进程后,系统会为该进程分配内存,以及进行运行的身份和权限
PS2:在进程运行过程中,服务器上会有各种状态来表示当前进程的指标信息
2.程序的进程的区别
程序是数据和指令的集合,是一个静态的概念,可以长期存在系统中
进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中
3.程序的生命周期
一个对象从无到有,从有到无的过程称为生命周期

当父进程收到任务调度的时候,会通过fock派生子来处理,子进程会继承父进程的信息
1).子进程在处理任务代码时,父进程会进入等待状态中
2).子进程在处理任务代码时,会执行退出,然后由父进程回收子进程的资源
3).如果子进程在处理任务时,父进程退出,子进程没有退出,子进程未被父进程管理,则变为僵尸进程
4).每个进程都有自己的PID号,子进程称为PPID

2、监控进程的状态

程序在运行后,我们需要了解进程的运行状态,查看进程的状态分为静态和动态
1.使用ps命令查看当前进程状态(静态)
ps -aufx常用组合方式查看进程、PID、占用CPU百分比,占用内存百分比,状态和执行的命令等
-a  #显示所有终端机下执行的进程,除了现阶段作业领导者除外
-u  #以用户为主的格式来显示进程状况
-x  #显示所有进程,不以终端机区分
-f  #用ASCII字符显示树状结构,表达进程间的关系
[root@yunzhongziedu ~]# ps axuf
标志意义
USER该process属于哪个使用者账号的
PID该process的号码
%CPU使用的CPU资源所占百分比
%MEM使用的物理磁盘百分比
VSZ使用的虚拟内存量
RSS占用的固定内存量
TTY显示在哪一个终端机上运行,若与终端机无关则显示 ?若为pts/0等的,则表示为由网络链接仅主机的程序
STAT该程序目前的状态
SATRT被触发启动的时间
TIME实际使用CPU运作的时间
COMMAND该程序的实际指令内核态进程无用户进程
STAT基本状态描述STAT状态+符号描述
R进程运行s进程是控制进程,Ss进程的领导者,父进程
S可中断睡眠<进程运行在最高优先级上,S<优先级较高的进程
T进程被暂停N进程运行在低优先级上,SN优先级较低的进程
D不可中断睡眠+当前进程运行在前台,R+表示该进程在前台运行
z僵尸进程1进程是多线程的,SI表示进程是以线程方式运行
案例1:
1).在终端1上运行vim
[root@yunzhongziedu ~]# vim test.txt
2).在终端2上运行ps命令查看状态
[root@yunzhongziedu ~]# ps aux|grep test.txt
root       1630  0.0  0.2 149508  5224 pts/0    S+   21:55   0:00 vim test.txt
root       1632  0.0  0.0 112808   976 pts/1    R+   21:55   0:00 grep --color=auto test.txt
3).在终端1上再次挂起vim命令按下ctrl+z
4).回到终端2再次运行ps命令查看状态
[root@yunzhongziedu ~]# ps aux|grep test.txt
root       1630  0.0  0.2 149508  5224 pts/0    T    21:55   0:00 vim test.txt      #T表示停止状态
root       1634  0.0  0.0 112808   972 pts/1    R+   21:56   0:00 grep --color=auto test.txt
案例2:
ps命令查看不可中断状态进程
使用tar打包时,可以通过中断不断的查看状态,#(状态由S+,R+变为D+)手速不够,借用
root@lzy ~]# ps axu|grep tar|grep -v grep 
root     
14289  2.6  0.1 124268  1888 pts/2    
S+   10:56   0:01 tar zcf 
etc.tar.gz /etc/ /usr/ /var 
[root@lzy ~]# ps axu|grep tar|grep -v grep 
root     
14289  2.7  0.2 124380  2240 pts/2    
R+   10:56   0:01 tar zcf 
etc.tar.gz /etc/ /usr/ /var 
[root@lzy ~]# ps axu|grep tar|grep -v grep 
root     
14289  2.9  0.2 124916  2724 pts/2    
D+   10:56   0:01 tar zcf 
etc.tar.gz /etc/ /usr/ /var 

3、top命令

什么是中断?
中断就是终止当前在做的事情去执行另一件事,保留现场,执行完成之后会回来执行刚刚未完成的的部分
1.可以使用top命令来查看当前的进程状态(动态)
top - 22:02:53 up  3:00,  2 users,  load average: 0.02, 0.05, 0.05
Tasks: 106 total,   2 running, 103 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.0 us,  6.7 sy,  0.0 ni, 93.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2027868 total,  1565792 free,   177972 used,   284104 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1697620 avail Mem 
​
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                   
     1 root      20   0   43836   4144   2548 S  0.0  0.2   0:03.97 systemd                   
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.02 kthreadd 
任务含义
Tasks: 106 total当前进程总数
1 running正在运行的进程数
104 sleeping睡眠的进程数
1 stopped停止的进程数
0 zombie僵尸进程数
%Cpu(s): 0.0 us,系统用户进程使用CPU百分比
0.7 sy内核进程占用CPU百分比,内核是与硬件进行及交互
0.0 ni,改变过优先级的进程占用CPU百分比
99.3 id空闲CPU的百分比
0.0 waCPU等待IO完成的时间
0.0 hi硬中断,占CPU百分比
0.0 si软中断,占CPU百分比
0.0 st虚拟机占用物理CPU的时间

软中断和硬中断的区别

软中断硬中断
是否有随机性 突发性
是否有中断相应周期
中断类型号的提供方法固定或由指令提供由中断控制器提供

4、管理进程状态

当程序运行为进程后,如果希望停止进程,怎么办呢?那么此时我们就可以使用Linux的kall命令对进行发送关闭信号,当然,除了kill还有killall和pkill
1.列出kill在当前系统所支持的信号
[root@yunzhongziedu ~]# 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
虽然信号很多,但常用的只有3个
1).SIGHUP   重新加载配置文件               1
2).SIGKILL  强制杀死进程                  9
3).SIGTERM  终止进程,默认kill使用该信号    15
下载 Nginx
yum -y install nginx
​
[root@yunzhongziedu ~]# ps axu|grep nginx       #(虚拟机为单U单核)
root       1710  0.0  0.0  39312   936 ?        Ss   22:29   0:00 nginx: master process /usr/sbin/nginx
nginx      1711  0.0  0.0  39700  1560 ?        S    22:29   0:00 nginx: worker process
root       1721  0.0  0.0 112808   968 pts/1    R+   22:30   0:00 grep --color=auto nginx
1.发起重载信号,nginx配置文件发生改变,可用此重新加载
[root@yunzhongziedu ~]# kill -1 1710
[root@yunzhongziedu ~]# ps axu|grep nginx
root       1710  0.0  0.0  39436  2004 ?        Ss   22:29   0:00 nginx: master process /usr/sbin/nginx
nginx      1723  0.0  0.0  39840  1956 ?        S    22:33   0:00 nginx: worker process
root       1725  0.0  0.0 112808   964 pts/1    R+   22:33   0:00 grep --color=auto nginx
2.发送停止信号
[root@yunzhongziedu ~]# kill 1710
[root@yunzhongziedu ~]# ps axu|grep nginx
root       1730  0.0  0.0 112808   964 pts/1    R+   22:37   0:00 grep --color=auto nginx  #发现子进程还在运行
3.强制终止服务
[root@lzy ~]# kill -1 15688 
[root@lzy ~]# ps axu|grep nginx 
nginx    15692  0.0  0.3  89376  3648 ?        S    12:19   0:00 nginx: 
worker process 
root     15722  0.0  0.0 112660   968 pts/3    R+   12:20   0:00 grep --color=auto nginx        #借用(单核的,父子进程全部被杀了)
2.killall和pkill
[root@yunzhongziedu ~]# killall nginx       #killall+要杀死的进程
[root@yunzhongziedu ~]# ps axu|grep nginx
root       1813  0.0  0.0 112808   968 pts/1    R+   22:44   0:00 grep --color=auto nginx
[root@yunzhongziedu ~]# pkill nginx     #pkill+要杀死的进程
[root@yunzhongziedu ~]# ps axu|grep nginx
root       1832  0.0  0.0 112808   968 pts/1    R+   22:45   0:00 grep --color=auto nginx

5、管理后台进程

1.什么是后台进程?
运行的进程默认在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行
2.如何把程序防在后台?
#把进程放在后台:使用&
[root@yunzhongziedu ~]# sleep 10 &
[2] 1835
[1]   Done                    sleep 10
#把进程挂起放在后台
[root@yunzhongziedu ~]# sleep 4000
^Z[2]   Done                    sleep 10
[3]+  Stopped                 sleep 4000
#jobs显示在后台运行的程序
[root@yunzhongziedu ~]# jobs
[3]+  Stopped                 sleep 4000
#让作业3在后台运行
[root@yunzhongziedu ~]# bg %3
[3]+ sleep 4000 &
#将作业4调回前台运行
[root@yunzhongziedu ~]# fg %4
sleep 3000
#终止PID为3的进程
[root@yunzhongziedu ~]# kill %3
[root@yunzhongziedu ~]# jobs
[3]+  Terminated              sleep 4000

6、screen命令

1.安装screen  #yum -y install screen
2.进入到screen子shell中   #screen -S wget    在screen里面执行命令
[root@yunzhongziedu ~]# screen -S wget_jenkins 
[root@yunzhongziedu ~]# wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm 
--2024-03-27 22:58:50--  https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm
Resolving pkg.jenkins.io (pkg.jenkins.io)... 151.101.90.133, 2a04:4e42:15::645
Connecting to pkg.jenkins.io (pkg.jenkins.io)|151.101.90.133|:443... connected.
ERROR: cannot verify pkg.jenkins.io's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
  Issued certificate has expired.
To connect to pkg.jenkins.io insecurely, use `--no-check-certificate`.
[root@yunzhongziedu ~]# exit                 
[screen is terminating]
3.ctrl a+d  #平滑退出
4.screen -list  #查看后台的screen
[root@yunzhongziedu ~]# screen -S wget_jenkins 
​
[root@yunzhongziedu ~]# screen -list 
There is a screen on:
        1875.wget_jenkins       (Attached)
1 Socket in /var/run/screen/S-root.
使用screen -r id号或者名称进入
nohup使用方法
nohuo 可执行命令 &
公司自己研发的py:
nohup  python3.5 test.py  &
注意: 在运行命令的目录自动生成一个nohup.out文件

7、进程的优先级

1.在进程启动时,为不同的进程使用不同的策略
nice值越高,表示优先级越低,
nice值越低,表示优先级越高
修改时可以同时修改RP -20映射到0,+19映射到39
2.nice指定程序的优先级,语法格式nice -n优先级数字 进程名称

磁盘管理的分享到此结束,明日预告,网络知识,dns解析,tcp3次握手~~~~


想成为大佬,就要从小白开始,从0开始,一点一点的积累,慢慢成长,明天你就是大佬!!想学习更多麒麟操作系统的知识,关注小屁,让你成为运维老鸟~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值