常用Linux Shell 命令
1. cd 命令
change directory更改目录
用于切换工作目录。是最基本的 Linux 操作系统命令。
- 使用
cd
不带任何参数,可进入当前用户的主目录:
$ cd
- 使用
cd ~
也可进入当前用户的主目录:
cd ~
- 使用
cd ..
返回上级目录(..
用于表示上级目录,如返回上两级目录则应为cd ../..
):
cd ..
- 使用
cd
返回进入当前目录之前所在的目录:
cd -
2. pwd 命令
print work directory(打印工作目录)。用于查看当前工作目录的路径,通常不需要带参数。
$ pwd
3. mkdir 命令
make directory(创建目录)。
用于创建文件系统的目录(文件夹)。
- 创建一个名称为“dirname”的目录:
$ mkdir dirname
2)使用p, parents
选项,当创建的目录的父目录不存在时,父目录也会一起被创建:
$ mkdir p pathname/dirname
该命令用于创建“dirname”目录,如果其父目录“pathname”尚未存在,则“pathname”目录会被一起创建。
- 使用
{..}
可以批量创建目录,如创建20180101…20180115…20180131共31个目录:
$ mkdir 201801{01..31}
- 使用
{,}
可以批量创建目录,如创建20180101、20180115、20180131共3个目录:
$ mkdir 201801{01,15,31}
4. ls 命令
list(列表信息)。
用于显示目录内容的列表信息。
- 使用
ls
命令查看当前工作目录的列表信息:
$ ls
Catalina catalina.policy catalina.properties context.xml logging.properties server.xml tomcatusers.xml tomcatusers.xsd web.xml
- 使用
ll
命令查看当前工作目录的列表信息:
$ ll
total 220
drwxrxrx. 3 fanlychie fanlychie 4096 20171111 170503 Catalina
rw. 1 fanlychie fanlychie 13688 20170626 200948 catalina.policy
rw. 1 fanlychie fanlychie 7299 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 1577 20170626 200948 context.xml
rw. 1 fanlychie fanlychie 3387 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 6458 20171111 172447 server.xml
rw. 1 fanlychie fanlychie 2155 20171111 182343 tomcatusers.xml
rw. 1 fanlychie fanlychie 2634 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 168496 20170626 200948 web.xml
ll
是ls l
命令的别名(l
选项是用长格式方式显示信息,其每一个内容项都占据一行)序号示例描述第一列drwxrxrx文件或目录的权限位描述符第二列3如果是一个文件,则表示文件的个数(数值必然是1) 如果是一个目录,则表示其子目录(包含隐藏的)总数第三列fanlychie文件或目录的属主(即所有者)第四列fanlychie文件或目录的属组第五列4096文件的大小,单位是B第六列20171111文件或目录最后变更的日期第七列170503文件或目录最后变更的时间第八列Catalina文件或目录的名称其中,第一列drwxrxrx
的第一位表示文件系统对象类型,剩下的九位以每三位为一组表示常见的 Linux 文件系统对象类型有:类型描述普通文件d目录(文件夹)l符号连接(包括软链接和硬链接),它实质指向另一个文件
3) 使用a, all
选项,会把以.
和..
开头的隐藏文件或目录信息也罗列显示出来:
$ ll a
total 228
drwxrxrx. 3 fanlychie fanlychie 4096 20180425 071836 .
drwxrwxrx. 9 fanlychie fanlychie 4096 20171111 170410 ..
drwxrwxrx. 3 fanlychie fanlychie 4096 20171111 170503 Catalina
rw. 1 fanlychie fanlychie 13688 20170626 200948 catalina.policy
rw. 1 fanlychie fanlychie 7299 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 1577 20170626 200948 context.xml
rw. 1 fanlychie fanlychie 3387 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 6458 20171111 172447 server.xml
rw. 1 fanlychie fanlychie 2155 20171111 182343 tomcatusers.xml
rw. 1 fanlychie fanlychie 2634 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 168496 20170626 200948 web.xml
- 罗列指定路径(文件或目录路径)下的内容信息,如查看“Catalina”目录下的内容信息:
$ ll Catalina
total 4
drwxrwxrx. 2 fanlychie fanlychie 4096 20180424 112147 localhost
- 使用
t
选项,可以按文件或目录的修改时间排序(最新的排在最前面, 即降序):
$ ll t
total 220
rw. 1 fanlychie fanlychie 2155 20171111 182343 tomcatusers.xml
rw. 1 fanlychie fanlychie 6458 20171111 172447 server.xml
drwxrwxrx. 3 fanlychie fanlychie 4096 20171111 170503 Catalina
rw. 1 fanlychie fanlychie 13688 20170626 200948 catalina.policy
rw. 1 fanlychie fanlychie 7299 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 1577 20170626 200948 context.xml
rw. 1 fanlychie fanlychie 3387 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 2634 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 168496 20170626 200948 web.xml
- 使用
r, reverse
选项,可以反向排序,默认是按文件或目录名称:
$ ll r
total 220
rw. 1 fanlychie fanlychie 168496 20170626 200948 web.xml
rw. 1 fanlychie fanlychie 2634 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 2155 20171111 182343 tomcatusers.xml
rw. 1 fanlychie fanlychie 6458 20171111 172447 server.xml
rw. 1 fanlychie fanlychie 3387 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 1577 20170626 200948 context.xml
rw. 1 fanlychie fanlychie 7299 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 13688 20170626 200948 catalina.policy
drwxrwxrx. 3 fanlychie fanlychie 4096 20171111 170503 Catalina
- 组合
r
选项,按文件或目录的修改时间升序排序:
$ ll rt
total 220
rw. 1 fanlychie fanlychie 168496 20170626 200948 web.xml
rw. 1 fanlychie fanlychie 2634 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 3387 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 1577 20170626 200948 context.xml
rw. 1 fanlychie fanlychie 7299 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 13688 20170626 200948 catalina.policy
drwxrwxrx. 3 fanlychie fanlychie 4096 20171111 170503 Catalina
rw. 1 fanlychie fanlychie 6458 20171111 172447 server.xml
rw. 1 fanlychie fanlychie 2155 20171111 182343 tomcatusers.xml
- 使用
S
选项,可以按文件或目录的大小排序(最大的排在最前面,即降序):
$ ll S
total 220
rw. 1 fanlychie fanlychie 168496 20170626 200948 web.xml
rw. 1 fanlychie fanlychie 13688 20170626 200948 catalina.policy
rw. 1 fanlychie fanlychie 7299 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 6458 20171111 172447 server.xml
drwxrwxrx. 3 fanlychie fanlychie 4096 20171111 170503 Catalina
rw. 1 fanlychie fanlychie 3387 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 2634 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 2155 20171111 182343 tomcatusers.xml
rw. 1 fanlychie fanlychie 1577 20170626 200948 context.xml
- 使用
h, humanreadable
选项,以易读方式来显示文件或目录的大小(默认大小是以B
作为单位,h, humanreadable
选项会自动的将其转换为K
或M
或G
单位来显示):
$ ll h
total 220K
drwxrwxrx. 3 fanlychie fanlychie 4.0K 20171111 170503 Catalina
rw. 1 fanlychie fanlychie 14K 20170626 200948 catalina.policy
rw. 1 fanlychie fanlychie 7.2K 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 1.6K 20170626 200948 context.xml
rw. 1 fanlychie fanlychie 3.4K 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 6.4K 20171111 172447 server.xml
rw. 1 fanlychie fanlychie 2.2K 20171111 182343 tomcatusers.xml
rw. 1 fanlychie fanlychie 2.6K 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 165K 20170626 200948 web.xml
- 使用
R, recursive
选项,可以递归显示路径下的子目录下的树信息:
$ ll R
.
total 220
drwxrwxrx. 3 fanlychie fanlychie 4096 20171111 170503 Catalina
rw. 1 fanlychie fanlychie 13688 20170626 200948 catalina.policy
rw. 1 fanlychie fanlychie 7299 20170626 200948 catalina.properties
rw. 1 fanlychie fanlychie 1577 20170626 200948 context.xml
rw. 1 fanlychie fanlychie 3387 20170626 200948 logging.properties
rw. 1 fanlychie fanlychie 6458 20171111 172447 server.xml
rw. 1 fanlychie fanlychie 2155 20171111 182343 tomcatusers.xml
rw. 1 fanlychie fanlychie 2634 20170626 200948 tomcatusers.xsd
rw. 1 fanlychie fanlychie 168496 20170626 200948 web.xml
./Catalina
total 4
drwxrwxrx. 2 fanlychie fanlychie 4096 20180424 112147 localhost
./Catalina/localhost
total 4
rw. 1 fanlychie fanlychie 426 20180424 112147 context.xml
5. rm 命令
remove(移除)。
用于删除文件或目录。
- 使用
f, force
选项,强行执行删除操作,即使删除的文件不存在也不会出现警告。
$ rm f catalina.20171112.log
- 使用
r, R, recursive
选项,可以删除一个目录(该目录下的所有文件和子目录都会被删除):
$ rm r logs/
- 使用
v, verbose
选项,可以回显执行过程:
$ rm v catalina.20171111.log
removed `catalina.20171111.log`
6. mv 命令
move(移动)。
用于移动文件或目录到另外一个目录中,也可用于重命名文件或目录。
- 将源文件“zoo_sample.cfg”的名称重命名为“zoo.cfg”:
$ mv zoo_sample.cfg zoo.cfg
- 将源目录“config”的名称重命名为“conf”:
$ mv config/ conf
- 将“zoo_sample.cfg”文件移动到子目录“conf”中:
$ mv zoo_sample.cfg conf/
若“conf”中已存在一个名为“zoo_sample.cfg”的文件,则新的文件会直接覆盖老的文件。
- 将文件“zoo_sample.cfg”移动到子目录“conf”中,并将文件重命名为“zoo.cfg”:
$ mv zoo_sample.cfg conf/zoo.cfg
- 将目录“node1”中的子目录“conf/”移动到目录“node2/”中:
$ mv node1/conf/ node2/
如果“node2”目录中已经存在一个名称为“conf”的子目录并且该子目录的内容不为空,则会报出警告,不能成功的进行移动。除非先把“node2”目录中的“conf”子目录删除或者使用b
选项(如果移动的文件或目录在目标目录中已经存在,则移动前会自动进行备份,备份的文件或目录默认是以原名称+~
结束)进行移动:mv b node1/conf/ node2/
。
7. chmod 命令
change mode(改变模式)。
用于变更文件或目录的权限。
Linux 系统的文件或目录是由读取(r)
、写入(w)
、执行(x)
三种权限共同来决定。执行ll
(ls l
)命令展示出来的第一列就是文件或目录的权限信息
属主 (u) :文件或目录的创建者,或被指定的文件或目录的所有者;
属组 (g) :文件或目录的所属用户组;
其它人 (o) :既不是属主又不是属组里面的其它用户;
文件或目录的读取(r)
、写入(w)
、执行(x)
权限控制:
字符 数值 描述
r 4读取权限(如果是目录,那就是查看目录里面内容的权限)
w 2写入权限
x 1执行权限(如果是目录,那就是切换(cd)到目录的权限)
0没有权限
假设现有一文件“my.sh”,其初始权限如下:
rwrr. 1 fanlychie fanlychie 601 20180425 094338 my.sh
- 给文件或目录赋权,属主
u=rwx
,属组g=rwx
,其他人o=rwx
,所有a=rwx
:
$ chmod u=rwx my.sh
$ ll
total 4
rwxrr. 1 fanlychie fanlychie 601 20180425 094338 my.sh
如果想要同时为多个所属组赋权,使用英文逗号分隔:$ chmod g=rx,o=rx my.sh $ lltotal 4rwxrxrx. 1 fanlychie fanlychie 601 20180425 094338 my.sh
2) 变更文件或目录的权限,属主u±rwx
,属组g±rwx
,其他人o±rwx
,所有a±rwx
(其中+
为增加相应的权限,``为删除相应的权限):
$ chmod ox my.sh
$ ll
total 4
rwxrxr. 1 fanlychie fanlychie 601 20180425 094338 my.sh
如果想要同时变更多个所属组权限,使用英文逗号分隔:$ chmod ux,gx my.sh $ lltotal 4rwrr. 1 fanlychie fanlychie 601 20180425 094338 my.sh
- 使用数值代码变更文件或目录的权限,如将“my.sh”的文件权限修改为“755”(“rwxrxrx”):
$ chmod 755 my.sh
$ ll
total 4
rwxrxrx. 1 fanlychie fanlychie 601 20180425 094338 my.sh
- 使用
R, recursive
选项,可以修改一个目录以及该目录下所有的文件的权限:
$ chmod R 750 conf/
$ ll R
.
total 4
drwxrx. 2 fanlychie fanlychie 4096 20180425 101023 conf
./conf
total 4
rwxrx. 1 fanlychie fanlychie 601 20180425 094338 my.sh
8. chown 命令
change owner(改变所有者)。用于变更文件或目录的属主和属组。只有文件或目录的创建者或管理员用户才有权限操作。
ll
(ls l
)命令展示出的第三和第四列分别就是文件或目录的属主和属组信息(参考「ls 命令」)。
drwxrxrx. 3 root root 4096 20180425 095844 test
- 变更文件或目录的属主和属组,
chown 属主属组 文件或目录
:
# chown fanlychiefanlychie test/
# ll R
.
total 4
drwxrxrx. 3 fanlychie fanlychie 4096 20180425 095844 test
./test
total 4
drwxrx. 2 root root 4096 20180425 101023 conf
./test/conf
total 4
rwxrx. 1 root root 601 20180425 094338 my.cfg
使用R, recursive
选项,可以变更目录以及该目录下所有内容的属主和属组:# chown R fanlychiefanlychie test/# ll R.total 4drwxrxrx. 3 fanlychie fanlychie 4096 20180425 095844 test ./testtotal 4drwxrx. 2 fanlychie fanlychie 4096 20180426 053017 conf ./test/conftotal 4rwxrx. 1 fanlychie fanlychie 601 20180425 094338 my.cfg
9. cp 命令
copy(复制)。用于复制文件或目录。
- 将“index.html”文件复制到“WEBINF”目录中:
$ cp index.html WEBINF/
- 将“index.html”文件复制到“WEBINF”目录中,并重命名为“index.htm”:
$ cp index.html WEBINF/index.htm
- 使用
R, r, recursive
选项,可以将一个目录中的所有内容复制到另外一个目录中。
如将“jsp”目录(包括该目录以及该目录下的所有内容)复制到“WEBINF”目录中:
$ cp r jsp/ WEBINF/
- 如果复制的源文件或目录在目标目录中已经存在,则默认会覆盖目标目录中的文件或目录。
使用b
选项可以备份目标目录中的文件或目录。备份的文件或目录的默认后缀名是是带~
结尾。
$ cp b index.html WEBINF/
$ ll WEBINF/
total 44
drwxrxrx. 20 fanlychie fanlychie 4096 20171111 170410 classes
rwrr. 1 fanlychie fanlychie 1126 20180426 060621 index.html
rwrr. 1 fanlychie fanlychie 1126 20180426 060457 index.html~
drwxrxrx. 22 fanlychie fanlychie 4096 20180426 060307 jsp
drwxrxrx. 2 fanlychie fanlychie 4096 20171111 170410 jsp2
drwxrxrx. 2 fanlychie fanlychie 4096 20171111 170410 lib
drwxrxrx. 2 fanlychie fanlychie 4096 20171111 170410 tags
rwrr. 1 fanlychie fanlychie 14554 20170626 200951 web.xml
如果没有b
选项,则源文件“index.html”会直接覆盖“WEBINF”目录中的“index.html”文件; 若使用了b
选项,源文件“index.html”在覆盖“WEBINF”目录中的“index.html”文件之前,“WEBINF”目录中的“index.html”文件会自动做一个备份,备份的文件名称就是为“index.html~”;
10. scp 命令
secure copy(安全复制)。
用于远程文件或目录的安全拷贝。它和cp
命令类似,但cp
命令只能在本机内对文件或目录进行拷贝。而scp
命令能够在两台服务器之间跨服务器拷贝文件或目录。
- 将“192.168.139.129”服务器中的“index.html”拷贝到“192.168.139.130”服务器中:
语法:scp 本机源文件 远程登录主机的用户名@远程主机IP复制到远程主机的目标路径
$ scp index.html fanlychie@192.168.139.130/home/fanlychie/test/
如果远程目标机中已经存在该文件,则执行完命令之后,目标机中的文件将会被覆盖掉。
- 使用
P
选项,可以指定远程主机的端口号,默认是22
端口,如果不是,可以使用该项来指定。
$ scp P 33 index.html fanlychie@192.168.139.130/home/fanlychie/test/
- 使用
r
选项,可以将本机的一个目录拷贝到另一台远程主机的目标目录中:
$ scp r jsp/ fanlychie@192.168.139.130/home/fanlychie/test/
如果远程目标机中已经存在该目录,则执行完命令之后,目标机中的目录将会被覆盖掉。
- 除此之外,还可以反过来,在本机执行命令,将远程主机中的文件或目录拷贝到本机:
语法:scp 远程登录主机的用户名@远程主机IP远程主机的源文件 本机目录
$ scp fanlychie@192.168.139.130/home/fanlychie/test/index.html ./index.htm
远程拷贝目录与拷贝文件的方式相似,只需要加r
选项。
- 将“192.168.139.129”中的“index.html”拷贝到“192.168.139.130”并重命名为“idx.html”:
$ scp index.html fanlychie@192.168.139.130/home/fanlychie/test/idx.html
拷贝目录与拷贝文件的方式相似,只需要加r
选项。
11. cat 命令
concatenate(串联)。
用于将文件内容打印到标准输出设备上。适合用于查看小文件的内容。
- 使用
n, number
选项,会对文件里面的每一行内容用数字进行编号:
$ cat n zoo.cfg
1 # The number of milliseconds of each tick
2 tickTime=2000
3
4 # The number of ticks that the initial
5 # synchronization phase can take
6 initLimit=10
7
8 # The number of ticks that can pass between
9 # sending a request and getting an acknowledgement
10 syncLimit=5
11
12 # the directory where the snapshot is stored.
13 # do not use /tmp for storage, /tmp here is just
14 # example sakes.
15 dataDir=/home/fanlychie/zookeeper/data
16
17
18 dataLogDir=/home/fanlychie/zookeeper/logs
19
20 # the port at which the clients will connect
21 clientPort=2181
- 使用
b, numbernonblank
选项,会对文件内容的非空白行用数字进行编号:
$ cat b zoo.cfg
1 # The number of milliseconds of each tick
2 tickTime=2000
3 # The number of ticks that the initial
4 # synchronization phase can take
5 initLimit=10
6 # The number of ticks that can pass between
7 # sending a request and getting an acknowledgement
8 syncLimit=5
9 # the directory where the snapshot is stored.
10 # do not use /tmp for storage, /tmp here is just
11 # example sakes.
12 dataDir=/home/fanlychie/zookeeper/data
13 dataLogDir=/home/fanlychie/zookeeper/logs
14 # the port at which the clients will connect
15 clientPort=2181
- 使用
s, squeezeblank
选项,如果连续出现的多个空行就会压缩成一行显示:
$ cat s zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/fanlychie/zookeeper/data
dataLogDir=/home/fanlychie/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
- 去掉空白行:
$ cat zoo.cfg grep v ^$
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/fanlychie/zookeeper/data
dataLogDir=/home/fanlychie/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
其中,``是管道。^$
是正则表达式,用于匹配空格。grep
的用法可参考xxx。
- 去掉“#”注释行:
$ cat zoo.cfg grep v ^#
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/fanlychie/zookeeper/data
dataLogDir=/home/fanlychie/zookeeper/logs
clientPort=2181
其中,``是管道。^#
是正则表达式,用于匹配“#”开头的行。grep
的用法可参考xxx。
- 去掉空白行和注释行:
$ cat zoo.cfg grep v ^$ grep v ^#
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/fanlychie/zookeeper/data
dataLogDir=/home/fanlychie/zookeeper/logs
clientPort=2181
12. more 命令
用于以分页的形式来展示文本文件的内容。适合用于查看较大文件的内容。
该命令每次显示一屏的内容,在屏幕的左下方会出现More(n%)
的内容浏览进度条提示。此外,该命令还支持按键操作响应事件,常用的按键操作有:
按键 描述
回车键前进一行(向下滚动一行)
空格键前进一屏(向下滚动一屏)
f 前进一屏(向下滚动一屏)
b 后退一屏(向上滚动一屏)
= 显示当前行的行号
q 退出命令
/pattern 搜索字符,匹配的字符不高亮,只能向下(向文件尾)搜索(按“n”键搜索下一个)
- 使用
s
选项,如果文件内容中连续出现的多个空行则会压缩成一行显示:
$ more s catalina.out
- 使用
+n
选项,可以从指定的第n
行开始显示,如从第37行开始显示:
$ more +37 catalina.out
- 使用
n
选项,可以定义每屏显示的行数,如每屏显示10行:
$ more 10 catalina.out
- 使用
+/pattern
选项,可以从匹配到的搜索串处开始显示,如从“Exception”出现的地方开始显示:
$ more +/Exception catalina.out
13. less 命令
与more
命令相似,但功能比more
命令更强。用于以分页的形式来展示文本文件的内容。适合用于查看较大文件的内容。
该命令每次显示一屏的内容,同时它还支持按键操作响应事件,常用的按键操作有:
按键 描述
回车键 前进一行(向下滚动一行)
空格键 前进一屏(向下滚动一屏)
f 前进一屏(向下滚动一屏)
b 后退一屏(向上滚动一屏)
d 前进半屏(向下滚动半屏)
u 后退半屏(向上滚动半屏)
q 退出命令
PgUp(↑) 向上翻一屏
PgDn(↓) 向下翻一屏
/pattern 向下搜索,匹配的字符高亮,按n在同一个方向搜索下一个,按N反方向搜索上一个
?pattern 向上搜索,匹配的字符高亮,按n在同一个方向搜索下一个,按N反方向搜索上一个
- 使用
s
选项,如果文件内容中连续出现的多个空行则会压缩成一行显示:
$ less s catalina.out
- 使用
+n
选项,可以从指定的第n
行开始显示,如从第37行开始显示:
$ less +37 catalina.out
- 使用
n
选项,可以定义每屏显示的行数,如每屏显示10行:
$ less 10 catalina.out
- 使用
+/pattern
选项,可以从匹配到的搜索串处开始显示,如从“Exception”出现的地方开始显示:
$ less +/Exception catalina.out
- 使用
N
选项,显式文件内容的行号:
less N catalina.out
- 使用
m
选项,在右下角显示文件浏览进度的百分比数:
less m catalina.out
14. head 命令
用来查看文件的前几行(默认是前10行)的内容。
- 查看“catalina.out”文件(查看前10行):
$ head catalina.out
如果想查看指定的前几行,可以使用n
参数,例如查看前20行:$ head 20 catalina.out
15. tail 命令
用来查看文件末尾的内容(默认是末尾10行)。
- 查看“catalina.out”文件(查看末尾的10行):
$ tail catalina.out
如果想查看指定的末尾几行,可以使用n
参数,例如查看末尾20行:$ tail 20 catalina.out
- 使用
f, follow
选项,可以跟随读取文件(常用于查看日志文件):
$ tail f catalina.out
16. tar 命令
tape archive(最初是用来在磁带上创建档案)。
用于将一个文件或目录打包压缩成一个文件,或用于将一个文件或目录从压缩包里解压缩出来。打包:它仅仅是将一个文件或一个目录下的所有内容汇总成一个总的文件;压缩:则是指通过某些算法(如gzip
、bzip2
),将一个文件压缩成一个体积更小的文件;
- 将“logs”目录打包并压缩成“logs.tar.gz”文件:
$ tar zcvf logs.tar.gz logs/
tar
命令是汇总成“.tar”文件。z
选项是采用“gzip”算法压缩成“.gz”文件。
- 查看“*.tar.gz”压缩包文件里面的内容:
$ tar ztvf logs.tar.gz
- 解压缩“*.tar.gz”压缩包文件里面的内容:
$ tar zxvf logs.tar.gz
17. ping 命令
用于测试两台主机之间网络的连通性。
- ping 主机 IP“192.168.1.100”的网络连通性:
$ ping 192.168.1.100
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100 icmp_seq=1 ttl=128 time=0.801 ms
64 bytes from 192.168.1.100 icmp_seq=2 ttl=128 time=0.610 ms
64 bytes from 192.168.1.100 icmp_seq=3 ttl=128 time=0.581 ms
按ctrl + c
组合键中断。
- ping 公网域名“baidu.com”的外网连通性(如果能ping通表明主机能正常访问外网,反之则不能):
$ ping baidu.com
PING baidu.com (220.181.57.216) 56(84) bytes of data.
64 bytes from 220.181.57.216 icmp_seq=1 ttl=128 time=40.9 ms
64 bytes from 220.181.57.216 icmp_seq=2 ttl=128 time=39.5 ms
64 bytes from 220.181.57.216 icmp_seq=3 ttl=128 time=40.2 ms
- 使用
c
选项,可以指定 ping 的次数。如 ping 测试3次:
$ ping c 3 192.168.1.100
17. ssh 命令
用于在一台Linux主机远程登录到另外一台Linux主机。
- 用“fanlychie”账户登录到远程主机“192.168.139.129”,语法
ssh 远程主机用户名@远程主机IP
:
$ ssh fanlychie@192.168.139.129
如果当前Linux主机是首次远程登录到目标主机,它会询问你“Are you sure you want to continue connecting (yes/no)?”键入“yes”敲回车即可。然后它会要求你输入远程主机用户名登录到主机IP的密码“fanlychie@192.168.139.129’s password”键入密码敲回车即可。如果当前Linux主机也是以“fanlychie”账户登录的,则可以去掉登录远程主机的用户名:$ ssh 192.168.139.129
它默认是以当前Linux主机登录的用户名登录远程IP主机。
- 使用
p
选项,可以指定登录远程主机的端口(默认是22
端口),例如指定33端口:
$ ssh p 33 fanlychie@192.168.139.129
18. 管道命令
管道``,它能将上一个命令的正确执行的输出传递给下一个命令,作为下一个命令的标准输入。
- 查看当前目录下的文件,按大小排序,然后分页查看:
$ ll Sh less
总用量 79M
rwrwr 1 fanlychie fanlychie 5.5M 20180510 090723 webtest.log.20180510
rwrwr 1 fanlychie fanlychie 3.9M 20180509 122233 servicetest.log.20180509
rwrwr 1 fanlychie fanlychie 3.5M 20180512 174342 apptest.log.20180512
... ...
19. ps 命令
process status(进程状态)。
用于查看当前系统运行的进程状态信息。该命令选项非常多,这里仅介绍常用的组合选项。
- 使用
ef
组合选项,可以查看当前系统所有的进程信息:
$ ps ef
UID PIDPPID C STIME TTY TIMECMD
500 2878 1 0 1237 pts/0 000024/usr/local/jdk1.8.0_144/bin/java Djava.util.logging.config.file=/home/fanlychie/applications/apachetomcat8.0.45/conf/logging.properties
... ...
如果想查看进程的PID或PPID可以选用该组合选项。其各字段的概述:字段描述UID进程所属的用户IDPID进程IDPPID进程的父IDCCPU使用比率STIME进程的启动时间TTY开始此进程的终端设备。“?”表示是系统启动的。“tty1”至“tty6”表示是本机上登录者程序。“pts/0”等,则表示为由网络连接进主机的程序。TIME进程使用的CPU总时间CMD启动进程的命令和参数
- 使用
aux
组合选项(注意前面没有``),可以查看当前系统所有的进程信息:
$ ps aux
USER PID%CPU %MEM VSZ RSSTTY STAT START TIME COMMAND
500 2878 0.1 18.3 2161124 89300 pts/0 Sl 1237 027 /usr/local/jdk1.8.0_144/bin/java Dcom.sun.akuma.Daemon=daemonized Djava.awt.headless=true DJENKINS_HOME=/var/lib/jenkins
... ...
如果想查看进程占用系统的内存和CPU信息可以选用该组合选项。其各字段的概述:字段描述USER进程的拥有者PID进程ID%CPU进程占用的CPU百分比%MEM进程占用的内存的百分比VSZ进程使用的虚拟内存大小,单位:KBRSS进程占用的固定内存大小,单位:KBTTY开始此进程的终端设备。“?”表示是系统启动的。“tty1”至“tty6”表示是本机上登录者程序。“pts/0”等,则表示为由网络连接进主机的程序。STAT进程的状态。常见的状态有: R:正在运行或可运行状态; S:处于休眠状态,等待被唤醒; Z:僵尸进程,程序已终止,进程无法正常退出; T:已停止或处于被追踪状态; D:不可中断,一般是在等待I/O; <:优先级高的进程; N:优先级低的进程; s:进程领导者,在它之下有子进程; l:多线程的;START进程的启动时间TIME进程使用的CPU总时间COMMAND启动进程的命令和参数
- 使用
eo
选项,可以自定义显示的进程信息字段:
$ ps eo pid,pcpu,pmem,cmd
PID %CPU %MEM CMD
1 0.3 0.0 bash
2 0.1 3.1 /usr/local/jdk1.7.0_72/bin/java
... ...
字段描述pid进程的IDpcpu进程的CPU百分占比%CPUpmem进程的内存百分占比%MEMcmd进程启动的命令CMD
- 使用
sort
选项,可以对指定的字段进行排序显示:
$ ps aux sort pmem
USER PID%CPU %MEMVSZ RSS TTY STATSTART TIME COMMAND
root 24742 0.1 3.1 2327664 123064 ?Sl 3月26 10528/usr/local/jdk1.7.0_72/bin/java
root 6480.0 0.7 33153227592?Ssl 3月25 047 /usr/bin/python
pmem
表示对进程的内存百分占比%MEM降序排序。``是降序,+
升序(默认是升序)。
- 找出最占内存的10个进程:
$ ps aux sort pmem head
20. kill 命令
用于杀死一个进程。
该命令可以将给定的信号发送给指定的进程,如果没有给定明确的信号,则默认是发送15
信号,该信号会终止进程。常用的信号有:
信号 描述
2中断信号(ctrl + c)
9强制终止
15 终止信号
19 暂停信号(ctrl + z)
- 强制杀掉进程ID为“2878”的进程(可以结合
ps
命令来查看进程ID):
$ kill 9 2878
kill 9
与kill 9
的区别: kill 9
:发送一个信号给进程并告诉进程,你需要终止运行。进程收到信号之后,并不会立刻停止运行,而是先释放占用的资源或者做一些其它的事情,并不会立即响应该信号,此进程仍然可能继续运行。 kill 9
:发送一个信号给进程并告诉进程,你需要立刻终止运行。该信号不能被捕获和忽略,进程收到后会立刻停止并退出。
21. top 命令
用于查看进程占用系统资源的实时动态列表信息。
$ top
该命令输出的内容信息比较丰富,默认是每隔3秒自动刷新一次列表信息:
第一行(系统整体的统计信息):
223529
系统当前时间;
up 26 days, 1333
系统连续运行的时间;
1 user
当前登录系统的用户数;
load average 0.04, 0.03, 0.05
系统分别在1、5、15分钟内的平均负载;
第二行(进程的统计信息):
133 total
进程的总数;
1 running
正在运行的进程数;
132 sleeping
休眠的进程数;
0 stopped
停止的进程数;
0 zombie
僵尸进程数;
第三行(CPU的统计信息):
0.2 us
用户占用的CPU百分比;
0.2 sy
内核占用的CPU百分比;
99.6 id
空闲的CPU百分比;
其余不一一列举了…
第四行(内存的统计信息):
12139564 total
物理内存的总大小;
1866952 free
空闲可用的物理内存总大小;
6600492 used
已经使用的物理内存总大小;
3672120 buff/cache
缓冲内存的总大小;
第五行(交换分区的统计信息):
2097148 total
交换分区的总大小;
2062220 free
空闲可用的交换分区的大小;
34928 used
已经使用的交换分区的大小;
有时候,我们可能会看到CPU的使用率占比超过100%。这其实是因为top
命令是按照单个CPU核数来计算的。也就是说,如果一台服务器的CPU核数为4核,那么该服务器的CPU使用率占比理论上最高可达到400%。当系统物理内存剩余量不是很富余的时候,那就应该引起注意了。Linux系统有一个OOMkiller(Out Of Memory killer)机制。当Linux内核检测到系统内存不足的时候,就会触发OOMkiller来挑选一个最耗内存的进程并杀掉这个进程以求释放一些内存出来。除此之外,top
命令第一行的load average
也很直观的反应出当前系统的性能指标,当数值是在0.00~1.00之间,则表示系统当前的状况良好。超过1.00则表示系统已经超出负荷。而实际上,我们也可能会看到服务器平均负载超过1.00的情况。这也跟服务器的CPU核数有关。如果一台服务器的CPU核数为4核,那么,该服务器的平均负载能力理论上可达到4.00。当系统平均负载达到总的70%左右时,就应该有所行动,在事情变得更糟糕之前,去分析其造成的原因。分析的焦点应放在后两项的数值,因为第一项是1分钟内的平均负载,时间太短,一瞬间的高并发导致该值大幅度上涨是很有可能的。
进程信息区,部分字段的描述概要:
字段 描述
PID 进程ID
USER 进程所属者
VIRT 进程使用的虚拟内存总大小(KB)
RES 进程使用的物理内存大小(KB)
SHR 进程使用的共享内存的大小(KB)
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
COMMAND 进程启动的命令名或命令行
top
命令支持按键操作响应事件,常用的按键操作有:
按键描述
P(shift + p) 按%CPU降序排序结果
M(shift + m) 按%MEM降序排序结果
N(shift + n) 按PID降序排序结果
1(数字键1)查看每个核的CPU使用情况
s 刷新的时间间隔(默认是5秒)
q 退出命令
- 使用
d
命令,可以指定列表信息刷新的时间间隔(默认是5秒):
$ top d 2
- 使用
p
命令,可以指定特定的进程ID,只查看该进程的信息:
$ top p 12223
22. grep 命令
用于搜索文本内容。它能帮助你从大量的数据中快速找到你想要的数据。
- 查看“catalina.out”日志文件中,出现“ERROR”文本的行:
$ grep ERROR catalina.out
- 使用
n, linenumber
选项,会对搜索匹配的行标记出其行号:
$ grep n ERROR catalina.out
- 使用
e, regexp
选项,可以一次指定搜索多个文本:
$ grep n e WARN e ERROR catalina.out
用于搜索“catalina.out”文件中,出现“WARN”或“ERROR”文本的行。
- 使用
color
选项,可以在结果行中高亮显示搜索的文本:
$ grep color catalina.out
- 使用
E, extendedregexp
选项(等效于egrep
),可以使用正则表达式来搜索文本:
$ egrep 'b20180517 11[09]+' catalina.out
用于搜索以“20180517 11”开头的行(即用于查看20180517日11时的日志信息)。常用的正则表达式表格:元字符描述匹配搜索字符串开始的位置。如“abc”用于匹配以“abc”字符串开头的行。 如果用于中括号里面的第一个字符,则表示对字符集求反,如“[^abc]”用于匹配 除了以“a”或“b”或“c”以外的其它字符开头的行。$匹配搜索字符串结尾的位置。如“abc$”用于匹配以“abc”字符串结尾的行。b锚定词首或词尾。如“bhello”表示以“hello”开始的词。.匹配除换行符“n”之外的任何单个字符。如“a.c”可以匹配“abc”或“a2c”等。?匹配零次或一次前面的字符或子表达式,等效于“{0,1}”。如“ab?c”可以匹配“abc”和“ac”。匹配零次或多次前面的字符或子表达式,等效于“{0,}”。如“abc”可以匹配“abc”和“ac”和“abbc”等。+匹配一次或多次前面的字符或子表达式,等效于“{1,}”。如“ab+c”可以匹配“abc”和“abbc”等。[ ]匹配中括号的开始和结尾。 如“[abc]”匹配“plain”中的“a”。 如“[az]”匹配26个小写英文字母。 如“[09]”匹配0到9的数字。{n}匹配前面的字符或子表达式正好n次。如“ab{2}c”匹配“abbc”。{n,}匹配前面的字符或子表达式至少n次。如“ab{2,}c”匹配“abbc”和“abbbc”等。{,m}匹配前面的字符或子表达式至多n次。如“ab{,2}c”匹配“ac”和“abc”和“abbc”。{n,m}匹配前面的字符或子表达式至少n次,至多m次。如“ab{2,3}c”匹配“abbc”和“abbbc”。w匹配字母和数字,相当于“[09AZaz]”W匹配非字母和数字,相当于“[^09AZaz]”
- 使用
v, invertmatch
选项,可以反转查找:
$ ps ef grep java grep v grep
查看“java”进程信息,并且将grep java
行的信息排除掉。
- 使用
R, r, recursive
选项,可以从一个目录中的所有文件中搜索:
$ grep r ERROR logs/
23. find 命令
用于查找系统的文件。它能帮助你快速的定位和找到你想要的文件。语法:find [查找的目录] [选项] [参数]
- 使用
name
选项,可以按文件的名称进行查找:
$ find . name '*.log'
在当前目录(“.”表示当前目录,find
命令查找时,会对给定的目录以及该目录下所有的子目录都进行查找)下,查找“*.log”文件。find
命令支持通配(*
),为避免*
被bash进行扩展,因此需要加引号。
- 使用
type
选项,可以按文件类型进行查找:
$ find . type d
常见的文件类型有:文件类型描述f普通文件d目录l符号链接
- 使用
mmin
选项(last modified minutes),可以查找在指定时间被更改过的文件或目录:
$ find . name '*.log' mmin 3
3
表示查找3分钟前。
- 使用
exec command {} ;
选项,可以执行一个任意的command命令:
$ find . name '*.log' exec cat {} ; > logs.txt
该命令是用于将当前目录下的所有的log文件的内容拼接成一个数据流重定向到logs.txt文件中。其中的{}
是与exec
选项搭配使用的一个特殊符,它最终会被替换为find
命令匹配到的每个文件的文件名称。
24. su 命令
用于切换用户身份。用户身份变更时,需要输入变更的用户账户密码。特殊的,root用户切换到其它用户账户时,不需要密码。 用户身份切换可以通过ctrl + d
发送一个 exit 信号,用于快捷退出当前登录的用户账户,以返回切换前的用户身份。
su [user]
可以切换当前的用户身份。默认su
是切换为root用户:
$ su
它等效于:$ su root
切换为“testusr”用户:
$ su testusr
切换用户身份后,不会改变用户所在的当前目录。 如切换用户前是在“/home/fanlychie/myconfig”目录下,切换用户后还是在“/home/fanlychie/myconfig”目录下。
su [user]
切换当前的用户身份,并将工作目录改变为目标用户的“home”目录:
$ su testusr
例如切换用户前是在“/home/fanlychie/myconfig”目录下,切换用户后是在“/home/testusr”目录下。
25. 前台和后台任务
后台进程也叫守护进程,是运行在系统后台的一种特殊的进程,它脱离了终端控制台的控制。 前台进程是用户使用有控制终端的进程,它通常以窗口或对话框的形式展现。
如果想要将一个进程放到后台去运行,只需在命令的末尾加&
:
$ java jar springbootapplication.jar &
一般情况下,当用户退出终端时,用户启动的后台进程也会跟着退出。为了使进程可靠的在后台不间断的运行,可以使用nohup command &
。
$ nohup java jar springbootapplication.jar &
默认情况下,nohup
命令会将标准输出和标准错误输出重定向到当前目录下的“nohub.out”文件中。nohup
并不能让进程在后台运行,但能让进程忽略挂断信号。用户退出终端或网络断开的情况下,nohup
进程不会退出。
当我们使用nohup command &
命令启动一个后台进程时,我们可能并不希望日志信息输出到前台或“nohub.out”文件中,特别是在使用脚本启动一个后台进程时。
$ nohup java jar springbootapplication.jar >/dev/null 2>&1 &
>/dev/null
中的: >
表示重定向到某个地方。默认是标准输出,即>
等效于1>
。 /dev/null
是系统的空设备文件,经常被用来当做垃圾箱使用。也有人把它比作“黑洞”,因为所有输出到这里的东西都会消失的无影无踪,在终端上也不会显示任何信息。
2>&1
中的: >&
是等同于的意思。 2>&1
则是表示将标准错误重定向到与标准输出相同的地方。
总的来说,这条命令的言外之意就是在后台启动一个服务,服务启动输出的信息和错误信息都不要显示在终端。
上面涉及到的“1”和“2”是文件描述符,文件描述符是用来描述输入和输出的整数。最常见的文件描述符:
文档类型说明文件描述符
stdin标准输入 0
stdout 标准输出 1
stderr 标准错误 2
后台的任务(或称进程,或称作业)可以使用jobs
命令来查看:
$ jobs
[1] Runningnohup java jar springbootapplication.jar > /dev/null 2>&1 &
[2]+ Stoppedtail f nohup.out
其中,[num]
里面的数字表示的是任务序号,+
号表示默认选择的任务。``号的任务需要通过任务序号来选择。
使用fg [num]
命令可以将一个后台进程切换到前台,若fg
命令后面没有指定任务序号,表示切换至默认的任务,即带+
号的任务:
$ fg
其等效于:$ fg 2
通过使用组合键ctrl + z
也可以将一个前台进程暂停并且放到后台中。比如通过vi
编辑文件或通过tail
查看文件的时候,ctrl + z
将其放入后台后,可以非常方便的切换回来。
命令bg [num]
可以让一个后台暂停的进程变为继续运行。同样的,若bg
命令后面没有指定任务序号,表示默认选择带+
号的任务:
$ bg
其等效于:$ bg 2
后台进程可以先切换至前台然后按ctrl + c
强制中断杀死进程。也可以通过kill %num
来杀死。
$ kill %2
26. 磁盘空间
系统的磁盘空间是一种有限的存储介质资源。当系统磁盘空间使用快要爆满时,我们需要删除或移走部分文件以腾出更多可用的磁盘空间。掌握如何去查看服务器的磁盘空间的使用情况这就显得很重要了。df
和du
是 Linux 系统中用于查看系统磁盘使用情况的两个重要命令。
df
(disk free,磁盘可用空间),用于查看服务器磁盘空间的使用情况:
$ df h
Filesystem SizeUsed AvailUse% Mounted on
/dev/sda2 19G 3.1G 15G 18% /
tmpfs 238M0238M 0% /dev/shm
/dev/sda1 291M34M 242M 13% /boot
参数h, –humanreadable
是使用易读格式(人类更易懂的), 将数值自动转换为常见 M、G 等单位显示。
其中,Size 是磁盘总的容量,Used 是已用的空间,Avail 是剩余可用的空间(重要),Use% 是已用的空间的百分比。
du
(disk usage,磁盘使用),用于查看文件或目录占用的磁盘空间大小:
$ du h logs
81M logs/app
149M logs
参数h, –humanreadable
是使用易读格式(人类更易懂的), 将数值自动转换为常见 M、G 等单位显示。
可以看出,logs目录总共占149M的磁盘空间。其中,logs/app目录共占81M,剩余的68M被logs根目录下的文件占用。如果想要查看各个文件占用的磁盘空间,可以追加使用a, –all
参数:$ du ha logs332K logs/demo1.log20K logs/demo2.log68M logs/demo3.log49M logs/app/appdemo2.log33M logs/app/appdemo1.log81M logs/app149M logs
参数s,summarize
仅显示总计,如统计当前路径下所有的文件或目录占用的磁盘空间:
$ du sh *
1.2G apps
149M logs
如果只是想统计当前路径占用的磁盘空间可以使用du sh
(等效于:du sh .
):$ du sh1.3G .
27. 内存空间
free
命令可用于查看系统内存的使用情况。
$ free h
totalusedfree shared buff/cache available
Mem11G6.7G155M 75M4.7G4.4G
Swap 2.0G 20M2.0G
参数h, –humanreadable
是使用易读格式(人类更易懂的), 将数值自动转换为常见 M、G 等单位显示。
参数描述
total 总的内存。
used已使用的内存。
free可用的内存。
shared 多个进程共享的内存。
buff/cache 缓冲区和缓存使用的内存。
available 可用的内存。当系统内存不足(没有足够的free内存可用时),就会从buff/cache中回收部分空间,以满足应用程序的需求。这是一个理想的值,它往往存在一些误差。
第一行Mem
表示物理内存。第二行Swap
是交换空间,它是磁盘上的一块区域。当系统的物理内存吃紧时,Linux 就会将内存中不常用的数据存储到 swap 分区上,这样就能腾出一些内存空间来为其他应用程序服务。当系统需要用到 swap 分区上存储的数据时,Linux 再将这些数据调入内存中。这就是换入和换出。swap 分区可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。
28. wc 命令
word count(单词统计)。
用于统计文件或从标准设备读入的数据的行数、单词数和字符数。
参数c, bytes
用于统计字符数:
$ wc c zookeeper.out
60669 zookeeper.out
参数w, words
用于统计单词数:
$ wc w zookeeper.out
4169 zookeeper.out
参数l, lines
用于统计行数:
$ wc l zookeeper.out
491 zookeeper.out
29. netstat 命令
用于查看系统的网络状态信息。
使用ant
组合选项,可以查看所有的TCP连接状态信息:
a, –all
显示所有的socket链接 n, –numeric
使用数字类型的IP地址显示 t, –tcp
只显示TCP传输协议的链接
$ netstat ant
Proto RecvQ SendQ Local Address Foreign AddressState
tcp6 0 0 20818* LISTEN
tcp6 0 0 20809* LISTEN
tcp6 0 0 10.10.10.17120818 10.10.10.17055648 ESTABLISHED
tcp6 0 0 10.10.10.17120818 10.10.10.17034580 ESTABLISHED
tcp6 0 0 10.10.10.17120809 10.10.10.17626379 ESTABLISHED
字段描述Local Address本地地址和端口信息Foreign Address远程地址和端口信息State状态信息。常见的状态有: LISTEN:本地监听的端口; ESTABLISHED:远程访问本机服务的地址和端口信息; TIME_WAIT:链接已挂断,socket在网络上等待结束;
使用lntp
组合选项,可以查看系统监听端口的所有进程信息:
l, –listening
只显示监听中的socket链接 n, –numeric
使用数字类型的IP地址显示 t, –tcp
只显示TCP传输协议的链接 p, –program
显示正在使用此socket的进程PID和进程名称
$ netstat lntp
Proto RecvQ SendQ Local Address Foreign Address State PID/Program name
tcp6 0 0 20811*LISTEN 20369/java
tcp6 0 0 20813*LISTEN 20465/java
tcp6 0 0 20815*LISTEN 20489/java
查找某个端口被哪个进程占用:
$ netstat lntp grep 8080
tcp6 0 0 8080 *LISTEN 7596/java
由此可见,8080端口被进程PID为7596的程序占用。然后可以通过ps
命令查找出该进程所属的程序:$ ps ef grep 7596joinpay 7596 1 0 7月09 ? 000426 /usr/local/jdk1.7.0_72/...
统计某个端口的服务当前的链接数量。如统计“20818”端口:
$ netstat ant grep "20818" wc l
21
30. vi 命令
vi
是 Linux 系统中的一个强大的编辑器。可用于文本的写入、替换、删除、查找等。 vi
编辑器的三种模式: 1.命令模式:可以控制光标移动、字符或行等的删除或复制等操作; 2.插入模式:顾名思义就是插入文本,只有在该模式下才可以输入字符; 3.底行模式:可以设置编辑器环境、字符查找、文件保存和退出等操作;
在命令模式下可以通过按键进行:
按键 说明
j 光标向下移动( ↓ )
k 光标向上移动( ↑ )
h 光标向左移动(←)
l 光标向右移动(→)
gg 文首
G 文尾
nG n是一个数字,定位到第n行
0 行首(数字0)
^ 行首
$ 行尾
dd 删除光标所在的行
yy 复制光标所在的行
x 从光标高亮处(包括高亮处)开始向后(右)删除字符
X 从光标高亮处(不包括高亮处)开始向前(左)删除字符
p 将复制的内容粘贴在光标所在行的下一行
P 将复制的内容粘贴在光标所在行的上一行
u 还原动作
. 重复动作
?word 向上查找word字符串
/word 向下查找word字符串
n 同方向搜索(如果是“?”则是向上搜索,如果是“/”则是向下搜索)
N 反方向搜索(如果是“?”则是向下搜索,如果是“/”则是向上搜索)
在命令模式下,通过以下的操作可以进入插入模式:
按键 说明
i 在光标高亮处之前插入
I 在光标所在行的行首插入
a 在光标高亮处之后追加
A 在光标所在行的行尾插入
o 在光标所在行的下一行插入一个空行
O 在光标所在行的上一行插入一个空行
Esc 退出插入模式,回到命令模式
在命令模式下,通过以下的操作可以进入底行模式:
按键 说明
w 保存
q 退出
w!强制写入保存
q!强制退出
wq保存退出
wq! 强制保存退出
set nu显示行号
set nonu 不显示行号
nohl 退出匹配的高亮显示
s/表达式/替换字符/替换当前行匹配到的第一个处
s/表达式/替换字符/g 替换当前行匹配到的所有处
%s/表达式/替换字符/g 替换文档中匹配到的所有处
ZZ 保存退出
ZQ 不保存退出
编辑“hello.txt”文件:
$ vi hello.txt
其文件内容如下:hello world
输入%s/o/O/g
可将全部的“o”替换成“O”。
vi
命令除了可以用来编辑文件之外,使用它来查看日志文件也是一个利器:
$ vi R my.log
R
是只读模式,为避免不小心编辑到日志文件,最好加上此参数项。在vi
编辑器里,你可以利用它强大的命令快捷的查看日志文件的内容。
N. rpm 命令
RedHat Package Manager(RedHat Linux操作系统的软件包管理工具)。
用于对“*.rpm”软件包进行安装、查询、卸载等。
N. vi 命令
01. 命令执行控制
使用;
,``,&&
分隔符,可以在一个命令行中执行多条命令。
[ ; ]
$ command1 ; command2 [ ; command3 ...]
command1执行不管成功与否,command2总是会继续执行。它相当于:
$ command1
$ command2
示例:进入目录,罗列指定字符开头的文件。
$ cd logs/ ; ll springbootdemo*
[ ]
$ command1 command2 [ command3 ...]
command1执行失败时,command2才执行。command1执行成功时,command2不执行。即或逻辑。
示例:关闭防火墙,如果操作失败,输出 fail。
$ service iptables stop echo "fail"
[ && ]
$ command1 && command2 [ && command3 ...]
command1执行成功时,command2才执行。command1执行失败时,command2不执行。即与逻辑。
示例:启动 Tomcat 应用,启动命令执行成功后,打开控制台查看日志。
$ ./bin/startup.sh && tail f logs/catalina.out
02. 后台进程
如果想要将一个进程放到后台去运行,只需在命令的末尾加&
。
示例:启动服务,并让其在后台运行。
$ java jar springbootapplication.jar &
一般情况下,当用户退出终端时,用户启动的后台进程也会跟着退出。为了使进程可靠的在后台不间断的运行,可以使用nohup command &
。
示例:启动服务,并让其在后台不间断的运行。
$ nohup java jar springbootapplication.jar &
默认情况下,nohup
命令会将标准输出和标准错误输出重定向到当前目录下的nohub.out
文件中。nohup
并不能让进程在后台运行,但能让进程忽略挂断信号。用户退出终端或网络断开的情况下,nohup
进程不会退出。
03. 文件描述符
文件描述符是用来描述输入和输出的整数。最常见的文件描述符:
文档类型说明文件描述符
stdin标准输入 0
stdout 标准输出 1
stderr 标准错误 2
示例:启动服务,并让其在后台不挂断的运行。
$ nohup java jar springbootapplication.jar >/dev/null 2>&1 &
上面已经介绍了nohup command &
。我们这里主要来分析>/dev/null 2>&1
片段的含义和作用:
第一部分:>
是重定向到某个地方。默认是标准输出,即>
等效于1>
。
第二部分:/dev/null
是系统的空设备文件,经常被用来当做垃圾箱使用。也有人把它比作“黑洞”,为所有输出到这里的东西都会消失的无影无踪,在终端上也不会显示任何信息。
第三部分:>&
是等同于的意思。2>&1
则是将标准错误重定向到与标准输出相同的地方。
综上所述,这条命令的中心思想是:在后台运行服务,启动输出的信息和错误信息都不要显示在终端。
04. 前后台任务互切
上面介绍了&
将进程放到后台去运行,使用jobs
命令可查看后台进程:
$ jobs
[1] Runningnohup java jar springbootapplication.jar > /dev/null 2>&1 &
[2]+ Stoppedtail f nohup.out
[]
里面的数字表示的是任务序号,+
号表示默认选择的任务。``号的任务需要通过任务序号来选择。
fg [任务序号]
可以将一个后台进程切换到前台,若fg
命令后面没有指定任务序号,表示切换至默认的任务,即带+
号的任务:
$ fg 1
组合键ctrl + z
也可以将一个前台进程放到后台并且暂停。比如通过vi
编辑文件或通过tail
查看文件的时候,ctrl + z
将其放入后台后,可以非常方便的切换回来。
bg [任务序号]
可以让一个后台暂停的进程变为继续运行。同样的,若bg
命令后面没有指定任务序号,表示默认选择带+
号的任务:
$ bg 1
后台进程可以先切换至前台然后按ctrl + c
强制中断杀死进程。也可以通过kill %任务序号
来杀死。
$ kill %2
05. 管道
管道“”可以将上一个命令的标准输出传递到下一个命令,并作为下一个命令的标准输入。
$ command1 command2 [ command3 ...]
查看目录下的文件,并显示行号:
$ ll cat n
1 total 40
2 drwxrxrx. 2 fanlychie fanlychie 4096 Nov 5 0024 Desktop
3 drwxrxrx. 2 fanlychie fanlychie 4096 Nov 5 0023 Documents
4 drwxrxrx. 2 fanlychie fanlychie 4096 Nov 5 0023 Downloads
06. 空格
在 shell 编程中,空格是一个分隔符。一个常见的错误是:
#!/bin/bash
name = fanlychie
echo $name
执行的时候就会报:line 2 name command not found
。原因是=
两边有空格,shell 会认为空格前面是一个命令,因此会报命令找不到的错误。
在 shell 编程中,空格的用法常见的有:
命令和选项之间必须有空格;
赋值符号=
两边不能有空格;
测试语句[
的两边要有空格,]
的左边要有空格。如if [ condition ]
;
分隔符;
、、`&&`两边的空格可有可无; 管道
两边的空格可有可无;
07. 引号
当操作一个字符串时,如果该字符串中含有空格,那么,空格前面的字符就会被当成命令来执行。被引号包裹起来的字符串,shell 会将它当成一个普通的字符串对待,而不会去解析成命令来执行。
单引号
单引号''
包裹的内容是所见即所得。
#!/bin/bash
sayhi='hello world'
echo $sayhi
执行结果:hello world
单引号里面引用的变量无效(所见即所得,任何变量都不会被替换)。
#!/bin/bash
sayhi='hello world'
echo 'You have one new message $sayhi'
执行结果:You have one new message $sayhi
双引号
双引号""
包裹的内容,可以引用外部定义的变量。
#!/bin/bash
sayhi="hello world"
echo "You have one new message $sayhi"
执行结果:You have one new message hello world
反引号
反引号````(键盘左上角Esc正下方的键)包裹的内容,可以用于存储命令的输出,即命令替换。
$ echo "curr time `date`"
执行结果:curr time Sat Nov 11 141715 UTC 2017
10. 文本搜索
文本搜索能力很重要。它能帮助你从大量的数据中快速定位和找到你想要的数据。常用的是通过grep
命令完成。语法:grep [OPTIONS] PATTERN [FILE...]
示例:查找日志文件中,所有出现“ERROR”字符串的地方:
$ grep ERROR access.log
示例:查找日志文件中,所有出现“ERROR”字符串的地方,并打印行号:
参数:n, linenumber
释义:搜索的结果显示文本在文件中的行号
$ grep n ERROR access.log
示例:查找日志文件中,所有出现“ERROR”字符串的地方,并打印行号高亮显示:
参数:color
释义:匹配的文本会被不同颜色高亮显示
$ grep n color ERROR access.log
示例:查找目录下所有的日志文件中,所有出现“ERROR”字符串的地方,并打印行号高亮显示:
$ grep n color ERROR *.log
示例:查找日志文件中,所有出现“ERROR”或“WARN”字符串的地方,并打印行号高亮显示:
参数:e, regexp
释义:允许指定多个不同的搜索字符串
$ grep n color e ERROR e WARN access.log
示例:查找日志文件中,所有出现“Exception”字符串的地方,并打印行号高亮显示:
参数:E, extendedregexp
释义:允许搜索串中使用正则表达式
$ grep En color 'bw+Exceptionb' access.log
egrep
等效于grep E
。可以在搜索串中使用正则表达式来匹配。
$ egrep n color 'bw+Exceptionb' access.log
示例:查找日志文件中,最近出现“Exception”字符串的10个地方,并打印行号:
$ egrep n 'bw+Exceptionb' access.log tail
附正则表达式表:
元字符 描述
^ 匹配搜索字符串开始的位置。如“^abc”用于匹配以“abc”字符串开头的行。 如果用于中括号里面的第一个字符,则表示对字符集求反,如“[^abc]”用于匹配 除了以“a”或“b”或“c”以外的其它字符开头的行。
$ 匹配搜索字符串结尾的位置。如“abc$”用于匹配以“abc”字符串结尾的行。
. 匹配除换行符“n”之外的任何单个字符。如“a.c”可以匹配“abc”或“a2c”等。
? 匹配零次或一次前面的字符或子表达式,等效于“{0,1}”。如“ab?c”可以匹配“abc”和“ac”。
- 匹配零次或多次前面的字符或子表达式,等效于“{0,}”。如“ab*c”可以匹配“abc”和“ac”和“abbc”等。
- 匹配一次或多次前面的字符或子表达式,等效于“{1,}”。如“ab+c”可以匹配“abc”和“abbc”等。
[] 匹配中括号的开始和结尾。 如“[abc]”匹配“plain”中的“a”。 如“[az]”匹配26个小写英文字母。 如“[09]”匹配0到9的数字。
{n} 匹配前面的字符或子表达式正好n次。如“ab{2}c”匹配“abbc”。
{n,}匹配前面的字符或子表达式至少n次。如“ab{2,}c”匹配“abbc”和“abbbc”等。
{,m}匹配前面的字符或子表达式至多n次。如“ab{,2}c”匹配“ac”和“abc”和“abbc”。
{n,m} 匹配前面的字符或子表达式至少n次,至多m次。如“ab{2,3}c”匹配“abbc”和“abbbc”。
w 匹配字母和数字,相当于“[09AZaz]”
W 匹配非字母和数字,相当于“[^09AZaz]”
示例:从标准输入中搜索出现“java”字符的地方:
$ ps ef grep java
root 1807 1 0 Nov11 ? 000138 /usr/local/jdk1.8.0_144/bin/java Dcom.sun.akuma.Daemon=daemonized Djava.awt.headless=true DJENKINS_HOME=/var/lib/jenkins jar /usr/lib/jenkins/jenkins.war logfile=/var/log/jenkins/jenkins.log webroot=/var/cache/jenkins/war daemon httpPort=8080 debug=5 handlerCountMax=100 handlerCountMaxIdle=20
500 4621 4164 0 0023 pts/2 000000 grep java
ps
是用来查看进程信息,后续会讲到。看回上面输出的最后一行,通常情况下,它不是我们想要的,我们可以使用v
(invertmatch,反转匹配。即除了匹配外的其他所有行)参数将它过滤掉:
$ ps ef grep java grep v grep
root 1807 1 0 Nov11 ? 000138 /usr/local/jdk1.8.0_144/bin/java Dcom.sun.akuma.Daemon=daemonized Djava.awt.headless=true DJENKINS_HOME=/var/lib/jenkins jar /usr/lib/jenkins/jenkins.war logfile=/var/log/jenkins/jenkins.log webroot=/var/cache/jenkins/war daemon httpPort=8080 debug=5 handlerCountMax=100 handlerCountMaxIdle=20
示例:递归搜索目录下的所有文件中出现“Exception”的地方,并打印行号高亮显示:
参数:R, r, recursive
释义:从给定的目录开始递归所有的子目录
$ egrep rn color 'bw+Exceptionb'
11. 文件搜索
文件搜索的能力也很重要。它能帮助你快速的找到你想要的文件。常用的是通过find
命令完成的。
示例:查找目录下的某个文件:
参数:name
释义:根据文件的名称搜索
$ find . name 'logging.properties'
./conf/logging.properties
示例:使用通配符查找目录下的所有的.properties文件:
$ find . name '*.properties'
示例:查看目录下的所有的子目录:
参数:type
释义:根据文件的类型搜索,常用的d(directory,目录)、f(regular file,文件)
$ find . type d
示例:查看目录下的所有的文件:
$ find . type f
示例:查找3分钟之内有流量进来的日志文件:
参数:mmin(最后一次修改文件的时间)
释义:最近一次文件内容被修改的时间
$ find . name '*.log' mmin 3
示例:高级用法,执行一个命令。
参数:exec command {} ;
释义:执行一个任意的command命令。
备注:{}
是一个与exec
搭配使用的特殊符,它会被替换为find
命令匹配到的每个文件的文件名称。
$ find . type f name '*.log' exec cat {} ; > demo.txt
达到的效果就是,将当前所有的log文件的内容拼接成一个数据流重定向到demo.txt文件中。
12. 进程信息
当前系统运行的所有进程信息都可以用ps
命令来查看,搭配kill
命令可以随时杀死某个进程。
示例:查看当前系统所有的进程信息,常用的组合参数是ef
或aux
(注意参数前面没有``):
$ ps ef
UID PIDPPID C STIME TTY TIMECMD
500 2878 1 0 1237 pts/0 000024/usr/local/jdk1.8.0_144/bin/java Djava.util.logging.config.file=/home/fanlychie/applications/apachetomcat8.0.45/conf/logging.properties
字段 描述
UID 进程所属的用户ID
PID 进程ID
PPID 进程的父ID
CCPU 使用比率
STIME 进程的启动时间
TTY 开始此进程的终端设备。“?”表示是系统启动的与终端无关。“tty1”至“tty6”表示是本机上登录者程序。“pts/0”等,则表示为由网络连接进主机的程序。
TIME 进程使用的 CPU 总时间
CMD 启动进程的命令和参数
$ ps aux
USER PID%CPU %MEM VSZ RSSTTY STAT START TIME COMMAND
500 2878 0.1 18.3 2161124 89300 pts/0 Sl 1237 027 /usr/local/jdk1.8.0_144/bin/java Dcom.sun.akuma.Daemon=daemonized Djava.awt.headless=true DJENKINS_HOME=/var/lib/jenkins
字段描述
USER进程的拥有者
PID进程ID
%CPU进程占用的 CPU 百分比
%MEM进程占用的内存的百分比
VSZ进程使用的虚拟内存大小,单位:KB
RSS进程占用的固定内存大小,单位:KB
TTY开始此进程的终端设备。“?”表示是系统启动的与终端无关。“tty1”至“tty6”表示是本机上登入者程序。“pts/0”等,则表示为由网络连接进主机的程序。
STAT进程的状态。常见的状态有: R:正在运行或可运行状态; S:处于休眠状态,等待被唤醒; Z:僵尸进程,程序已终止,进程无法正常退出; T:已停止或处于被追踪状态; D:不可中断,一般是在等待I/O; <:优先级高的进程; N:优先级低的进程; s :进程领导者,在它之下有子进程; l:多线程的;
START 进程的启动时间
TIME进程使用的 CPU 总时间
COMMAND 启动进程的命令和参数
小结:ps
命令的参数项非常多,掌握常用的参数组合项即可。如果只是查看进程的PID或PPID信息可选用ps ef
;如果要查看进程的PID和占用系统的内存和CPU信息可选用ps aux
。
示例:使用ps
命令列出的进程信息会比较多,可以通过管道结合more
或less
命令翻页查看:
提示:less
命令可以通过键盘的PageUp键(↑)和PageDown键(↓)上下翻页,按q键退出。
$ ps ef less
示例:自定义显示的进程信息的字段,参数组合eo:
释义:pid,pcpu,pmem,cmd是别名,分别对应PID,%CPU,%MEM,CMD。
$ ps eo pid,pcpu,pmem,cmd
PID%CPU%MEMCMD
1 0.0 0.1/sbin/init
2 0.0 0.0[kthreadd]
示例:查看所有的进程并按CPU降序排序:
参数:sort
释义:排序字段
排序:pcpu表示按%CPU降序,+pcpu表示按%CPU升序,由于+是默认的,因此可简写为pcpu
$ ps aux sort pcpu
示例:自定义显示的进程信息的字段并按CPU降序排序:
$ ps eo pid,pcpu,pmem,cmd sort pcpu
示例:找出最耗CPU的10个进程信息:
$ ps aux sort pcpu head
示例:查看所有的进程并按内存降序排序:
疑惑:像%CPU一样用别名来排序无效,这里借助管道通过sort命令来排序
参数:此为sort的参数,r降序(若没有此参数,sort默认采用升序的顺序来排序),n按数值来排序,k列的索引(第一列的索引值为1,以此类推)
$ ps aux sort nrk 4
示例:自定义显示的进程信息的字段并按内存降序排序:
$ ps eo pid,pcpu,pmem,cmd sort nrk 3
示例:找出最耗内存的10个进程信息:
$ ps eo pid,pcpu,pmem,cmd sort nrk 3 head
12. 杀死进程
通常情况下,残忍的杀死一个进程我们经常会使用kill
命令。
$ kill 9 2878
该命令的中心思想是用来强行杀死PID为2878的进程。kill是用来终止进程的信号。9是一个信号编号,表示强行杀死。除此之外,常见的信号编号还有:
信号编号 描述
2 当按下组合键“Ctrl + c”时会发出该信号
9 强行杀死
15 终止进程默认发送的信号
20 当按下组合键“Ctrl + z”时会发出该信号
13. top 命令
top
命令可以实时的监控系统中各个进程的资源占用情况,经常用于服务器性能监控和分析。
$ top
top
列出的信息内容非常丰富(部分信息与ps相似,不再赘述),默认每隔3秒钟自动刷新一次:
top
命令在运行中的时候,可以通过一些按键来控制显示的信息结果,常用的有:
信号编号 描述
Shift + p 按%CPU排序结果
Shift + m 按%MEM排序结果
Shift + n 按PID排序结果
1 数字1,查看每个核的CPU使用情况
首先来看前5行信息的内容:
第一行,系统的统计信息:
223529 up 26 days, 1333
表示系统连续运行的时间;
1 user
表示当前登录系统的用户数;
load average 0.04, 0.03, 0.05
表示系统分别在1、5、15分钟内的平均负载;
第二行,进程的统计信息:
133 total
表示进程的总数;
1 running
表示正在运行的进程数;
132 sleeping
表示休眠的进程数;
0 stopped
表示停止的进程数;
0 zombie
表示僵尸进程数;
第三行,CPU的统计信息:
0.2 us
表示用户占用的CPU百分比;
0.2 sy
表示内核占用的CPU百分比;
99.6 id
表示空闲的CPU百分比;
其余不一一列举了…
第四行,内存的统计信息:
12139564 total
表示物理内存的总大小;
1866952 free
表示空闲可用的物理内存总大小;
6600492 used
表示已经使用的物理内存总大小;
3672120 buff/cache
表示缓冲内存的总大小;
第五行,交换分区的统计信息:
2097148 total
表示交换分区的总大小;
2062220 free
表示空闲可用的交换分区的大小;
34928 used
表示已经使用的交换分区的大小;
示例:单独跟踪某个进程的运行状态:
参数:d
释义:每隔多少秒刷新一次
参数:p
释义:进程的ID
$ top d 1 p 12515
有时候,我们经常会看到CPU的使用率占比超过100%。你莫要惊慌,这是因为top
是按照单个CPU核数来计算的。如果一台服务器的CPU核数为4核,那么,该服务器的CPU使用率占比最高可达到400%。
内存是真内存!你看到剩余多少就是多少,没有更多了。如果系统剩余物理内存不是很足了,那就要引起注意了。Linux系统有一个OOMkiller(Out Of Memory killer)机制。当Linux内核检测到系统内存不足的时候,就会触发OOMkiller来挑选一个最耗内存的进程并杀掉这个进程以求释放一些内存出来。
除了内存和CPU,top还有一个地方很直观的反应出当前系统的性能指标,那就是第一行的load average系统平均负载。0.00~1.00之间的数值表示系统状况良好。超过1.00表示系统已经超出负荷快要不堪重负了。而实际上,我们也经常会看到服务器平均负载超过1.00的情况。这也跟服务器的CPU核数有关。如果一台服务器的CPU核数为4核,那么,该服务器的平均负载能力可达到4.00。事实上,当系统平均负载达到70%左右时,你就应该有所行动,在事情变得更糟糕之前,去分析其造成的原因。分析的焦点应放在后两项的数值,因为第一项是1分钟内的平均负载,时间太短,一瞬间的高并发导致该值大幅度上涨是很有可能的。作为一个程序猿,对top的心得言尽于此。
14. 硬盘使用情况
掌握如何去查看服务器的硬盘空间使用情况以及在硬盘空间捉襟见肘如何去查找大文件也很重要。特别是对于一些吃硬盘的应用,比如文件系统、索引检索应用等。
示例:查看服务器硬盘空间使用情况:
命令:df
释义:disk free,磁盘可用空间
参数:h, humanreadable
释义:易读格式, 指的是数值后面的单位,如:M、G 等
$ df h
Filesystem SizeUsed AvailUse% Mounted on
/dev/sda2 19G 3.1G 15G 18% /
tmpfs 238M0238M 0% /dev/shm
/dev/sda1 291M34M 242M 13% /boot
一般只看第一行就行,其它涉及Linux文件系统方面的知识有兴趣可以自行谷歌百度,这里不作描述。Size是磁盘容量,Used是已用的空间,Avail是剩余可用的空间(重要),Use%是已用的空间的百分比。
示例:查看文件或目录占用的磁盘空间大小:
命令:du
释义:disk usage,磁盘使用
参数:h, humanreadable
释义:易读格式, 指的是数值后面的单位,如:M、G 等
$ du h logs
81M logs/app
149M logs
可以看出,logs目录总共占149M的磁盘空间。其中,logs/app目录共占81M,剩余的68M被logs根目录下的文件占用。如果想要查看各个文件占用的磁盘空间,可以追加使用a, all参数:
$ du ha logs
332K logs/demo1.log
20K logs/demo2.log
68M logs/demo3.log
49M logs/app/appdemo2.log
33M logs/app/appdemo1.log
81M logs/app
149M logs
示例:找出目录下最大的10个文件:
$ find . type f exec du b {} ; sort nrk 1 head
70938260 ./demo3.log
50838254 ./app/appdemo2.log
33759270 ./app/appdemo1.log
336939 ./demo1.log
17510 ./demo2.log
由于是要按数值大小排序,故这里不能使用h参数,b, bytes是统计字节数,这样排序才准确。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升