首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

运维神器——LSOF

因为实在是太喜欢 lsof 这个命令,所以就为这个命令 lsof 专门写一篇文章介绍一下,来让大伙瞧一瞧这个命令 lsof 的神器之处。

lsof(list open files)是一个查看当前系统文件的工具。在 linux 环境下,任何事物都以文件的形式存在,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件;如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于此应用程序的信息。

我们用 losf -h 可以查看一下这个命令可以加哪些参数选项,当然,更详细的介绍可以 man lsof 看一下。

[root@Amber log]# lsof -h

lsof4.87

latest revision:ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/

latest FAQ:ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ

latest man page:ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man

usage:[-?abhKlnNoOPRtUvVX][+|-c c][+|-d s][+D D][+|-f[gG]][+|-e s]

[-F[f]][-g[s]][-i[i]][+|-L[l]][+m[m]][+|-M][-o[o]][-p s]

[+|-r[t]][-s[p:s]][-S[t]][-T[t]][-u s][+|-w][-x[fl]][--][names]

Defaultsinparentheses;comma-separatedset(s)items;dash-separated ranges.

-?|-h list help-a AND selections(OR)-b avoid kernel blocks

-c c cmd c^c/c/[bix]+c w COMMAND width(9)+d s dir s files

-d sselectbyFDset+D D dir D tree*SLOW?*+|-e s exempt s*RISKY*

-iselectIPv[46]files-K list tasKs(threads)-l list UID numbers

-nnohost names-NselectNFS files-o list file offset

-Onooverhead*RISKY*-Pnoport names-R list paRent PID

-s list file size-t terse listing-T disable TCP/TPI info

-UselectUnixsocket-v list version info-V verbose search

+|-wWarnings(+)-X skip TCP&UDP*files-Z Z context[Z]

--endoption scan

+f|-f+filesystemor-file names+|-f[gG]flaGs

-F[f]selectfields;-F?forhelp

+|-L[l]list(+)suppress(-)link counts

+m[m]use|create mount supplement

+|-M portMap registration(-)-o o o0toffset digits(8)

-p s exclude(^)|selectPIDs-S[t]t second stat timeout(15)

-T qs TCP/TPI Q,St(s)info

-g[s]exclude(^)|selectandprintprocessgroupIDs

-i iselectbyIPv[46]address:[46][proto][@host|addr][:svc_list|port_list]

+|-r[t[m]]repeat every t seconds(15);+untilnofiles,-forever.

Anoptional suffix to tism;m must separate tfromand

isan strftime(3)formatforthe marker line.

-s p:s exclude(^)|selectprotocol(p=TCP|UDP)statesbyname(s).

-u s exclude(^)|selectlogin|UIDsets

-x[fl]cross over+d|+DFilesystemsorsymbolicLinks

namesselectnamed filesorfiles on named file systems

Anyonecan list all files;/dev warnings disabled;kernel ID check disabled.

下面我们主要介绍一些非要有用的选项:

1、-a:列出打开文件存在的进程;

比如简单的我们查看一下某个文件是被哪个进程所占用了,常见的就是分析日志了,突然发现某个日志巨大或者该日志是否有作用,可以用这个命令试一下;可以看出文件的具体路径是根据输入不同显示不同的。

[root@Amber log]# lsof -a pyitgank.log

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

python11576root1wREG253,111709650736pyitgank.log

python11576root2wREG253,111709650736pyitgank.log

python11579root1wREG253,111709650736pyitgank.log

python11579root2wREG253,111709650736pyitgank.log

[root@Amber log]# lsof -a /data/www/log/pyitgank.log

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

python11576root1wREG253,111709650736/data/www/log/pyitgank.log

python11576root2wREG253,111709650736/data/www/log/pyitgank.log

python11579root1wREG253,111709650736/data/www/log/pyitgank.log

python11579root2wREG253,111709650736/data/www/log/pyitgank.log

2、-i:列出符合条件的进程(4、6、协议、:端口、 @ip );

这个最常用的就是查看某个端口是哪个进程所占用的了

[root@Amber log]# lsof -i:80

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

httpd1896apache3uIPv49745930t0TCP*:http(LISTEN)

httpd2213apache3uIPv49745930t0TCP*:http(LISTEN)

httpd3044root3uIPv49745930t0TCP*:http(LISTEN)

httpd8534apache3uIPv49745930t0TCP*:http(LISTEN)

httpd9627apache3uIPv49745930t0TCP*:http(LISTEN)

lsof -i 4 这个 4 表示 IPV4 6 就表示 IPV6

[root@Amber log]# lsof -i 4

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

systemd1root45uIPv4119330t0TCP*:sunrpc(LISTEN)

dhclient688root6uIPv4133750t0UDP*:bootpc

dhclient688root20uIPv4133480t0UDP*:netmpi

sshd752root3uIPv4128390t0TCP*:ms-olap1(LISTEN)

httpd1896apache3uIPv49745930t0TCP*:http(LISTEN)

httpd1896apache4uIPv49746100t0TCP*:https(LISTEN)

httpd1896apache28uIPv466123460t0TCP localhost:57000->localhost:commplex-main(CLOSE_WAIT)

httpd1896apache30uIPv466059190t0TCP localhost:49910->localhost:intermapper(ESTABLISHED)

mindoc_li2000root3uIPv464577000t0TCP localhost:44602->localhost:cogsys-lm(ESTABLISHED)

mindoc_li2000root9uIPv465998470t0TCP localhost:50722->localhost:cogsys-lm(ESTABLISHED)

httpd2213apache3uIPv49745930t0TCP*:http(LISTEN)

httpd2213apache4uIPv49746100t0TCP*:https(LISTEN)

httpd3044root3uIPv49745930t0TCP*:http(LISTEN)

httpd3044root4uIPv49746100t0TCP*:https(LISTEN)

sshd6490root3uIPv466113410t0TCPAmber:ms-olap1->101.95.173.162:54113(ESTABLISHED)

httpd8534apache3uIPv49745930t0TCP*:http(LISTEN)

httpd8534apache4uIPv49746100t0TCP*:https(LISTEN)

httpd8534apache26uIPv466239180t0TCPAmber:https->crawl-203-208-60-148.googlebot.com:40163(ESTABLISHED)

httpd8534apache30uIPv466245400t0TCP localhost:57366->localhost:commplex-main(ESTABLISHED)

httpd9627apache3uIPv49745930t0TCP*:http(LISTEN)

httpd9627apache4uIPv49746100t0TCP*:https(LISTEN)

httpd9627apache28uIPv466233230t0TCP localhost:57312->localhost:commplex-main(CLOSE_WAIT)

goaccess9965root24uIPv466218900t0TCP localhost:7890(LISTEN)

python11579root4uIPv434348600t0TCP localhost:irdmi(LISTEN)

dotnet25234root164uIPv459629150t0TCP localhost:commplex-main(LISTEN)

dotnet25234root171uIPv466237980t0TCP localhost:commplex-main->localhost:57366(ESTABLISHED)

dotnet25234root206uIPv459638160t0TCP localhost:43984->localhost:cogsys-lm(ESTABLISHED)

dotnet25234root214uIPv459629740t0TCP localhost:54080->localhost:cogsys-lm(ESTABLISHED)

dotnet25234root215uIPv459629750t0TCP localhost:57509->localhost:cogsys-lm(ESTABLISHED)

dotnet25234root216uIPv459629760t0TCP localhost:36908->localhost:cogsys-lm(ESTABLISHED)

dotnet25234root217uIPv459629800t0TCP localhost:36467->localhost:cogsys-lm(ESTABLISHED)

[root@Amber log]# lsof -i 6

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

dhclient688root21uIPv6133490t0UDP*:36145

sshd752root4uIPv6128410t0TCP*:ms-olap1(LISTEN)

mindoc_li2000root5uIPv666059200t0TCP localhost:intermapper->localhost:49910(ESTABLISHED)

mindoc_li2000root6uIPv6801190t0TCP*:intermapper(LISTEN)

mysqld15375mysql20uIPv634420540t0TCP*:cogsys-lm(LISTEN)

mysqld15375mysql27uIPv659638240t0TCP localhost:cogsys-lm->localhost:43984(ESTABLISHED)

mysqld15375mysql30uIPv659638290t0TCP localhost:cogsys-lm->localhost:54080(ESTABLISHED)

mysqld15375mysql32uIPv659638330t0TCP localhost:cogsys-lm->localhost:57509(ESTABLISHED)

mysqld15375mysql33uIPv659638340t0TCP localhost:cogsys-lm->localhost:36908(ESTABLISHED)

mysqld15375mysql38uIPv659638350t0TCP localhost:cogsys-lm->localhost:36467(ESTABLISHED)

mysqld15375mysql72uIPv664577010t0TCP localhost:cogsys-lm->localhost:44602(ESTABLISHED)

mysqld15375mysql75uIPv665998480t0TCP localhost:cogsys-lm->localhost:50722(ESTABLISHED)

同样还可以跟 tcp 或者 udp 表示不同的协议,

然后如果要查找当前主机和某个 ip 的通信情况,可以 lsof -i @ip

[root@Amber log]# lsof -i @101.95.173.162

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sshd6490root3uIPv466113410t0TCPAmber:ms-olap1->101.95.173.162:54113(ESTABLISHED)

3、-c:列出指定进程所打开的文件;

4、-g:列出 GID 号进程详情;

5、-d:列出占用该文件号的进程;

6、+d:列出目录下被打开的文件;

7、+D:递归列出目录下被打开的文件;

8、-n:列出使用 NFS 的文件;

9、-p:列出指定进程号所打开的文件;

往往有时候我们只知道进程的 pid,却不知道进程所在的目录,尤其是许多 java 进程,只是脚本 jar 包启动的,这时候这个命令就很有作用了,可以根据 pid 列出进程的所有打开文件信息,包括路径哦。

[root@Amber log]# lsof -p 2000

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

mindoc_li2000root cwd DIR253,1409650737/data/www/book.itgank

mindoc_li2000root rtd DIR253,140962/

mindoc_li2000root txt REG253,11763538051548/data/www/book.itgank/mindoc_linux_amd64

mindoc_li2000root mem REG253,12127336139995/usr/lib64/libc-2.17.so

mindoc_li2000root mem REG253,1144792140021/usr/lib64/libpthread-2.17.so

mindoc_li2000root mem REG253,119776143495/usr/lib64/libdl-2.17.so

mindoc_li2000root mem REG253,1164112762184/usr/lib64/ld-2.17.so

mindoc_li2000root0rCHR1,30t01028/dev/null

mindoc_li2000root1uunix0xffff88007ba3e0000t080107socket

mindoc_li2000root2uunix0xffff88007ba3e0000t080107socket

mindoc_li2000root3uIPv464577000t0TCP localhost:44602->localhost:cogsys-lm(ESTABLISHED)

mindoc_li2000root4ua_inode,95883[eventpoll]

mindoc_li2000root6uIPv6801190t0TCP*:intermapper(LISTEN)

mindoc_li2000root7wREG253,1741573736/data/www/book.itgank/logs/log.log(deleted)

mindoc_li2000root9uIPv465998470t0TCP localhost:50722->localhost:cogsys-lm(ESTABLISHED)

10、-u:列出 UID 号进程详情;

11、查看由登陆用户启动而非系统启动的进程:

命令: lsof /dev/pts/0,1,2

[root@Amber log]# lsof /dev/pts/2

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

lsof465root0uCHR136,20t05/dev/pts/2

lsof465root1uCHR136,20t05/dev/pts/2

lsof465root2uCHR136,20t05/dev/pts/2

bash32121root0uCHR136,20t05/dev/pts/2

bash32121root1uCHR136,20t05/dev/pts/2

bash32121root2uCHR136,20t05/dev/pts/2

bash32121root255uCHR136,20t05/dev/pts/2

a. /dev/pts 是远程登陆(telnet,ssh 等)后创建的控制台设备文件所在的目录;

b. 第一个用户登陆,console 的设备文件为/dev/pts/0,第二个为/dev/pts/1,以此类推;

c. 通过查看/dev/pts 下的进程,我们将可以了解到由登陆用户启动而非系统启动的进程有哪些。

12、查看文件,设备被哪些进程占用:

命令:lsof /dev/tty1

[root@Amber log]# lsof /dev/tty1

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

agetty1716root0uCHR4,10t01043/dev/tty1

agetty1716root1uCHR4,10t01043/dev/tty1

agetty1716root2uCHR4,10t01043/dev/tty1

a. /dev/tty 就是当前进程的控制终端的设备特殊文件;

b. 通过查看/dev/tty 下文件可以知道文件、设备的进程占用情况。

13、查看指定程序打开的文件

命令:lsof -c sshd

14、查看指定用户打开的文件

命令:lsof -u root | more

15、查看指定目录下被打开的文件

命令:lsof +D /data/www/log/ 或 lsof +d/data/www/log/

[root@Amber log]# lsof +D /data/www/log/

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sh351root255rREG253,148550734/data/www/log/loggo.sh

lsof1260root cwd DIR253,1409649206/data/www/log

lsof1261root cwd DIR253,1409649206/data/www/log

rotatelog1906root3wREG253,18149235/data/www/log/2018_05_14_error.log

rotatelog1912root3wREG253,18224550752/data/www/log/2018_05_14_www.itgank.com-error.log

rotatelog1917root3wREG253,1119051549/data/www/log/2018_05_14_example.com-error.log

rotatelog1919root3wREG253,11216950753/data/www/log/2018_05_14_www.uimoe.com-access.log

rotatelog1924root3wREG253,138644450740/data/www/log/2018_05_14_www.itgank.com-access.log

rotatelog1925root4wREG253,17349227/data/www/log/2018_05_14_xcx.itgank.com-access.log

rotatelog1926root3wREG253,11216950753/data/www/log/2018_05_14_www.uimoe.com-access.log

rotatelog1929root4wREG253,17449231/data/www/log/2018_05_14_python.itgank.com-access.log

rotatelog1930root3wREG253,151751554/data/www/log/2018_05_14_resume.itgank.com-access.log

rotatelog1931root3wREG253,140849216/data/www/log/2018_05_14_datag.itgank.com-access.log

rotatelog1932root3wREG253,138644450740/data/www/log/2018_05_14_www.itgank.com-access.log

rotatelog1933root3wREG253,1899450756/data/www/log/2018_05_14_www.geroro.com-access.log

rotatelog1934root4wREG253,1283851552/data/www/log/2018_05_14_book.itgank.com-access.log

rotatelog1935root3wREG253,11097850755/data/www/log/2018_05_14_example.com-access.log

dotnet11235root1wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root2wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root8wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root9wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root148wREG253,113451550735/data/www/log/uimoe.com.log

python11576root1wREG253,111714550736/data/www/log/pyitgank.log

python11576root2wREG253,111714550736/data/www/log/pyitgank.log

python11579root1wREG253,111714550736/data/www/log/pyitgank.log

python11579root2wREG253,111714550736/data/www/log/pyitgank.log

bash32121root cwd DIR253,1409649206/data/www/log

[root@Amber log]# lsof +d /data/www/log/

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sh351root255rREG253,148550734/data/www/log/loggo.sh

lsof1295root cwd DIR253,1409649206/data/www/log

lsof1296root cwd DIR253,1409649206/data/www/log

rotatelog1906root3wREG253,18149235/data/www/log/2018_05_14_error.log

rotatelog1912root3wREG253,18224550752/data/www/log/2018_05_14_www.itgank.com-error.log

rotatelog1917root3wREG253,1119051549/data/www/log/2018_05_14_example.com-error.log

rotatelog1919root3wREG253,11216950753/data/www/log/2018_05_14_www.uimoe.com-access.log

rotatelog1924root3wREG253,138672150740/data/www/log/2018_05_14_www.itgank.com-access.log

rotatelog1925root4wREG253,17349227/data/www/log/2018_05_14_xcx.itgank.com-access.log

rotatelog1926root3wREG253,11216950753/data/www/log/2018_05_14_www.uimoe.com-access.log

rotatelog1929root4wREG253,17449231/data/www/log/2018_05_14_python.itgank.com-access.log

rotatelog1930root3wREG253,151751554/data/www/log/2018_05_14_resume.itgank.com-access.log

rotatelog1931root3wREG253,140849216/data/www/log/2018_05_14_datag.itgank.com-access.log

rotatelog1932root3wREG253,138672150740/data/www/log/2018_05_14_www.itgank.com-access.log

rotatelog1933root3wREG253,1899450756/data/www/log/2018_05_14_www.geroro.com-access.log

rotatelog1934root4wREG253,1283851552/data/www/log/2018_05_14_book.itgank.com-access.log

rotatelog1935root3wREG253,11103750755/data/www/log/2018_05_14_example.com-access.log

dotnet11235root1wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root2wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root8wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root9wREG253,113451550735/data/www/log/uimoe.com.log

dotnet11235root148wREG253,113451550735/data/www/log/uimoe.com.log

python11576root1wREG253,111714550736/data/www/log/pyitgank.log

python11576root2wREG253,111714550736/data/www/log/pyitgank.log

python11579root1wREG253,111714550736/data/www/log/pyitgank.log

python11579root2wREG253,111714550736/data/www/log/pyitgank.log

bash32121root cwd DIR253,1409649206/data/www/log

参数+D 为递归列出/home/下被打开的文件,参数+d 为列出/home/下被打开的文件。

16、查看指定进程打开的网络连接

命令:lsof -i -a -p 2000

[root@Amber log]# lsof -i -a -p 2000

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

mindoc_li2000root3uIPv464577000t0TCP localhost:44602->localhost:cogsys-lm(ESTABLISHED)

mindoc_li2000root6uIPv6801190t0TCP*:intermapper(LISTEN)

mindoc_li2000root9uIPv465998470t0TCP localhost:50722->localhost:cogsys-lm(ESTABLISHED)

使用了参数-i、-a、-p 等,-i 查看网络连接情况,-a 查看存在的进程,-p 指定进程。

17、查找误删除的文件而进程还在使用的文件

命令:lsof |grep -i deleted

[root@Amber log]# lsof |grep -i deleted

systemd-j338root txt REG253,1274752143274/usr/lib/systemd/systemd-journald;5aeff033(deleted)

systemd-l477root txt REG253,1572320143275/usr/lib/systemd/systemd-logind;5aeff033(deleted)

dhclient688root txt REG253,1424312143131/usr/sbin/dhclient;5aeff033(deleted)

httpd1074apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741075apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741076apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741077apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741078apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741079apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741080apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741081apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

httpd10741082apache76uREG253,1491535/tmp/.ZendSem.AyGvqX(deleted)

之前的文章介绍过怎么恢复磁盘空间已经恢复误删除的文件。

运维神坑记——空间满了,日志删除了,空间竟未释放?

Linux 系统下误删文件,使用 debugfs 恢复

详细说明

1、lsof 输出各列信息的意义,如下:

COMMAND:进程的名称;

PID:进程标识符;

PPID:父进程标识符(需要指定-R 参数);

USER:进程所有者;

PGID:进程所属组;

FD:文件描述符,应用程序通过文件描述符识别该文件。

2、文件描述符列表:

①. cwd:表示 current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改;

②. txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序;

③. lnn:library references (AIX);

④. er:FD information error (see NAME column);

⑤. jld:jail directory (FreeBSD);

⑥. ltx:shared library text (code and data);

⑦. mxx :hex memory-mapped type number xx.

⑧. m86:DOS Merge mapped file;

⑨. mem:memory-mapped file;

⑩. mmap:memory-mapped device;

⑪. pd:parent directory;

⑫. rtd:root directory;

⑬. tr:kernel trace file (OpenBSD);

⑭. v86 VP/ix mapped file;

⑮. 0:表示标准输出;

⑯. 1:表示标准输入;

⑰. 2:表示标准错误。

3、一般在标准输出、标准错误、标准输入后,还跟着文件状态模式:

①.u:表示该文件被打开并处于读取/写入模式;

②.r:表示该文件被打开并处于只读模式;

③.w:表示该文件被打开并处于只写模式;

④.空格:表示该文件的状态模式为 unknow,且没有锁定;

⑤.-:表示该文件的状态模式为 unknow,且被锁定。

4、同时在文件状态模式后面,还跟着相关的锁:

①. N:for a Solaris NFS lock of unknown type;

②. r:for read lock on part of the file;

③. R:for a read lock on the entire file;

④. w:for a write lock on part of the file;(文件的部分写锁)

⑤. W:for a write lock on the entire file;(整个文件的写锁)

⑥. u:for a read and write lock of any length;

⑦. U:for a lock of unknown type;

⑧. x:for an SCO OpenServer Xenix lock on part of the file;

⑨. X:for an SCO OpenServer Xenix lock on the entire file;

⑩. space:if there is no lock。

5、文件类型

①. DIR:表示目录;

②. CHR:表示字符类型;

③. BLK:块设备类型;

④. UNIX:UNIX 域套接字;

⑤. FIFO:先进先出 (FIFO) 队列;

⑥. IPv4:网际协议 (IP) 套接字;

⑦. DEVICE:指定磁盘的名称;

⑧. SIZE:文件的大小;

⑨. NODE:索引节点(文件在磁盘上的标识);

⑩. NAME:打开文件的确切名称。

三、可打开文件

①. 普通文件;

②. 目录;

③. 网络文件系统的文件;

④. 字符或设备文件;

⑤. (函数)共享库;

⑥. 管道,命名管道;

⑦. 符号链接;

⑧. 网络文件(例如:NFS file、网络 socket,unix 域名 socket);

⑨. 其它类型的文件等。

Linux 大量使用了文件,作为系统管理员,lsof 允许用户对核心内存进行查看,以找出系统当前如何使用这些文件。lsof 的简单用法可以告诉用户哪些进程打开了哪些文件,以及哪些文件由哪些进程打开。

在收集关于应用程序工作情况的信息时,或在进行某些可能损坏数据的操作前,要确保文件未被使用,这一点特别重要。lsof 更高级的用法可以帮助用户查找删除的文件,并获得关于网络连接的信息。lsof 是一个功能强大的工具,它几乎可以用于任何地方。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180810G0S5OP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券