进程管理

进程的概述


程序运行,这个程序运行的过程就是进程?

系统会给进程分配了  内存空间

分配了安全属性    运行的身份和权限  

分配了系统的资源   文件描述符  进程描述符   网络端口   ID号    PID  PPID

系统会记录进程的运行中的状态    STATAE

进程和程序有什么区别 


程序是指令和数据的有序集合    静态的概念    永久存在的

进程是程序在主机上面运行的一个过程   动态的概念   会随着程序的创建,运行,终止,消除而终止    临时


进程是有生命周期  

进程的运行过程:

用户运行了一个程序,系统会给进程分配任务,进程会通过fork一个子进程,子进程会继承父进程的衣钵,子进程处理具体的任务,父进程就会进入等待状态,子进程任务结束,回来向父进程交任务,子进程正常退出

子进程在执行任务时,父进程因为意外原因退出了,那么子进程就会变成无人管理,就是僵尸进程

每个进程都有自己的代号  ID号  子进程  PID   父进程  PPID  



进程的状态

ps 显示进程的命令 静态显示


ps		#显示进程的命令  静态显示  

选项:
	a		#显示所有进程
	
	u		#显示有效的用户或者uid
	
	x		#显示没有终端
	
	aux
	
	-e		#显示所有进程 
	
	-f		#显示用户PPID   
	
	-ef		#显示所有的进程及进程的PPID
	

[root@zzc ~]# ps  aux	
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 125420  2112 ?        Ss   Aug03   0:03 /usr/lib/systemd/systemd --switched-root --system --des
root          2  0.0  0.0      0     0 ?        S    Aug03   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    Aug03   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   Aug03   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    Aug03   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    Aug03   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        R    Aug03   0:07 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S<   Aug03   0:00 [lru-add-drain]
root         11  0.0  0.0      0     0 ?        S    Aug03   0:00 [watchdog/0]


USER 	#进程运行的身份  用户        

PID 	#进程的ID号

PPID	#父进程的ID号

%CPU 	#进程占用CPU的百分比 

%MEM   	#进程占用内存的百分比  

VSZ  	#虚拟内存集    进程占用虚拟内存的大小  

RSS 	#物理内存集    进程占用物理内存的大小

TTY  	#终端 

	?		#没有终端   内核运行的程序 
	
	tty1	#机器的终端  服务器的本地
	
	pts/0	#虚拟远程终端  

STAT 	#进程的状态

	S		#休眠的状态 
	
	R		#正在运行的状态 
	
	D		#无法中断的休眠状态 
	
	T		#暂停或被追踪的状态
	
	Z		#僵尸状态
	
	s		#父进程 
	
	<		#优先级高
	
	N		#优先级低
	
	l		#多线程 
	
	+		#在前台运行 



START   	#进程的启动时间 

TIME 		#进程占用CPU的时间

COMMAND		#执行的指令或者命令

	[]		#内核运行的  []		#用户运行的  


[root@zzc ~]# ps  -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 Aug03 ?        00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 Aug03 ?        00:00:00 [kthreadd]
root          3      2  0 Aug03 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 Aug03 ?        00:00:00 [kworker/0:0H]
root          7      2  0 Aug03 ?        00:00:00 [migration/0]
root          8      2  0 Aug03 ?        00:00:00 [rcu_bh]
root          9      2  0 Aug03 ?        00:00:07 [rcu_sched]
root         10      2  0 Aug03 ?        00:00:00 [lru-add-drain]




案例1
[root@zzc ~]# vim  test.log

#另外一个窗口 

[root@zzc ~]# ps  aux |grep -v grep | grep  vim
root      12592  0.2  0.2 149168  4996 pts/0    S+   09:04   0:00 vim test.log
[root@zzc ~]# ps  aux | grep  [v]im
root      12592  0.1  0.2 149168  4996 pts/0    S+   09:04   0:00 vim test.log


[root@zzc ~]# vim  test.log		#ctrl +  z  放入到后台

[1]+  Stopped                 vim test.log


[root@zzc ~]# ps  aux | grep  [v]im
root      12592  0.0  0.2 149168  4996 pts/0    T    09:04   0:00 vim test.log



案例二
[root@zzc ~]# tar  czf  etc.tar.gz   /usr  /etc/  /var  
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets


[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  7.0  0.0 123408  1352 pts/0    R+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var
[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  6.0  0.0 123408  1352 pts/0    D+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var
[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  6.2  0.0 123540  1352 pts/0    R+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var
[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  5.8  0.0 123540  1352 pts/0    D+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var
[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  5.5  0.0 123540  1352 pts/0    D+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var
[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  6.5  0.0 123540  1352 pts/0    S+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var
[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  5.8  0.0 123540  1352 pts/0    S+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var
[root@zzc ~]# ps  aux | grep  [t]ar
root      12617  6.1  0.0 123540  1352 pts/0    R+   09:08   0:00 tar czf etc.tar.gz /usr /etc/ /var


[root@zzc ~]# ps  aux | grep  [b]ash
root       7193  0.0  5.4 225028 111152 pts/0   Ss   Aug03   0:04 -bash
root      12575  0.0  0.1 115572  2120 pts/1    Ss+  09:04   0:00 -bash
root      12641  0.0  5.4 225028 110280 pts/0   R+   09:09   0:00 -bash



案例三
[root@zzc ~]# vim test.c 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <errno.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 


int main(int argc, char *argv[]) 
{ 
pid_t pid; 
pid = fork(); 
if (pid == 0) { 
int iPid = (int)getpid(); 
fprintf(stderr,"I am child,%d\n",iPid); 
sleep(1); 
fprintf(stderr, "Child exits\n"); 
return EXIT_SUCCESS; 
} 
int iPid = (int)getpid(); 
fprintf(stderr,"I am parent,%d\n",iPid); 
fprintf(stderr, "sleep....\n"); 
sleep(600); 
fprintf(stderr, "parent exits\n"); 
return EXIT_SUCCESS; 
} 


[root@zzc ~]# gcc  test.c
[root@zzc ~]# ll
total 1218672
-rwxr-xr-x 1 root root       8696 Aug  4 09:11 a.out
-rw-r--r-- 1 root root  199327744 Aug  4 09:09 etc.tar.gz
-rw------- 1 root root 1048576000 Aug  3 11:22 swap.txt
-rw-r--r-- 1 root root        547 Aug  4 09:10 test.c
[root@zzc ~]# ./a.out 
I am parent,12655
sleep....
I am child,12656
Child exits
^C



[root@zzc ~]# ps  aux | grep  [a.]out
root      12655  0.0  0.0   4208   352 pts/0    S+   09:11   0:00 ./a.out
root      12656  0.0  0.0      0     0 pts/0    Z+   09:11   0:00 [a.out] <defunct>

top htop 动态显示进程状态


top   htop    #动态显示进程状态


top命令的内部指令

h		#帮助 

q		#退出

P		#以CPU的占用大小进行排序

M		#以内存的占用大小进行排序

1		#显示所有CPU的状态 


top选项:

 top  -d  1		#设置刷新时间


 top  -d  1  -p 1	#查看某个进程ID的进程状态 


 top  -d  1  -u  postfix	#显示指定运行用户的进程状态 



[root@zzc ~]# top 
top - 09:33:58 up 23:31,  2 users,  load average: 0.24, 0.10, 0.07
Tasks: 113 total,   1 running, 112 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2028088 total,   155648 free,   363844 used,  1508596 buff/cache
KiB Swap:  2097148 total,  2069756 free,    27392 used.   974036 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND               

top - 09:33:58 up 23:31,  2 users,  load average: 0.24, 0.10, 0.07


09:33:58	#当前系统时间

up 23:31	#系统运行时间 

2 users		#登录用户的数量  连接终端的数量 

load average: 0.24, 0.10, 0.07			#系统平均负载时间   1  5  15 分钟的平均负载 
 
 
Tasks: 113 total,   1 running, 112 sleeping,   0 stopped,   0 zombie

任务:

113 total,		#总共有113个任务 

1 running		#一个在运行状态

112 sleeping	#112休眠状态  S  

0 stopped		#0个停止状态

0 zombie		#0个在僵尸状态 


%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 
 
系统各个状态所占用CPU的时间百分比  	

0.0 us		#用户态  用户所占用的CPU的时间百分比

0.0 sy		#系统态  系统所占用的CPU的时间百分比

0.0 ni		#使用优先级的程序所占用的CPU的时间百分比

100.0 id	#空闲状态所占用的CPU的时间百分比

0.0 wa		#IO等待所占用的CPU的时间百分比

0.0 hi		#硬中断所占用的CPU的时间百分比

0.0 si		#软中断所占用的CPU的时间百分比

0.0 st		#宿主机的监控程序所窃取的虚拟机的CPU的时间百分比 

物理内存        总的 			    剩余的        已使用的       缓存和缓冲中的内存 
KiB Mem :  2028088 total,   155648 free,   363844 used,  1508596 buff/cache


虚拟内存 
KiB Swap:  2097148 total,  2069756 free,    27392 used.   974036 avail Mem 


PID 		#进程的ID号


USER		#运行的身份  用户       

PR  		#优先级  20  值越低,优先级就越高

NI  		#nice值    跟PR 相差 20个数    值越低,优先级就越高 

VIRT    	#所占用的虚拟内存的大小

RES  		#所占用的物理内存的大小  

SHR 		#共享内存 

S 			#进程的状态 

%CPU 		#占用CPU的百分比

%MEM 		#占用内存的百分比      

TIME+ 		#CPU的运行时间

COMMAND		#运行的指令或者命令 




#显示系统使用和空闲的内存情况
[root@zzc ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         265         907          12         807        1114
Swap:          2047          29        2018




kill 管理系统中的信号输出


[root@zzc ~]# 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		#重新加载配置   进程pid的不变  


2		#终止信号  ctrl + c


9		#终止进程   强制终止 


15		#默认信号  终止进程   可加可不加 


18		#让暂停的进程继续运行


20		#ctrl + z  将进程暂停 


[root@zzc ~]# yum install  -y  nginx 

[root@zzc ~]# systemctl  start  nginx
[root@zzc ~]# ps aux | grep nginx
root      13063  0.0  0.1 120796  2096 ?        Ss   10:36   0:00 nginx: master process /usr/sbin/nginx
nginx     13064  0.2  0.1 121180  3128 ?        S    10:36   0:00 nginx: worker process


[root@zzc ~]# kill  -1  13063
[root@zzc ~]# ps aux | grep nginx
root      13063  0.0  0.2 121452  5248 ?        Ss   10:36   0:00 nginx: master process /usr/sbin/nginx
nginx     13070  0.0  0.1 121876  3836 ?        S    10:37   0:00 nginx: worker process


[root@zzc ~]# netstat  -lntp
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      13063/nginx: master

[root@zzc ~]# kill -1  13063
[root@zzc ~]# netstat  -lntp
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:81              0.0.0.0:*               LISTEN      13063/nginx: master


[root@zzc ~]# top

[root@zzc ~]# ps  aux |grep  [t]op
root      13115  0.0  0.1 161988  2212 pts/1    S+   10:41   0:00 top
[root@zzc ~]# kill -2 13115
[root@zzc ~]# ps  aux |grep  [t]op
[root@zzc ~]# 

[root@zzc ~]# kill  -9  13063

[root@zzc ~]# kill 13141
[root@zzc ~]# ps  aux |grep  [t]op
root      13144  0.0  0.1 161984  2212 pts/1    S+   10:44   0:00 top
[root@zzc ~]# kill -15 13144



kill		#根据进程ID去终止进程的   进程不存在时,会进行提示  

#根据名称终止进程   精确匹配 
[root@zzc ~]# killall   top

[root@zzc ~]# killall  nginx

[root@zzc ~]# killall  nginx		#进程不存在时,会提示 
nginx: no process found


[root@zzc ~]# ps  aux | grep  [v]im
root      13264  0.0  0.2 149168  4972 pts/0    S+   10:53   0:00 vim 123.txt
root      13265  0.1  0.2 149168  4972 pts/1    S+   10:53   0:00 vim 123.log
[root@zzc ~]# killall  vim



pkill		#根据进程名称终止   终止进程不会提示    模糊杀手   

[root@zzc ~]# ps  aux | grep  [t]op
root      13278  0.0  0.1 161988  2216 pts/0    S+   10:56   0:00 top
root      13279  0.1  0.1 122396  2112 pts/1    S+   10:56   0:00 htop
[root@zzc ~]# pkill   top
[root@zzc ~]# ps  aux | grep  [t]op
[root@zzc ~]# 

[root@zzc ~]# ps  aux |grep  sh
root       6935  0.0  0.0 112756  1276 ?        Ss   Aug03   0:00 /usr/sbin/sshd -D
root       7191  0.0  0.0 161364  1616 ?        Ss   Aug03   0:00 sshd: root@pts/0
root       7193  0.0  5.4 225028 111168 pts/0   Ss+  Aug03   0:05 -bash
root      12573  0.0  0.2 161364  5936 ?        Ss   09:04   0:00 sshd: root@pts/1
root      12575  0.0  0.1 115572  2196 pts/1    Ss   09:04   0:00 -bash
root      13215  0.0  0.2 161364  6056 ?        Ss   10:50   0:00 sshd: root@pts/2
root      13217  0.0  0.1 115572  2184 pts/2    Ss   10:50   0:00 -bash
root      13296  0.0  0.0 113176  1196 pts/2    S+   10:59   0:00 sh 123.txt
root      13299  0.0  0.0 113176  1216 ?        Ss   10:59   0:00 /bin/sh -c /usr/sbin/ntpdate  ntp.aliyun.com &>/dev/null
root      13302  0.0  0.0 112708   976 pts/1    R+   10:59   0:00 grep --color=auto sh
[root@zzc ~]# pkill  sh  


#以树形结构显示进程状态 
[root@zzc ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─auditd───{auditd}
        ├─crond───crond───sh───ntpdate
        ├─dbus-daemon
        ├─firewalld───{firewalld}
        ├─login───bash
        ├─master─┬─pickup
        │        └─qmgr
        ├─ping
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        ├─vmtoolsd
        └─vsftpd



如何将正在运行的进程放入后台执行

& 放在一个命令的最后, 可以把这个命令放到后台去执行

[root@zzc ~]# vim 2.txt &
[1] 7515
# 这里 [1] 代表它是后台运行的一个 job 编号为 1
# 这里 21867 是它的进程号

nohup 忽略挂起信号运行指定的命令

[root@zzc ~]# nohup ping baidu.com &   #退出后继续执行
[2] 7889
[root@zzc ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@zzc ~]# jobs
[1]+  Stopped                 vi
[2]-  Running                 nohup ping baidu.com &

#如果标准输出是一个终端,尽可能将输出添加到"nohup.out"
[root@zzc ~]# ll
total 12
-rw-r--r-- 1 root root   11 Aug  5 19:59 2.txt
-rw-r--r-- 1 root root  128 Aug  5 20:23 2.txt.tar.gz
-rw------- 1 root root 3182 Aug  6 09:36 nohup.out

ctrl + z 快捷键

[root@zzc ~]# vi
# 按下 ctrl + z
[2]+  Stopped                 vi
#  [2] 代表它是后台运行的一个 job 编号为 2
#  + 代表他是最近一个被放到后台的进程, 如果直接输入 fg 就是恢复这个进程.
#  Stopped 说明它被停止了也就是 ctrl + z 的第二个作用 --  暂停
#  vi 就是进程名

jobs 查看当前后台运行的进程

# 查看当前后台运行的进程, 以 "[作业号][-/+] 运行状态 作业名称" 输出结果
[root@zzc ~]# jobs
[1]+  Stopped                 vi
[2]-  Running                 nohup ping baidu.com &

fg 将后台程序放入到前台运行

[root@zzc ~]# vi 

[1]+  Stopped                 vi
[root@qls ~]# fg  %1
vi


~                                                                                         
~                                                                                         
~                                                                                         
~                                                                                         
~                                                                                         
~                                                                                         
~                                                                                         
Type  :quit<Enter>  to exit Vim

bg 将暂停在后台的程序继续在后台运行 输出还是输出到屏幕上面


[root@zzc ~]# ping baidu.com &
[1] 8016
[root@zzc ~]# PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=45.3 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=36.3 ms

#新建窗口暂停任务
[root@zzc ~]# ps aux | grep [p]ing
root       8016  0.0  0.1 149968  1988 pts/3    S    09:54   0:00 ping baidu.com
[root@zzc ~]# kill -20 8016

[root@zzc ~]# jobs
[1]+  Stopped                 ping baidu.com

[root@zzc ~]# bg %1
[1]+ ping baidu.com &
[root@zzc ~]# 64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=40 ttl=128 time=31.6 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=41 ttl=128 time=32.8 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=42 ttl=128 time=33.3 ms

screen 后台管理程序

screen		#后台管理程序 

yum install screen

选项:
  -ls或–list    #显示目前所有的screen作业
  
  -S   		   #打开一个新的窗口 并指定窗口名称

  -r           #恢复screen后台进程,如果有多个断开的进程,需要指定id号

  -x           #恢复之前离线的screen作业
  
  -xr          #实时监控窗口的操作
 
  -d          #将指定的screen作业离线。

  ctrl + a + d   #临时退出 

  exit	       #真正退出 
  

#列出screen后台运行的程序
[root@zzc ~]# screen   -list
No Sockets found in /var/run/screen/S-root.

[root@zzc ~]# 

[root@zzc ~]# screen  -S     vim		#打开一个新的窗口 并指定窗口名称 
[detached from 13659.vim]

[root@zzc ~]# screen  -list
There is a screen on:
	13659.vim	(Detached)
1 Socket in /var/run/screen/S-root.


[root@zzc ~]# screen   -r  vim		#或者通过id号 


[root@zzc ~]# screen   -xr  vim		#实时监控窗口的操作


[detached from 13659.vim]


ctrl +  a  + d   #临时退出 

exit	#真正退出 



系统平均负载


[root@zzc ~]# top
top - 11:54:48 up 1 day,  1:52,  3 users,  load average: 0.00, 0.01, 0.05


[root@zzc ~]# w
 11:54:59 up 1 day,  1:52,  3 users,  load average: 0.00, 0.01, 0.05


[root@zzc ~]# uptime
 11:55:09 up 1 day,  1:53,  3 users,  load average: 0.00, 0.01, 0.05


1分钟    5分钟    15分钟   系统的平均负载 

平均负载跟系统CPU的使用率没有太大关系


在单位时间内,系统正在运行中的进程数或者不可中断的进程数量   进程的活跃数量 


跟CPU的核心数有关系 


当负载为2的时候    

核心数为4       50% 

核心数为2		100% 

核心数为1       200%



当1分钟的值小于5分钟和15分钟的时候   说明你之前的平均负载过高,当前正在降低  

当1分钟跟5分钟和15分钟的值很近的时候,平均负载很稳定  

当1分钟的值大于5分钟和15分钟的时候,说明现在的负载正在慢慢的变大   

当值达到70%   就要开始分析问题  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值