zoukankan      html  css  js  c++  java
  • pgrep,pidof工具的使用

    博客pgrep,pidof工具的使用

     

    最灵活:ps 选项 | 其它命令
    按预定义的模式:pgrep
    pgrep [options] pattern
    -u uid: effective user,生效者
    -U uid: real user,真正发起运行命令者
    -t terminal: 与指定终端相关的进程
    -l: 显示进程名
    -a: 显示完整格式的进程名
    -P pid: 显示指定进程的子进程
    按确切的程序名称:/sbin/pidof

    一-t terminal: 显示与指定终端相关的进程

    [root@centos72 ~]# pgrep   -t  pts/1
    [root@centos72 ~]# pgrep   -t  pts/3
    2114
    [root@centos72 ~]# tty
    /dev/pts/2
    [root@centos72 ~]# pgrep   -t  pts/2
    2057
    [root@centos72 ~]# pstree -p
    systemd(1)─┬─NetworkManager(544)─┬─{NetworkManager}(591)
               │                     └─{NetworkManager}(593)
               ├─VGAuthService(545)
               ├─agetty(558)
               ├─auditd(515)───{auditd}(516)
               ├─crond(555)
               ├─dbus-daemon(540)───{dbus-daemon}(542)
               ├─httpd(2295)─┬─httpd(2296)
               │             ├─httpd(2297)
               │             ├─httpd(2298)
               │             ├─httpd(2299)
               │             └─httpd(2300)
               ├─irqbalance(538)
               ├─master(869)─┬─pickup(2590)
               │             └─qmgr(871)
               ├─polkitd(539)─┬─{polkitd}(541)
               │              ├─{polkitd}(543)
               │              ├─{polkitd}(569)
               │              ├─{polkitd}(570)
               │              └─{polkitd}(573)
               ├─rsyslogd(787)─┬─{rsyslogd}(790)
               │               └─{rsyslogd}(791)
               ├─sshd(785)─┬─sshd(2053)───bash(2057)─┬─head(2987)
               │           │                         └─watch(2986)
               │           └─sshd(2110)───bash(2114)───pstree(3658)
               ├─systemd-journal(357)
               ├─systemd-logind(548)
               ├─systemd-udevd(388)
               ├─tuned(784)─┬─{tuned}(1026)
               │            ├─{tuned}(1027)
               │            ├─{tuned}(1028)
               │            └─{tuned}(1041)
               └─vmtoolsd(546)───{vmtoolsd}(580)

    二-l: 显示进程名

    [root@centos72 ~]# pgrep   -t  pts/2  -l
    2057 bash
    [root@centos72 ~]# pgrep   -lt  pts/2  
    2057 bash

     注意必须和t组合起来

    [root@centos72 ~]# pgrep   -lt  pts/1  
    1259 bash
    [root@centos72 ~]# pgrep   -l  pts/1  

    三-a: 显示完整格式的进程名

    注意t选项是不可少的

    [root@centos72 ~]# pgrep   -at  pts/1
    1259 -bash
    [root@centos72 ~]# pgrep   -a  pts/1
    [root@centos72 ~]# pgrep   -a  pts/1

    在一个终端上查看另外一个终端的进程

    [root@centos72 ~]# pgrep   -at  pts/3
    2114 -bash
    3840 su - wang
    3841 -bash
    3864 passwd
    [root@centos72 ~]# tty
    /dev/pts/2

     另外一个终端

    [root@centos72 ~]# tty
    /dev/pts/3
    [root@centos72 ~]# su  - wang
    Last login: Sat May 18 16:20:19 CST 2019 on pts/3
    [wang@centos72 ~]$ passwd
    Changing password for user wang.
    Changing password for wang.
    (current) UNIX password: 

    注意a选项不能在t后面,否则不会显示。因为t后面必须是终端,a相当于小三

    [root@centos72 ~]# pgrep   -ta  pts/3
    [root@centos72 ~]# pgrep   -ta  pts/2
    [root@centos72 ~]# pgrep   -ta  pts/1

    四-P pid: 显示指定进程的子进程

    [root@centos72 ~]# pgrep   -at  pts/3
    2114 -bash
    3840 su - wang
    3841 -bash
    3864 passwd
    [root@centos72 ~]# pgrep   -P    3840
    3841
    [root@centos72 ~]# pstree -p
    systemd(1)─┬─NetworkManager(544)─┬─{NetworkManager}(591)
               │                     └─{NetworkManager}(593)
               ├─VGAuthService(545)
               ├─agetty(558)
               ├─auditd(515)───{auditd}(516)
               ├─crond(555)
               ├─dbus-daemon(540)───{dbus-daemon}(542)
               ├─httpd(2295)─┬─httpd(2296)
               │             ├─httpd(2297)
               │             ├─httpd(2298)
               │             ├─httpd(2299)
               │             └─httpd(2300)
               ├─irqbalance(538)
               ├─master(869)─┬─pickup(2590)
               │             └─qmgr(871)
               ├─polkitd(539)─┬─{polkitd}(541)
               │              ├─{polkitd}(543)
               │              ├─{polkitd}(569)
               │              ├─{polkitd}(570)
               │              └─{polkitd}(573)
               ├─rsyslogd(787)─┬─{rsyslogd}(790)
               │               └─{rsyslogd}(791)
               ├─sshd(785)─┬─sshd(2053)───bash(2057)───pstree(3875)
               │           └─sshd(2110)───bash(2114)───su(3840)───bash(3841)───passwd(3864)
               ├─systemd-journal(357)
               ├─systemd-logind(548)
               ├─systemd-udevd(388)
               ├─tuned(784)─┬─{tuned}(1026)
               │            ├─{tuned}(1027)
               │            ├─{tuned}(1028)
               │            └─{tuned}(1041)
               └─vmtoolsd(546)───{vmtoolsd}(580)

    五-u uid: effective user,生效者

    [root@centos72 ~]# su  - wang
    Last login: Sat May 18 16:20:19 CST 2019 on pts/3
    [wang@centos72 ~]$ passwd
    Changing password for user wang.
    Changing password for wang.
    (current) UNIX password: 
    [root@centos72 ~]# pgrep  -lu  wang
    3841 bash

    注意pgrep, pkill两个命令的帮助文档是一样的

    PGREP(1)                                    User Commands                                    PGREP(1)
    
    NAME
           pgrep, pkill - look up or signal processes based on name and other attributes

    还支持扩展的正则表达式

    因为pgrep是ps和grep的结合

    OPERANDS
           pattern
                  Specifies an Extended Regular Expression for matching against the process names or com‐
                  mand lines.

    六结合正则表达式

    注意可以使用ps结合grep也可以搜索出来的

    [root@centos72 ~]# su  - wang
    Last login: Sat May 18 16:21:27 CST 2019 on pts/3
    [wang@centos72 ~]$ passwd
    Changing password for user wang.
    Changing password for wang.
    (current) UNIX password: 
    [root@centos72 ~]# pgrep   -l  "pass.*"
    3928 passwd
    [root@centos72 ~]# pgrep   -l  "ba.*"
    21 writeback
    538 irqbalance
    2057 bash
    2114 bash
    3904 bash
    [root@centos72 ~]# pgrep   -l  "bas.*"
    2057 bash
    2114 bash
    3904 bash

    七按确切的程序名称:pidof   bash

    [root@centos72 ~]# pgrep   -l  "bas.*"
    2057 bash
    2114 bash
    3904 bash
    [root@centos72 ~]# pidof bash
    3904 2114 2057
    [root@centos72 ~]# pstree -p
    systemd(1)─┬─NetworkManager(544)─┬─{NetworkManager}(591)
               │                     └─{NetworkManager}(593)
               ├─VGAuthService(545)
               ├─agetty(558)
               ├─auditd(515)───{auditd}(516)
               ├─crond(555)
               ├─dbus-daemon(540)───{dbus-daemon}(542)
               ├─httpd(2295)─┬─httpd(2296)
               │             ├─httpd(2297)
               │             ├─httpd(2298)
               │             ├─httpd(2299)
               │             └─httpd(2300)
               ├─irqbalance(538)
               ├─master(869)─┬─pickup(2590)
               │             └─qmgr(871)
               ├─polkitd(539)─┬─{polkitd}(541)
               │              ├─{polkitd}(543)
               │              ├─{polkitd}(569)
               │              ├─{polkitd}(570)
               │              └─{polkitd}(573)
               ├─rsyslogd(787)─┬─{rsyslogd}(790)
               │               └─{rsyslogd}(791)
               ├─sshd(785)─┬─sshd(2053)───bash(2057)───pstree(3936)
               │           └─sshd(2110)───bash(2114)───su(3903)───bash(3904)───passwd(3928)
               ├─systemd-journal(357)
               ├─systemd-logind(548)
               ├─systemd-udevd(388)
               ├─tuned(784)─┬─{tuned}(1026)
               │            ├─{tuned}(1027)
               │            ├─{tuned}(1028)
               │            └─{tuned}(1041)
               └─vmtoolsd(546)───{vmtoolsd}(580)

    在6上设置httpd为没有线程的进程

    [root@centos65 ~]# diff   /etc/sysconfig/httpd{,.bak}
    [root@centos65 ~]# cat  /etc/sysconfig/httpd
    # Configuration file for the httpd service.
    
    #
    # The default processing model (MPM) is the process-based
    # 'prefork' model.  A thread-based model, 'worker', is also
    # available, but does not work with some modules (such as PHP).
    # The service must be stopped before changing this variable.
    #
    #HTTPD=/usr/sbin/httpd.worker
    
    #
    # To pass additional options (for instance, -D definitions) to the
    # httpd binary at startup, set OPTIONS here.
    #
    #OPTIONS=
    
    #
    # By default, the httpd process is started in the C locale; to 
    # change the locale in which the server runs, the HTTPD_LANG
    # variable can be set.
    #
    #HTTPD_LANG=C
    
    #
    # By default, the httpd process will create the file
    # /var/run/httpd/httpd.pid in which it records its process
    # identification number when it starts.  If an alternate location is
    # specified in httpd.conf (via the PidFile directive), the new
    # location needs to be reported in the PIDFILE.
    #
    #PIDFILE=/var/run/httpd/httpd.pid
    [root@centos65 ~]# service httpd  restart 
    Stopping httpd:                                            [  OK  ]
    Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using centos65.jd.com for ServerName
                                                               [  OK  ]
    [root@centos65 ~]# 
    [root@centos65 ~]# pstree -p
    init(1)─┬─abrt-dump-oops(1811)
            ├─abrtd(1801)
            ├─acpid(1428)
            ├─atd(1858)
            ├─auditd(1251)───{auditd}(1252)
            ├─automount(1511)─┬─{automount}(1512)
            │                 ├─{automount}(1513)
            │                 ├─{automount}(1528)
            │                 └─{automount}(1531)
            ├─crond(1843)
            ├─dbus-daemon(1389)───{dbus-daemon}(1391)
            ├─dnsmasq(2023)
            ├─hald(1440)─┬─hald-runner(1441)─┬─hald-addon-acpi(1495)
            │            │                   └─hald-addon-inpu(1473)
            │            └─{hald}(1442)
            ├─httpd(12606)─┬─httpd(12608)
            │              ├─httpd(12609)
            │              ├─httpd(12610)
            │              ├─httpd(12611)
            │              ├─httpd(12612)
            │              ├─httpd(12613)
            │              ├─httpd(12614)
            │              └─httpd(12615)
            ├─irqbalance(1307)
            ├─ksmtuned(1830)───sleep(12576)
            ├─libvirtd(1875)─┬─{libvirtd}(1876)
            │                ├─{libvirtd}(1877)
            │                ├─{libvirtd}(1878)
            │                ├─{libvirtd}(1879)
            │                ├─{libvirtd}(1880)
            │                ├─{libvirtd}(1881)
            │                ├─{libvirtd}(1882)
            │                ├─{libvirtd}(1883)
            │                ├─{libvirtd}(1884)
            │                └─{libvirtd}(1885)
            ├─master(1772)─┬─pickup(11801)
            │              └─qmgr(1779)
            ├─mingetty(1916)
            ├─mingetty(1918)
            ├─mingetty(1920)
            ├─mingetty(1922)
            ├─mingetty(1924)
            ├─mingetty(1926)
            ├─rpc.idmapd(1633)
            ├─rpc.mountd(1588)
            ├─rpc.rquotad(1583)
            ├─rpc.statd(1354)
            ├─rpcbind(1332)
            ├─rsyslogd(1273)─┬─{rsyslogd}(1274)
            │                ├─{rsyslogd}(1276)
            │                └─{rsyslogd}(1277)
            ├─sshd(1682)───sshd(2134)───bash(2138)───pstree(12619)
            ├─udevd(536)─┬─udevd(1933)
            │            └─udevd(1934)
            └─xinetd(1693)
    [root@centos65 ~]# pidof  httpd 
    12615 12614 12613 12612 12611 12610 12609 12608 12606

    停止服务,返回值为1

    [root@centos65 ~]# service httpd  stop
    Stopping httpd:                                            [  OK  ]
    [root@centos65 ~]# pidof  httpd 
    [root@centos65 ~]# echo  $?
    1

    重启服务之后显示为0

    pidof httpd的作用就是检查进程是否正常工作,如果进程死了那么就要激活

    [root@centos65 ~]# service httpd  restart 
    Stopping httpd:                                            [  OK  ]
    Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using centos65.jd.com for ServerName
                                                               [  OK  ]
    [root@centos65 ~]# pidof  httpd 
    12723
    [root@centos65 ~]# echo  $?
    0

    脚本之间是可以自己调用自己

     如果服务运行那么就什么也不做,否则就重启服务

    [root@centos65 ~]# pstree -p
    init(1)─┬─abrt-dump-oops(1811)
            ├─abrtd(1801)
            ├─acpid(1428)
            ├─atd(1858)
            ├─auditd(1251)───{auditd}(1252)
            ├─automount(1511)─┬─{automount}(1512)
            │                 ├─{automount}(1513)
            │                 ├─{automount}(1528)
            │                 └─{automount}(1531)
            ├─crond(1843)
            ├─dbus-daemon(1389)───{dbus-daemon}(1391)
            ├─dnsmasq(2023)
            ├─hald(1440)─┬─hald-runner(1441)─┬─hald-addon-acpi(1495)
            │            │                   └─hald-addon-inpu(1473)
            │            └─{hald}(1442)
            ├─httpd(12723)─┬─httpd(12726)
            │              ├─httpd(12727)
            │              ├─httpd(12728)
            │              ├─httpd(12729)
            │              ├─httpd(12730)
            │              ├─httpd(12731)
            │              ├─httpd(12732)
            │              └─httpd(12733)
            ├─irqbalance(1307)
            ├─ksmtuned(1830)───sleep(13100)
            ├─libvirtd(1875)─┬─{libvirtd}(1876)
            │                ├─{libvirtd}(1877)
            │                ├─{libvirtd}(1878)
            │                ├─{libvirtd}(1879)
            │                ├─{libvirtd}(1880)
            │                ├─{libvirtd}(1881)
            │                ├─{libvirtd}(1882)
            │                ├─{libvirtd}(1883)
            │                ├─{libvirtd}(1884)
            │                └─{libvirtd}(1885)
            ├─master(1772)─┬─pickup(11801)
            │              └─qmgr(1779)
            ├─mingetty(1916)
            ├─mingetty(1918)
            ├─mingetty(1920)
            ├─mingetty(1922)
            ├─mingetty(1924)
            ├─mingetty(1926)
            ├─rpc.idmapd(1633)
            ├─rpc.mountd(1588)
            ├─rpc.rquotad(1583)
            ├─rpc.statd(1354)
            ├─rpcbind(1332)
            ├─rsyslogd(1273)─┬─{rsyslogd}(1274)
            │                ├─{rsyslogd}(1276)
            │                └─{rsyslogd}(1277)
            ├─sshd(1682)─┬─sshd(2134)───bash(2138)
            │            └─sshd(12948)───bash(12961)───pstree(13101)
            ├─udevd(536)─┬─udevd(1933)
            │            └─udevd(1934)
            └─xinetd(1693)

    创建脚本

    [root@centos65 ~]# vim  /bin/f1.sh
    [root@centos65 ~]# ll /bin/f1.sh 
    -rw-r--r--. 1 root root 101 May 18 17:12 /bin/f1.sh
    [root@centos65 ~]# chmod  a+x  /bin/f1.sh 
    [root@centos65 ~]# ll /bin/f1.sh 
    -rwxr-xr-x. 1 root root 101 May 18 17:12 /bin/f1.sh    
    [root@centos65 ~]# echo $PATH 
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    [root@centos65 ~]# bash  /bin/f1.sh 
    ^C
    [root@centos65 ~]# cat  /bin/f1.sh 
    #!/bin/bash
    sleep  2
    pidof  httpd   &> /dev/null  ||  service  httpd  restart   &>  /dev/null
    f1.sh

    执行脚本

    生成了很多的子进程,不能显示全部的,所以就显示+

    sshd(1682)─┬─sshd(2134)───bash(2138)───bash(13112)───f1.sh(13116)───f1.sh(13121)───f1.sh(1312+

    [root@centos65 ~]# pstree -p
    init(1)─┬─abrt-dump-oops(1811)
            ├─abrtd(1801)
            ├─acpid(1428)
            ├─atd(1858)
            ├─auditd(1251)───{auditd}(1252)
            ├─automount(1511)─┬─{automount}(1512)
            │                 ├─{automount}(1513)
            │                 ├─{automount}(1528)
            │                 └─{automount}(1531)
            ├─crond(1843)
            ├─dbus-daemon(1389)───{dbus-daemon}(1391)
            ├─dnsmasq(2023)
            ├─hald(1440)─┬─hald-runner(1441)─┬─hald-addon-acpi(1495)
            │            │                   └─hald-addon-inpu(1473)
            │            └─{hald}(1442)
            ├─httpd(12723)─┬─httpd(12726)
            │              ├─httpd(12727)
            │              ├─httpd(12728)
            │              ├─httpd(12729)
            │              ├─httpd(12730)
            │              ├─httpd(12731)
            │              ├─httpd(12732)
            │              └─httpd(12733)
            ├─irqbalance(1307)
            ├─ksmtuned(1830)───sleep(13111)
            ├─libvirtd(1875)─┬─{libvirtd}(1876)
            │                ├─{libvirtd}(1877)
            │                ├─{libvirtd}(1878)
            │                ├─{libvirtd}(1879)
            │                ├─{libvirtd}(1880)
            │                ├─{libvirtd}(1881)
            │                ├─{libvirtd}(1882)
            │                ├─{libvirtd}(1883)
            │                ├─{libvirtd}(1884)
            │                └─{libvirtd}(1885)
            ├─master(1772)─┬─pickup(11801)
            │              └─qmgr(1779)
            ├─mingetty(1916)
            ├─mingetty(1918)
            ├─mingetty(1920)
            ├─mingetty(1922)
            ├─mingetty(1924)
            ├─mingetty(1926)
            ├─rpc.idmapd(1633)
            ├─rpc.mountd(1588)
            ├─rpc.rquotad(1583)
            ├─rpc.statd(1354)
            ├─rpcbind(1332)
            ├─rsyslogd(1273)─┬─{rsyslogd}(1274)
            │                ├─{rsyslogd}(1276)
            │                └─{rsyslogd}(1277)
            ├─sshd(1682)─┬─sshd(2134)───bash(2138)───bash(13112)───f1.sh(13116)───f1.sh(13121)───f1.sh(1312+
            │            └─sshd(12948)───bash(12961)───pstree(13149)
            ├─udevd(536)─┬─udevd(1933)
            │            └─udevd(1934)
            └─xinetd(1693)

    一直执行脚本,并且停止httpd服务

    [root@centos65 ~]# bash  /bin/f1.sh 

    进程一会儿就会自动激活了

    [root@centos65 ~]# service httpd  stop 
    Stopping httpd:                                            [  OK  ]
    [root@centos65 ~]# pidof  httpd
    13424
    [root@centos65 ~]# pidof  httpd
    13424
    [root@centos65 ~]# pidof  httpd
    13424
    [root@centos65 ~]# pidof  httpd
    13429
    [root@centos65 ~]# pidof  httpd
    13429
    [root@centos65 ~]# pidof  httpd
    13429
    [root@centos65 ~]# pidof  httpd
    13449 13448 13447 13446 13445 13444 13443 13442 13429
    [root@centos65 ~]# pidof  httpd
    13449 13448 13447 13446 13445 13444 13443 13442 13429

    在有些情况下一个脚本调用另外一个脚本

    修改脚本

    此脚本实际上是一种循环的变种

    [root@centos65 ~]# vim  /bin/f1.sh 
    [root@centos65 ~]# cat   /bin/f1.sh 
    #!/bin/bash
    sleep  2
    pidof  httpd   &> /dev/null  ||  service  httpd  restart   &>  /dev/null
    source f1.sh
    
    [root@centos65 ~]# bash  /bin/f1.sh 

    不会生成子进程了,因为source是自己调用自己

    [root@centos65 ~]# pstree -p
    init(1)─┬─abrt-dump-oops(1811)
            ├─abrtd(1801)
            ├─acpid(1428)
            ├─atd(1858)
            ├─auditd(1251)───{auditd}(1252)
            ├─automount(1511)─┬─{automount}(1512)
            │                 ├─{automount}(1513)
            │                 ├─{automount}(1528)
            │                 └─{automount}(1531)
            ├─crond(1843)
            ├─dbus-daemon(1389)───{dbus-daemon}(1391)
            ├─dnsmasq(2023)
            ├─hald(1440)─┬─hald-runner(1441)─┬─hald-addon-acpi(1495)
            │            │                   └─hald-addon-inpu(1473)
            │            └─{hald}(1442)
            ├─httpd(13429)─┬─httpd(13442)
            │              ├─httpd(13443)
            │              ├─httpd(13444)
            │              ├─httpd(13445)
            │              ├─httpd(13446)
            │              ├─httpd(13447)
            │              ├─httpd(13448)
            │              └─httpd(13449)
            ├─irqbalance(1307)
            ├─ksmtuned(1830)───sleep(15221)
            ├─libvirtd(1875)─┬─{libvirtd}(1876)
            │                ├─{libvirtd}(1877)
            │                ├─{libvirtd}(1878)
            │                ├─{libvirtd}(1879)
            │                ├─{libvirtd}(1880)
            │                ├─{libvirtd}(1881)
            │                ├─{libvirtd}(1882)
            │                ├─{libvirtd}(1883)
            │                ├─{libvirtd}(1884)
            │                └─{libvirtd}(1885)
            ├─master(1772)─┬─pickup(13426)
            │              └─qmgr(1779)
            ├─mingetty(1916)
            ├─mingetty(1918)
            ├─mingetty(1920)
            ├─mingetty(1922)
            ├─mingetty(1924)
            ├─mingetty(1926)
            ├─rpc.idmapd(1633)
            ├─rpc.mountd(1588)
            ├─rpc.rquotad(1583)
            ├─rpc.statd(1354)
            ├─rpcbind(1332)
            ├─rsyslogd(1273)─┬─{rsyslogd}(1274)
            │                ├─{rsyslogd}(1276)
            │                └─{rsyslogd}(1277)
            ├─sshd(1682)─┬─sshd(2134)───bash(2138)───bash(15223)───sleep(15244)
            │            └─sshd(12948)───bash(12961)───pstree(15246)
            ├─udevd(536)─┬─udevd(1933)
            │            └─udevd(1934)
            └─xinetd(1693)

    服务停止之后还会生成进程

    [root@centos65 ~]# pidof  httpd
    13449 13448 13447 13446 13445 13444 13443 13442 13429
    [root@centos65 ~]# service httpd  stop 
    Stopping httpd:                                            [  OK  ]
    [root@centos65 ~]# pidof  httpd
    15380 15379 15378 15377 15376 15375 15374 15373 15370

    监控进程的时候可以写一个类似的脚本对重要的进程进行监控,比如阿帕奇、nginx、tomcat等等,特别是在小型环境里面使用不到像zabbix这么复杂的软件。


    作者:wang618
    出处:https://www.cnblogs.com/wang618/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 (转)
    JSON数据解析(转)
    JSON数据解析(GSON方式) (转)
    ASP.NET MVC学习之Ajax(完结)
    Newtonsoft.Json(Json.Net)学习笔记
    IDEA教程之导入maven项目
    idea language level 介绍
    .net core Asp.net Mvc Ef 网站搭建 vs2017 1)
    【MVC】快速构建一个图片浏览网站
    asp.netmvc 三层搭建一个完整的项目
  • 原文地址:https://www.cnblogs.com/wang618/p/11202998.html
Copyright © 2011-2022 走看看