UNIX再学习 -- ps、top、kill 指令

1、ps 指令

其中,ps指令是我们使用最多的指令了。下面来详细介绍下它。

参看:ps 指令

参看:10个重要的Linux ps命令实战

(1)ps 功能

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

(2)选项

-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。 
a:显示现行终端机下的所有程序,包括其他用户的程序。 
-A:显示所有程序。 
-c:显示CLS和PRI栏位。 
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。 
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。 
-d:显示所有程序,但不包括阶段作业领导者的程序。 
-e:此选项的效果和指定"A"选项相同。 
e:列出程序时,显示每个程序所使用的环境变量。 
-f:显示UID,PPIP,C与STIME栏位。 
f:用ASCII字符显示树状结构,表达程序间的相互关系。 
-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。 
g:显示现行终端机下的所有程序,包括群组领导者的程序。 
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。 
h:不显示标题列。 -H:显示树状结构,表示程序间的相互关系。 
-j或j:采用工作控制的格式显示程序状况。 
-l或l:采用详细的格式来显示程序状况。 
L:列出栏位的相关信息。 
-m或m:显示所有的执行绪。 
n:以数字来表示USER和WCHAN栏位。 
-N:显示所有的程序,除了执行ps指令终端机下的程序之外。 
-p<程序识别码>:指定程序识别码,并列出该程序的状况。 
p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。 
r:只列出现行终端机正在执行中的程序。 -
s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。 
s:采用程序信号的格式显示程序状况。 
S:列出程序时,包括已中断的子程序资料。 
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。 
t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。 
-T:显示现行终端机下的所有程序。 
-u<用户识别码>:此选项的效果和指定"-U"选项相同。 
u:以用户为主的格式来显示程序状况。 
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。 
U<用户名称>:列出属于该用户的程序的状况。 
v:采用虚拟内存的格式显示程序状况。 
-V或V:显示版本信息。 
-w或w:采用宽阔的格式来显示程序状况。  
x:显示所有程序,不以终端机来区分。 
X:采用旧式的Linux i386登陆格式显示程序状况。 
-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。 
-<程序识别码>:此选项的效果和指定"p"选项相同。 
--cols<每列字符数>:设置每列的最大字符数。 
--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。 
--cumulative:此选项的效果和指定"S"选项相同。 
--deselect:此选项的效果和指定"-N"选项相同。 
--forest:此选项的效果和指定"f"选项相同。 
--headers:重复显示标题列。 
--help:在线帮助。 
--info:显示排错信息。 
--lines<显示列数>:设置显示画面的列数。 
--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。 
--group<群组名称>:此选项的效果和指定"-G"选项相同。 
--Group<群组识别码>:此选项的效果和指定"-G"选项相同。 
--pid<程序识别码>:此选项的效果和指定"-p"选项相同。 
--rows<显示列数>:此选项的效果和指定"--lines"选项相同。 
--sid<阶段作业>:此选项的效果和指定"-s"选项相同。 
--tty<终端机编号>:此选项的效果和指定"-t"选项相同。 
--user<用户名称>:此选项的效果和指定"-U"选项相同。 
--User<用户识别码>:此选项的效果和指定"-U"选项相同。 
--version:此选项的效果和指定"-V"选项相同。 
--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

(3)常用选项

1》使用 ps aux 或者ps lax 查看当前在系统中运行的进程快照。
a   显示所有进程
u   指定用户的所有进程
x   显示所有进程,不以终端机来区分。 
l    采用详细的格式来显示程序状况。
# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.6  0.1   3604  2032 ?        Ss   10:18   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    10:18   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    10:18   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    10:18   0:00 [kworker/0:0]
root         5  0.2  0.0      0     0 ?        S    10:18   0:00 [kworker/u:0]
root         6  0.0  0.0      0     0 ?        S    10:18   0:00 [migration/0]
root         7  0.3  0.0      0     0 ?        S    10:18   0:00 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S<   10:18   0:00 [cpuset]
.....
# ps lax
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     1     0  20   0   3604  2032 poll_s Ss   ?          0:01 /sbin/init
1     0     2     0  20   0      0     0 kthrea S    ?          0:00 [kthreadd]
1     0     3     2  20   0      0     0 run_ks S    ?          0:00 [ksoftirqd/0]
5     0     5     2  20   0      0     0 worker S    ?          0:00 [kworker/u:0]
1     0     6     2 -100  -      0     0 cpu_st S    ?          0:00 [migration/0]
5     0     7     2 -100  -      0     0 watchd S    ?          0:00 [watchdog/0]
1     0     8     2   0 -20      0     0 rescue S<   ?          0:00 [cpuset]
1     0     9     2   0 -20      0     0 rescue S<   ?          0:00 [khelper]
其中各列含义如下:

USER    用户名
UID       用户ID(User ID)
PID       进程ID(Process ID)
PPID     父进程的进程ID(Parent Process id)
SID       会话ID(Session id)
%CPU    进程的cpu占用率
%MEM    进程的内存占用率
VSZ          进程所使用的虚存的大小(Virtual Size)
RSS          进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。
TTY         与进程关联的终端(tty)
STAT       进程的状态:进程状态使用字符表示的(STAT的状态码)
R 运行     Runnable (on run queue)            正在运行或在运行队列中等待。
S 睡眠     Sleeping                休眠中, 受阻, 在等待某个条件的形成或接受到信号。
I 空闲      Idle
Z 僵死    Zombie(a defunct process)        进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
D     不可中断    Uninterruptible sleep (ususally IO)    收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
T     终止    Terminate                进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
P     等待交换页
W    无驻留页    has no resident pages        没有足够的记忆体分页可分配。
X     死掉的进程
<     高优先级进程                    高优先序的进程
N    低优先    级进程                    低优先序的进程
L     内存锁页    Lock                有记忆体分页分配并缩在记忆体内
s     进程的领导者(在它之下有子进程);
l     多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+     位于后台的进程组 
START    进程启动时间和日期
TIME    进程使用的总cpu时间
COMMAND    正在执行的命令行命令
NI     优先级(Nice)
PRI    进程优先级编号(Priority)
WCHAN    进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。
FLAGS    与进程相关的数字标识

更详细内容,自行 man ps 查看

扩展:

linux上进程有5种状态: 
1. 运行(正在运行或在运行队列中等待) 
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行) 

ps 工具标识进程的 5 种状态码: 

D 不可中断 uninterruptible sleep (usually IO) 
R 运行 runnable (on run queue) 
S 中断 sleeping 
T 停止 traced or stopped 
Z 僵死 a defunct (”zombie”) process 

2》可以用 | 管道和 more 连接起来分页查看
命令:ps aux | more  表示将 ps -aux 的结果进行分屏显示
按 回车键 向下查看,按 Q 退出
# ps aux | more
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   3604  2032 ?        Ss   10:18   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    10:18   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    10:18   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    10:18   0:00 [kworker/u:0]
root         6  0.0  0.0      0     0 ?        S    10:18   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    10:18   0:01 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S<   10:18   0:00 [cpuset]
.....
-More
3》命令 ps -ef  
ps -ef 表示以全格式的方式显示当前所有的进程
ps -ef | more 分屏显示命令的执行结果
# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:18 ?        00:00:01 /sbin/init
root         2     0  0 10:18 ?        00:00:00 [kthreadd]
root         3     2  0 10:18 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 10:18 ?        00:00:00 [kworker/u:0]
root         6     2  0 10:18 ?        00:00:00 [migration/0]
root         7     2  0 10:18 ?        00:00:01 [watchdog/0]
root         8     2  0 10:18 ?        00:00:00 [cpuset]
root         9     2  0 10:18 ?        00:00:00 [khelper]
root        10     2  0 10:18 ?        00:00:00 [kdevtmpfs]
root        11     2  0 10:18 ?        00:00:00 [netns]
root        12     2  0 10:18 ?        00:00:00 [sync_supers]
4》ps 与 | 管道 和 grep 常用组合用法,查找特定进程
比如,命令 ps aux | grep colord 
# ps aux | grep colord
colord    1957  0.0  1.0  53628 10568 ?        Sl   10:19   0:00 /usr/lib/i386-linux-gnu/colord/colord
root      2623  0.0  0.0   5812   864 pts/0    D+   10:57   0:00 grep --color=auto colord
5》ps 可以结合less命令和管道来使用,方便阅览
按 回车键 向下查看,按 Q 退出
# ps aux | less
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   3604  2032 ?        Ss   10:18   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    10:18   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    10:18   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    10:18   0:00 [kworker/u:0]
root         6  0.0  0.0      0     0 ?        S    10:18   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    10:18   0:01 [watchdog/0]
:

2、top 指令

参看:top 指令

(1)top 功能

top 命令 可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。
通过top命令所提供的互动式界面,用热键可以管理。

(2)选项

-b:以批处理模式操作; 
-c:显示完整的治命令; 
-d:屏幕刷新间隔时间; 
-I:忽略失效过程; 
-s:保密模式; 
-S:累积模式; 
-i<时间>:设置间隔时间; 
-u<用户名>:指定用户名; 
-p<进程号>:指定进程; 
-n<次数>:循环显示的次数。

(3)top 交互指令

在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了-s选项, 其中一些命令可能会被屏蔽。
h:显示帮助画面,给出一些简短的命令总结说明; 
k:终止一个进程; 
i:忽略闲置和僵死进程,这是一个开关式命令; 
q:退出程序; 
r:重新安排一个进程的优先级别; 
S:切换到累计模式; 
s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s; 
f或者F:从当前显示中添加或者删除项目; 
o或者O:改变显示项目的顺序; 
l:切换显示平均负载和启动时间信息; 
m:切换显示内存信息; 
t:切换显示进程和CPU状态信息; 
c:切换显示命令名称和完整命令行; 
M:根据驻留内存大小进行排序; 
P:根据CPU使用百分比大小进行排序; 
T:根据时间/累计时间进行排序; 
w:将当前设置写入~/.toprc文件中。

(4)示例


(5)统计信息

参看:PS与TOP详解
统计信息区前五行是系统整体的统计信息。 
1》第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:  
02:44:02                      当前时间  
up 21 days  ,2:12       开机到目前为止所经过的时间   
3 users                        当前登录用户数  
0.56, 0.23, 0.32          系统负载,即任务队列的平均长度。三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。 
2》第二行为进程信息,内容如下:  
Tasks:  113 total       进程总数  
1 running                  正在运行的进程数  
112sleeping              睡眠的进程数   
0 stopped                 停止的进程数  
0 zombie                   僵尸进程数 
3》第三行为CPU信息,当有多个CPU时,这些内容可能会超过两行。内容如下:   
Cpu(s): 
0.0%us                      用户空间占用CPU百分比   
0.0% sy                     内核空间占用CPU百分比  
0.0% ni                      用户进程空间内改变过优先级的进程占用CPU百分比  
0.0% id                      空闲CPU百分比  
0.0% wa                     等待输入输出(IO)的CPU时间百分比  
0.0% hi                      cpu处理硬件中断的时间;   
0.0% si                      cpu处理软中断的时间;  

4》第四行为内存信息,内容如下:  
Mem: 1034872k total          物理内存总量  
974264k used                      使用的物理内存总量   
60608k free                          空闲内存总量  
226140k buffers                  用作内核缓存的内存量  
5》第五行为SWAP信息  
Swap: 1534072k total        交换区总量  
0used                                   使用的虚拟内存总量   
1534072k free                    空闲交换区总量   
548268k cached                 缓冲的交换区总量。 

6》第六行往后是进程列表,常见的这几列的意义分别为:   
PID(进程号), USER(运行用户),PR(优先级),NI(任务nice值),VIRT(虚拟内存用量),RES(物理内存用量), SHR(共享内存用量),S(进程状态),%CPU(CPU占用比),%MEM(内存占用比),TIME+(累计CPU占用时间)。 

7》常用交互指令
除了这些信息之外,top还提供了很多命令能帮我们更好的解读这些信息,例如:
按”M”键可以按内存用量进行排序; 
按”P”可以按CPU使用量进行排序,这样一来对于分析系统瓶颈很有帮助;此外,
按“f”可以进入交互页面,选择指定的列显示; 
按”r”可以改变一个进程的nice值;
按”k”可以向一个进程发信号;  
按”z”可以使用彩色显示。进程信息区统计信息区域的下方显示了各个进程的详细信息。

8》首先来认识一下各列的含义。   
序号    列名    含义   
a    PID       进程id   
b    PPID      父进程id  
c    RUSER     Real user name  
d    UID       进程所有者的用户id  
e    USER      进程所有者的用户名  
f    GROUP     进程所有者的组名  
g    TTY       启动进程的终端名。不是从终端启动的进程则显示为 ? 
h    PR        优先级  
i    NI        nice值。负值表示高优先级,正值表示低优先级   
j    P         最后使用的CPU,仅在多CPU环境下有意义 
k    %CPU     上次更新到现在的CPU时间占用百分比   
l    TIME     进程使用的CPU时间总计,单位秒  
m    TIME+    进程使用的CPU时间总计,单位1/100秒   
n    %MEM     进程使用的物理内存百分比  
o    VIRT     进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES   
p    SWAP     进程使用的虚拟内存中,被换出的大小,单位kb。  
q    RES      进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA   
r    CODE     可执行代码占用的物理内存大小,单位kb  
s    DATA     可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb  
t    SHR      共享内存大小,单位kb   
u    nFLT     页面错误次数  
v    nDRT     最后一次写入到现在,被修改过的页面数。  
w    S        进程状态。  
x    COMMAND  命令名/命令行  
y    WCHAN    若该进程在睡眠,则显示睡眠中的系统函数名   
z    Flags    任务标志,参考 sched.h               
D=不可中断的睡眠状态               
R=运行               
S=睡眠  
T=跟踪/停止               
Z=僵尸进程  

默认情况下仅显示比较重要的  PID、USER、PR、NI、VIRT、RES、SHR、S、%  CPU、%MEM、TIME+、COMMAND  列。可以通过下面的快捷键来更改显示内容。  
更改显示内容通过 f 键可以选择显示的内容按 f 键之后会显示列的列表,按 a-z  即可显示或隐藏对应的列,最后按回车键确定。 

3、kill 指令

(1)功能

kill命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。

(2)选项

-a:当处理当前进程时,不限制命令名和进程号的对应关系; 
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称; 
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号; 
-s <信息名称或编号>:指定要送出的信息; 
-u:指定用户。

(3)示例

1》信号部分再重点讲解,现在先做了解。
# 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	
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:
HUP 1 终端断线 INT 2 中断(同 Ctrl + C) 
QUIT 3 退出(同 Ctrl + \) 
TERM 15 终止 
KILL 9 强制终止 
CONT 18 继续(与STOP相反, fg/bg命令) 
STOP 19 暂停(同 Ctrl + Z)
2》得到指定信号的数值
[root@localhost test6]# kill -l KILL
9[root@localhost test6]# kill -l SIGKILL
9[root@localhost test6]# kill -l TERM
15[root@localhost test6]# kill -l SIGTERM
3》常用方法:先用ps查找进程,然后用kill杀掉
命令:kill 3268
[root@localhost test6]# ps -ef|grep vim 
root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log
root      3370  2822  0 16:21 pts/0    00:00:00 grep vim
[root@localhost test6]# kill 3268 
[root@localhost test6]# kill 3268 
-bash: kill: (3268) - 没有那个进程
4》彻底杀死进程
命令:kill –9 3268 
[root@localhost test6]# ps -ef|grep vim 
root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log
root      3370  2822  0 16:21 pts/0    00:00:00 grep vim
[root@localhost test6]# kill –9 3268 
[root@localhost test6]# kill 3268 
-bash: kill: (3268) - 没有那个进程
5》杀死指定用户所有进程
命令:
kill -9 $(ps -ef | grep peidalinux)
kill -u peidalinux
[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux) 
[root@localhost ~]# kill -u peidalinux
说明:
方法一,过滤出hnlinux用户进程并杀死
6》init 进程是不可杀的
命令:kill -9 1
[root@localhost ~]# ps -ef|grep init
root         1     0  0 Nov02 ?        00:00:00 init [3]                  
root     17563 17534  0 17:37 pts/1    00:00:00 grep init
[root@localhost ~]# kill -9 1
[root@localhost ~]# kill -HUP 1
[root@localhost ~]# ps -ef|grep init
root         1     0  0 Nov02 ?        00:00:00 init [3]                  
root     17565 17534  0 17:38 pts/1    00:00:00 grep init
[root@localhost ~]# kill -KILL 1
[root@localhost ~]# ps -ef|grep init
root         1     0  0 Nov02 ?        00:00:00 init [3]                  
root     17567 17534  0 17:38 pts/1    00:00:00 grep init
说明:
init 是 Linux 系统操作中不可缺少的程序之一。所谓的 init 进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是 init 进程的子孙。init 进程是不可杀的!
7》》杀死所有进程
kill -9 -1
参看:GNU kill 命令
其中有解释:
If pid is positive, the signal is sent to the process with the process id pid. 
If pid is zero, the signal is sent to all processes in the process group of the current process. 
If pid is -1, the signal is sent to all processes for which the user has permission to send a signal. 
If pid is less than -1, the signal is sent to all processes in the process group that equals the absolute value of pid.
翻译一下就是:
如果pid为正,则将信号发送到进程 id pid的 进程。 如果 pid 为零,则将信号发送到当前进程的进程组中的所有进程。 如果pid为 -1,则信号被发送到用户有权发送信号的所有进程。 如果pid小于-1,则信号被发送到进程组中等于pid绝对值的所有进程。
不过不推荐使用,虚拟机死机。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

聚优致成

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

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

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

打赏作者

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

抵扣说明:

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

余额充值