• 根据进程名杀死进程 -kill进程名


    知道进程名怎样杀死这个进程。
    #pkill 进程名 
    或是
    #killall 进程名
    的确这个两个命令都能做到这些,而且我们平时一般知道进程名需要杀死进程的时候也都是用的这两个命令。可是他叫我用kill 命令来完成这个一操作。我们知道kill 要杀死进程是需要知道进程的id的即进程号,其实这个思路就是需要通过其他命令获取相应进程的进程号,然后用kill 杀掉。
    这里提供两个方法:
    1、#kill -9 $(ps -ef|grep 进程名关键字|gawk '$0 !~/grep/ {print $2}' |tr -s ' ' ' ')这个是利用管道和替换将 进程名对应的进程号提出来作为kill的参数。
    很显然上面的方法能完成但是过于复杂,下面这种就显得简单的多了
    2、#kill -9 $(pidof 进程名关键字)

    常规篇:

    首先,用ps查看进程,方法如下:

    $ ps -ef

    ……

    smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal

    smx       1823  1822  0 11:38 ?        00:00:00 gnome-pty-helper

    smx       1824  1822  0 11:38 pts/0    00:00:02 bash

    smx       1827     1  4 11:38 ?        00:26:28 /usr/lib/firefox-3.6.18/firefox-bin

    smx       1857  1822  0 11:38 pts/1    00:00:00 bash

    smx       1880  1619  0 11:38 ?        00:00:00 update-notifier

    ……

    smx      11946  1824  0 21:41 pts/0    00:00:00 ps -ef

    或者:

    $ ps -aux

    ……

    smx       1822  0.1  0.8  58484 18152 ?        Sl   11:38   0:49 gnome-terminal

    smx       1823  0.0  0.0   1988   712 ?        S    11:38   0:00 gnome-pty-helper

    smx       1824  0.0  0.1   6820  3776 pts/0    Ss   11:38   0:02 bash

    smx       1827  4.3  5.8 398196 119568 ?       Sl   11:38  26:13 /usr/lib/firefox-3.6.18/firefox-bin

    smx       1857  0.0  0.1   6688  3644 pts/1    Ss   11:38   0:00 bash

    smx       1880  0.0  0.6  41536 12620 ?        S    11:38   0:00 update-notifier

    ……

    smx      11953  0.0  0.0   2716  1064 pts/0    R+   21:42   0:00 ps -aux

    此时如果我想杀了火狐的进程就在终端输入:

    $ kill -s 9 1827

    其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。

    进阶篇:

    改进1:

    把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。

    $ ps -ef | grep firefox

    smx       1827     1  4 11:38 ?        00:27:33 /usr/lib/firefox-3.6.18/firefox-bin

    smx      12029  1824  0 21:54 pts/0    00:00:00 grep --color=auto firefox

    这次就清爽了。然后就是

    $kill -s 9 1827

    改进2——使用pgrep:

    一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。

    $ pgrep firefox

    1827

    看到了什么?没错火狐的PID,接下来又要打字了:

    $kill -s 9 1827

    改进3——使用pidof:

    看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。

    $ pidof firefox-bin

    1827

    和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:

    $kill -s 9 1827

    无论使用ps 然后慢慢查找进程PID 还是用grep查找包含相应字符串的进程,亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。有没有更方便的方法?有!

    改进4:

    $ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9

    说明:

    “grep firefox”的输出结果是,所有含有关键字“firefox”的进程。

    “grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。

    “cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。

    “xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。

    难道你不想抱怨点什么?没错太长了

    改进5:

    知道pgrep和pidof两个命令,干嘛还要打那么长一串!

    $ pgrep firefox | xargs kill -s 9

    改进6:

    $ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9

    kill: No such process

    有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。

    其中awk '{print $2}' 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。

    改进7:

    难道每次都要调用xargs把PID传递给kill?答案是否定的:

    $kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`

    改进8:

    没错,命令依然有点长,换成pgrep。

    $kill -s 9 `pgrep firefox`

    改进9——pkill:

    看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。

    $pkill -9 firefox

    说明:"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。

    改进10——killall:

    killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。

    $killall -9 firefox

    附录:各种信号及其用途

    Signal Description Signal number on Linux x86[1] 

    SIGABRT Process aborted 6 

    SIGALRM Signal raised by alarm 14 

    SIGBUS Bus error: "access to undefined portion of memory object" 7 

    SIGCHLD Child process terminated, stopped (or continued*) 17 

    SIGCONT Continue if stopped 18 

    SIGFPE Floating point exception: "erroneous arithmetic operation" 8 

    SIGHUP Hangup 1 

    SIGILL Illegal instruction 4 

    SIGINT Interrupt 2 

    SIGKILL Kill (terminate immediately) 9 

    SIGPIPE Write to pipe with no one reading 13 

    SIGQUIT Quit and dump core 3 

    SIGSEGV Segmentation violation 11 

    SIGSTOP Stop executing temporarily 19 

    SIGTERM Termination (request to terminate) 15 

    SIGTSTP Terminal stop signal 20 

    SIGTTIN Background process attempting to read from tty ("in") 21 

    SIGTTOU Background process attempting to write to tty ("out") 22 

    SIGUSR1 User-defined 1 10 

    SIGUSR2 User-defined 2 12 

    SIGPOLL Pollable event 29 

    SIGPROF Profiling timer expired 27 

    SIGSYS Bad syscall 31 

    SIGTRAP Trace/breakpoint trap 5 

    SIGURG Urgent data available on socket 23 

    SIGVTALRM Signal raised by timer counting virtual time: "virtual timer expired" 26 

    SIGXCPU CPU time limit exceeded 24 

    SIGXFSZ File size limit exceeded 25 

    这是本人花了两天时间整理得来的,一些最常用的地球人都知道的命令就省去啦!最后提供pdf手册下载 

    1. 更改档案拥有者 
    命令 : chown [-cfhvR] [--help] [--version] user[:group] file... 
    功能 : 更改文件或者文件夹的拥有者 
    参数格式 : 
          user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群体(group) 
             -c : 若该档案拥有者确实已经更改,才显示其更改动作 
             -f : 若该档案拥有者无法被更改也不要显示错误讯息 
             -h : 只对于连结(link)进行变更,而非该 link 真正指向的档案 
             -v : 显示拥有者变更的详细资料 
             -R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更) 

    例如:chown -R oracle:oinstall /oracle/u01/app/oracle  
          更改目录拥有者为oracle 

    2. 修改权限 
        命令:chmod (change mode) 
        功能:改变文件的读写和执行权限。有符号法和八进制数字法。 
        选项:(1)符号法: 
      命令格式:chmod {u|g|o|a}{+|-|=}{r|w|x} filename 
              u (user)   表示用户本人。 
              g (group)  表示同组用户。 
              o (oher)   表示其他用户。 
              a (all)    表示所有用户。 
              +          用于给予指定用户的许可权限。 
              -          用于取消指定用户的许可权限。 
              =          将所许可的权限赋给文件。 
              r (read)   读许可,表示可以拷贝该文件或目录的内容。 
              w (write)  写许可,表示可以修改该文件或目录的内容。 
              x (execute)执行许可,表示可以执行该文件或进入目录。 
      
              (2)八进制数字法:   
      命令格式:chmod abc file 
      其中a,b,c各为一个八进制数字,分别表示User、Group、及Other的权限。 
              4 (100)    表示可读。 
              2 (010)    表示可写。 
              1 (001)    表示可执行。 
      若要rwx属性则4+2+1=7; 
      若要rw-属性则4+2=6; 
      若要r-x属性则4+1=5。 

        例如:# chmod a+rx filename 
                让所有用户可以读和执行文件filename。 
              # chmod go-rx filename 
                取消同组和其他用户的读和执行文件filename的权限。 
              # chmod 741 filename 
                让本人可读写执行、同组用户可读、其他用户可执行文件filename。 
      # chmod -R 755 /home/oracle 
        递归更改目录权限,本人可读写执行、同组用户可读可执行、其他用户可读可执行 

    3. 修改文件日期 
        命令:touch 
        格式:touch filenae 
        功能:改变文件的日期,不对文件的内容做改动,若文件不存在则建立新文件。 
        例如:% touch file 

    4. 链接文件 
        命令:ln (link) 
        格式:ln [option] filename linkname 
              ln [option] directory pathname 
        功能:为文件或目录建立一个链。其中,filename和directory是源文件名和 
              源目录名;linkname和pathname分别表示与源文件或源目录名相链接的 
              文件或目录。 
        选项:-s  为文件或目录建立符号链接。不加-s表示为文件或目录建立硬链接 
        注释:链接的目地在于,对一个文件或目录赋予两个以上的名字,使其可以出 
              现在不同的目录中,既可以使文件或目录共享,又可以节省磁盘空间。 
        例如:% ln -s filename linkname 

    5. 显示日期 
        命令:date 
        例如:% date 

    6. 显示日历 
        命令:cal (calendar) 
        格式:cal [month] year 
        功能:显示某年内指定的日历 
        例如:% cal 1998  

    7. 显示文件头部 
        命令:head 
        格式:head [option] filename 
        功能:显示文件的头部 
        选项:缺省  显示文件的头10行。 
              -i    显示文件的开始 i行。 
        例如:% head filename 

    8. 显示文件尾部 
        命令:tail 
        格式:tail [option] filename 
        功能:显示文件的尾部 
        选项:缺省  显示文件的末10行。 
              -i    显示文件最后 i行。 
              +i    从文件的第i行开始显示。 
        例如:% tail filename 

    9. 显示用户标识 
        命令:id 
        格式:id [option] [user] 
        功能:显示用户标识及用户所属的所有组。 
        选项:-a 显示用户名、用户标识及用户所属的所有组 
        注释: 
        例如:% id username 

    10. 查看当前登录的用户 
        命令:users 

    11. 显示都谁登录到机器上 
        命令:who 
        格式:who 
        功能:显示当前正在系统中的所有用户名字,使用终端设备号,注册时间。 
        例如:% who 

    12. 显示当前终端上的用户名 
        命令:whoami 
        格式:whoami 
        功能:显示出当前终端上使用的用户。 
        例如:% whoami 

    13. 寻找文件 
        命令:find 
        格式:find pathname [option] expression 
        功能:在所给的路经名下寻找符合表达式相匹配的文件。 
        选项:-name     表示文件名 
              -user     用户名,选取该用户所属的文件 
              -size     按大小查找,以block为单位,一个block是512B 
              -mtime n  按最后一次修改时间查找,选取n天内被修改的文件 
      -perm     按权限查找 
              -type     按文件类型查找 
      -atime    按最后一次访问时间查找 

        例如:% find ./ -name '*abc*' -print 

    14. 搜索文件中匹配符 
        命令:grep 
        格式:grep [option] pattern filenames 
        功能:逐行搜索所指定的文件或标准输入,并显示匹配模式的每一行。 
        选项:-i    匹配时忽略大小写 
      -v 找出模式失配的行 

        例如:% grep -i 'java*' ./test/run.sh 

    15. 统计文件字数 
        命令:wc [option] filename 
        功能:统计文件中的文件行数、字数和字符数。 
        选项:-l 统计文件的行数 
    -w 统计文件的单词数 
    -c 统计文件的字符数 
        注释:若缺省文件名则指标准输入 
        例如:% wc -c ./test/run.sh 

    16. 显示磁盘空间 
        命令:df (disk free) 
        格式:df [option] 
        功能:显示磁盘空间的使用情况,包括文件系统安装的目录名、块设备名、总 
              字节数、已用字节数、剩余字节数占用百分比。 
        选项: 
    -a:显示全部的档案系统和各分割区的磁盘使用情形 
    -i:显示i -nodes的使用量 
    -k:大小用k来表示 (默认值) 
    -t:显示某一个档案系统的所有分割区磁盘使用量 
    -x:显示不是某一个档案系统的所有分割区磁盘使用量 
    -T:显示每个分割区所属的档案系统名称 
    -h: 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。 
        注释: 
        例如:% df -hi 

    17. 查询档案或目录的磁盘使用空间 
        命令:du (disk usage) 
        格式:du [option] [filename] 
        功能:以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小 
        选项: 
    -a:显示全部目录和其次目录下的每个档案所占的磁盘空间 
    -b:大小用bytes来表示 (默认值为k bytes) 
    -c:最后再加上总计 (默认值) 
    -s:只显示各档案大小的总合 
    -x:只计算同属同一个档案系统的档案 
    -L:计算所有的档案大小 
    -h: 表示档案系统大小使用 GB、MB 等易读的格式。 
        例如:% du -a 
    % du -sh /etc 只显示该目录的总合 
    % du /etc | sort -nr | more 统计结果用sort 指令进行排序, 
    sort 的参数 -nr 表示要以数字排序法进行反向排序。 

    18. 显示进程 
        命令:ps 
        格式:ps [option] 
        功能:显示系统中进程的信息。包括进程ID、控制进程终端、执行时间和命令。 
        选项: 
      -a 显示所有进程信息 
      -U uidlist 列出这个用户的所有进程 
              -e 显示当前运行的每一个进程信息 
              -f 显示一个完整的列表 
      -x 显示包括没有终端控制的进程状况 。 
        注释: 
        例如:% ps -ef 
      % ps -aux 然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。 

    19. 终止进程 
        命令:kill 
        格式:kill [option] pid 
        功能:向指定的进程送信号或终止进程。kill指令的用途是送一个signal给某一个process, 
        因为大部份送的都是用来杀掉 process 的 SIGKILL 或 SIGHUP ,因此称为 kill  
        选项:-9  强行终止进程 
        注释:pid标示进程号,可由ps命令得到。 
        例如:% kill -9 pid 
        你也可以用 kill -l 来察看可代替 signal 号码的数目字。kill 的详细情形请参阅 man kill。 

    20. 查看自己的IP地址 
        命令:ifconfig 
        格式:ifconfig -a 
       
    21. 查看路由表 
        命令:netstat 
        格式:netstat -rn 

    22. 远程登录 
        命令:telnet 
        格式:telnet hostname 

    23. 文件传输 
        命令:ftp (file transfer program) 
        格式:ftp hostname 
        功能:网络文件传输及远程操作。 
        选项:ftp命令: 
               cd [dirname]  进入远程机的目录 
               lcd [dirname] 设置本地机的目录 
               dir/ls        显示远程的目录文件 
               bin           以二进制方式进行传输 
       asc           以文本文件方式进行传输 
               get/mget      从远程机取一个或多个文件 
               put/mput      向远程机送一个或多个文件 
               prompt        打开或关闭多个文件传送时的交互提示 
               close         关闭与远程机的连接 
               quit          退出ftp 
       !/exit ftp登陆状态下,!表示暂时退出ftp状态回到本地目录,exit表示返回ftp状态 
        注释: 
        例如:% ftp hostname 

    24. 查看自己的电子邮件 
        命令:mailx 
        格式:mailx 
        选项: 
    delete  删除 
    next    下一个 
    quit    退出 
             reply   回复    

    25. 回忆命令 
        命令:history 
        格式:history 
        功能:帮助用户回忆执行过的命令。 
        选项: 
        注释: 
        例如:% history 

    26. 网上对话 
        命令:talk 
        格式:talk username 
        功能:在网上与另一用户进行对话。 
        选项: 
        注释:对话时系统把终端分为上下两部分,上半部显示自己键入信息,下半部 
              显示对方用户键入的信息。键入delete或Ctrl+C则结束对话。 
        例如:% talk username 

    27. 允许或拒绝接受信息 
        命令:mesg (message) 
        格式:mesg [n/y] 
        功能:允许或拒绝其它用户向自己所用的终端发送信息。 
        选项:n 拒绝其它用户向自己所用的终端写信息 
              y 允许其它用户向自己所用的终端写信息(缺省值) 
        注释: 
        例如:% mesg n 

    28. 给其他用户写信息 
        命令:write 
        格式:write username [ttyname] 
        功能:给其他用户的终端写信息。 
        选项: 
        注释:若对方没有拒绝,两用户可进行交谈,键入EOF或Ctrl+C则结束对话。 
        例如:write username 

    29. 创建、修改、删除用户和群组 
        a. 创建群组: 
    例如: groupadd oinstall    创建群组名为oinstall的组 
    groupadd -g 344 dba  
    创建组号是344的组,此时在/etc/passwd文件中产生一个组ID(GID)是344的项目。 
        b. 修改群组: 
    groupmod:该命令用于改变用户组帐号的属性 
    groupmod –g 新的GID 用户组帐号名 
    groupmod –n 新组名 原组名:此命令由于改变用户组的名称 

        c. 删除群组: 
    groupdel 组名:该命令用于删除指定的组帐号 

        d. 新建用户: 
    命令: useradd [-d home] [-s shell] [-c comment] [-m [-k template]] 
    [-f inactive] [-e expire ] [-p passwd] [-r] name 
    主要参数 
    -c:加上备注文字,备注文字保存在passwd的备注栏中。  
    -d:指定用户登入时的启始目录。 
    -D:变更预设值。 
    -e:指定账号的有效期限,缺省表示永久有效。 
    -f:指定在密码过期后多少天即关闭该账号。 
    -g:指定用户所属的群组。 
    -G:指定用户所属的附加群组。 
    -m:自动建立用户的登入目录。 
    -M:不要自动建立用户的登入目录。 
    -n:取消建立以用户名称为名的群组。 
    -r:建立系统账号。 
    -s:指定用户登入后所使用的shell。 
    -u:指定用户ID号。 

    举例: # useradd -g oinstall -G dba oracle  创建Oracle用户 
        
        e. 删除用户 
    命令: userdel 用户名 
    删除指定的用户帐号 
    userdel –r 用户名(userdel 用户名;rm 用户名):删除指定的用户帐号及宿主目录 
    例:#useradd -g root kkk //把kkk用户加入root组里 

        f. 修改用户 
    命令: usermod
    修改已有用户的信息 
    usermod –l 旧用户名 新用户名: 修改用户名 
    usermod –L 用户名: 用于锁定指定用户账号,使其不能登陆系统 
    usermod –U 用户名: 对锁定的用户帐号进行解锁 
    passwd –d 用户名: 使帐号无口令,即用户不需要口令就能登录系统 
    例:#usermod -l user2 user1 //把用户user2改名为user1 

    30. 启动、关闭防火墙 
    永久打开或则关闭 
    chkconfig iptables on 
    chkconfig iptables off 
    即时生效:重启后还原 
    service iptables start 
    service iptables stop 
         或者: 
    /etc/init.d/iptables start 
    /etc/init.d/iptables stop 

    31. 启动VSFTP服务 
    即时启动: /etc/init.d/vsftpd start 
    即时停止: /etc/init.d/vsftpd stop 

    开机默认VSFTP服务自动启动: 
    方法一:(常用方便) 
    [root@localhost etc]# chkconfig --list|grep vsftpd ( 查看情况) 
    vsftpd          0:off   1:off   2:off   3:off   4:off   5:off   6:off 
    [root@localhost etc]# chkconfig vsftpd on  (执行ON设置) 
    或者:方法二: 
    修改文件 /etc/rc.local , 把行/usr/local/sbin/vsftpd & 插入文件中,以实现开机自动启动。 

    32. vi技巧 
    a. 进入输入模式 
    新增 (append) 
    a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。 
    A:从光标所在列最後面的地方开始新增资料。 

    插入 (insert) 
    i:从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。 
    I :从光标所在列的第一个非空白字元前面开始插入资料。 

    开始 (open) 
    o :在光标所在列下新增一列并进入输入模式。 
    O: 在光标所在列上方新增一列并进入输入模式。 
    b. 退出vi 
    在指令模式下键入:q,:q!,:wq或:x(注意:号),就会退出vi。其中:wq和:x是存盘退出,而:q是直接退出,如果文件已有新的变化,vi会提示你保存文件而:q命令也会失效,这时你可以用:w命令保存文件后再用:q 退出,或用:wq或:x命令退出,如果你不想保存改变后的文件,你就需要用:q!命令,这个命令将不保存文件而直接退出vi。 

    c. 删除与修改文件的命令: 
    x:删除光标所在字符。 
    dd :删除光标所在的列。 
    r :修改光标所在字元,r 後接著要修正的字符。 
    R:进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC] 回到指令模式下为止。 
    s:删除光标所在字元,并进入输入模式。 
    S:删除光标所在的列,并进入输入模式。 

    d. 屏幕翻滚类命令 
    Ctrl+u: 向文件首翻半屏 
    Ctrl+d: 向文件尾翻半屏 
    Ctrl+f: 向文件尾翻一屏 
    Ctrl+b: 向文件首翻一屏 
    nz: 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。 

    e. 删除命令 
    ndw或ndW: 删除光标处开始及其后的n-1个字 
    do: 删至行首 
    d$: 删至行尾 
    ndd: 删除当前行及其后n-1行 
    x或X: 删除一个字符,x删除光标后的,而X删除光标前的 
    Ctrl+u: 删除输入方式下所输入的文本 

    f. 搜索及替换命令 
    /pattern: 从光标开始处向文件尾搜索pattern 
    ?pattern: 从光标开始处向文件首搜索pattern 
    n: 在同一方向重复上一次搜索命令 
    N: 在反方向上重复上一次搜索命令 
    :s/p1/p2/g: 将当前行中所有p1均用p2替代 
    :n1,n2s/p1/p2/g: 将第n1至n2行中所有p1均用p2替代 
    :g/p1/s//p2/g: 将文件中所有p1均用p2替换 

    g. 复制,黏贴 
    (1) 选定文本块,使用v进入可视模式;移动光标键选定内容 
    (2) 复制选定块到缓冲区,用y;复制整行,用yy 
    (3) 剪切选定块到缓冲区,用d;剪切整行用dd 
    (4) 粘贴缓冲区中的内容,用p 

    h. 其他 
    在同一编辑窗打开第二个文件,用:sp [filename] 
    在多个编辑文件之间切换,用Ctrl+w

  • 相关阅读:
    读《成交》有感
    【VC++学习笔记二】绘制图片的双缓冲技术
    【VC++学习笔记一】MFC操作Excel
    敏捷软件开发
    VIM常用命令
    Ubuntu下配置samba实现文件夹共享
    linux系统编程之管道(三):命令管道(FIFO)
    linux系统编程之管道(二):管道读写规则
    linux系统编程之管道(一):匿名管道(pipe)
    《Linux环境进程间通信》系列文章链接
  • 原文地址:https://www.cnblogs.com/dpwindy/p/9143097.html
Copyright © 2020-2023  润新知