avatar


2.命令

概述

命令格式

1
命令主体 选项 操作对象

一个命令可以有多个选项,多个操作对象。

在上一章《1.简介、目录和VIM》,我们讨论了VIM打开文件的四种常用方式,其实就是命令格式的体现。

  1. vim 文件路径:打开指定的文件。
  2. vim +数字 文件路径:打开指定的文件,并且将光标移动到指定行。
  3. vim +/关键词 文件路径:打开指定的文件,并且高亮显示关键词。
  4. vim 文件路径1 文件路径2 文件路径3:同时打开多个文件(这种不常用)。

如果操作对象名称的开头有-
我们可以在前面加上./,这样带-的操作对象不会被解析为选项。

例如,文件名为-123.txt,示例代码:

1
vim ./-123.txt

如果操作对象名称中有空格呢?
我们可以为其加上转义\ ,或者用单引号双引号括起来。
例如,文件名为 123.txt,示例代码:

1
2
vim \ 123.txt
vim ' 123.txt'

帮助

获取帮助信息有两种方法:

  1. man
  2. help

man,示例代码:

1
man ls

help,示例代码:

1
help cd

这两种存在区别,但是在讨论区别之前,我们先讨论一下Linux中的命令分类:

  1. 内建命令:是shell程序的一部分,写在bash的源码builtins里的。例如:historycdexit
  2. 外部命令:外部命令是在bash之外安装的,通常在/bin/usr/bin/sbin/usr/sbin中。例如:lsvi

我们可以用type来区分是内建命令还是外部命令。

举例:

  1. 内建命令,示例代码:

    1
    type exit

    运行结果:

    1
    exit is a shell builtin

    解释说明:is a shell builtin,说明是内建命令。

  2. 外部命令,示例代码:

    1
    type vim

    运行结果:

    1
    vim is /usr/bin/vim

    解释说明:is /usr/bin/vim,说明是外部命令。

  3. 别名,示例代码:

    1
    type ls

    运行结果:

    1
    ls is aliased to `ls --color=auto'

    解释说明:该命令为其他命令的别名。

help只用于查看内建命令的帮助信息。

快捷操作

  1. 上下箭头
    在命令行输入之前执行过的命令,我们可以按回车执行,也可以进行修改后再执行。
  2. tab
    对命令进行补齐,这个在输入文件名的时候特别方便。

文件目录

pwd

pwd:查看当前工作目录的绝对路径。

示例代码:

1
pwd

运行结果:

1
/home/kaka

ls

ls:查看目录。
操作对象:需要查看的目录,默认当前目录。
常用选项:

  • -a:显示当前目录所有的文件和目录,包括隐藏的。
  • -l:以列表的方式显示信息。
  • -h:较易阅读的方式表示文件大小(默认以字节为单位),需要和-l配合使用。

举例:

  1. ls -al:显示当前所有的文件和目录,包括隐藏的;以列表的形式。示例代码:

    1
    ls -al

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    total 15360

    【部分运行结果略】

    -rw-r--r--. 1 kaka kaka 1113 Jul 3 03:47 Milan Milan 米兰米兰.txt
    -rw-r--r--. 1 kaka kaka 12288 Jul 3 10:19 .Milan Milan 米兰米兰.txt.swp

    【部分运行结果略】

    解释说明:.Milan Milan 米兰米兰.txt.swp,属于隐藏文件。

  2. ls -lh:以较易阅读的方式表示文件大小;以列表的形式。示例代码:

    1
    ls -lh

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    -rw-rw-r--. 1 kaka kaka 2.7K Jul  3 09:08 111.txt
    -rw-rw-r--. 1 kaka kaka 439 Jul 4 13:23 123.txt
    -rw-rw-r--. 1 kaka kaka 430 Jul 4 13:23 -123.txt
    -rw-rw-r--. 1 kaka kaka 370 Jul 1 20:02 123.txt
    -rw-rw-r--. 1 kaka kaka 2.7K Jul 4 13:06 222.txt
    -rw-rw-r--. 1 kaka kaka 3.8K Jul 4 13:02 A New Day Has Come.txt
    drwxrwxr-x. 9 kaka kaka 4.0K Jun 25 10:45 apache-tomcat-8.5.81
    -rw-r--r--. 1 kaka kaka 15M Jun 25 10:44 apache-tomcat-8.5.81.tar
    -rw-rw-r--. 1 kaka kaka 1.2K Jul 4 13:00 a.txt
    -rw-rw-r--. 1 kaka kaka 150 Jul 4 13:07 cal.txt
    drwxr-xr-x. 2 kaka kaka 4.0K Jun 25 10:43 Desktop
    -rw-rw-r--. 1 kaka kaka 9.1K Jul 3 00:27 dev.txt
    drwxrwxr-x. 3 kaka kaka 4.0K Jul 4 21:07 dir1
    drwxrwxr-x. 2 kaka kaka 4.0K Jul 3 22:05 dir2
    drwxr-xr-x. 2 kaka kaka 4.0K Jun 23 07:54 Documents
    drwxr-xr-x. 2 kaka kaka 4.0K Jun 23 07:54 Downloads

    【部分运行结果略】
  3. 查看指定目录,示例代码:

    1
    ls -l apache-tomcat-8.5.81

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    total 148
    drwxr-x---. 2 kaka kaka 4096 Jun 25 10:45 bin
    -rw-r-----. 1 kaka kaka 19497 Jun 9 05:30 BUILDING.txt
    drwx------. 3 kaka kaka 4096 Jun 25 10:45 conf

    【部分运行结果略】

    drwxr-x---. 2 kaka kaka 4096 Jun 25 10:45 temp
    drwxr-x---. 7 kaka kaka 4096 Jun 9 05:30 webapps
    drwxr-x---. 3 kaka kaka 4096 Jun 25 10:45 work

ll

llls的一个别名。

我们可以通过type查看一下,示例代码:

1
type ll

运行结果:

1
ll is aliased to `ls -l --color=auto'

cd

cd:切换到指定目录,操作对象为路径。

路径表示方法

  • ~:用户的Home目录。
  • ..:上一级目录。
  • 绝对路径(相对根目录),以/开头。
  • 相对路径(相对当前目录),不以/开头。

不仅仅在cd中是如此,只要是路径,都是如此。

mkdir

mkdir:创建目录。

常用选项:

  • -p:创建多级目录

举例:

  1. 创建一个目录,示例代码:
    1
    mkdir dir
  2. 创建多级目录,示例代码:
    1
    mkdir dir1/dir2
    运行结果:
    1
    mkdir: cannot create directory ‘dir1/dir2’: No such file or directory
    解释说明:因为dir1不存在,所以无法创建dir1/dir2
    但可以利用参数-p实现,示例代码:
    1
    mkdir -p dir1/dir2

rmdir

rmdir:删除空目录,如果目录非空无法删除。

如果有多个要删除的空目录,可以用空格分隔。示例代码:

1
rmdir dir dir1

对于非空目录,可以采用如下的方法删除。

1
rm -rf 要删除的目录

touch

touch:创建空文件。

cp

cp:拷贝文件到指定路径。

该命令需要两个操作对象,第一个是源,第二个是目标。

常用选项:

  • -r:递归复制整个文件夹

举例:

  1. A New Day Has Come-新的一天已经来临.txt拷贝到dir1目录下。示例代码:

    1
    cp A\ New\ Day\ Has\ Come-新的一天已经来临.txt dir1/
  2. dir2整个目录拷贝到dir1。示例代码:

    1
    2
    cp -r dir2/ dir1/
    ll dir1/

    运行结果:

    1
    2
    -rw-r--r--. 1 kaka kaka 2679 Jul  3 22:03 A New Day Has Come-新的一天已经来临.txt
    drwxrwxr-x. 2 kaka kaka 4096 Jul 3 22:06 dir2

    解释说明:此时dir2目录是dir1的子目录。

  3. dir3整个目录的所有内容,拷贝到dir4
    dir3的目录结构如下:

    1
    2
    3
    4
    5
    6
    dir3/
    ├── 1
    ├── 2
    ├── 3
    └── dir3_1
    └── 3_1

    拷贝,注意,是dir3/*,有通配符。示例代码:

    1
    2
    cp -r dir3/* dir4/
    tree dir4/

    运行结果:

    1
    2
    3
    4
    5
    6
    dir4/
    ├── 1
    ├── 2
    ├── 3
    └── dir3_1
    └── 3_1

    解释说明:不包括dir3目录本身。

rm

rm:移除(删除)文件或目录。

常用选项:

  • -r:递归删除整个文件夹。
  • -f:强制删除不提示。

mv

mv:移动文件与目录,也可以用来重命名。

cp一样,该命令也需要两个操作对象,第一个是源,第二个是目标。

举例:

  1. 11.txt重命名为123.txt,示例代码:
    1
    mv 11.txt 123.txt
  2. 12.txt移动到dir1/目录下:
    1
    mv 12.txt dir1/

basename

basename,取路径里的文件名称。

基本语法:basename [string / pathname] [suffix]

suffix为后缀,如果suffix被指定了,会将suffix去掉。

举例:

  1. 取文件名,示例代码:
    1
    basename /home/kaka/apache-tomcat-8.5.81/conf/server.xml
    运行结果:
    1
    server.xml
  2. 取文件名,同时去除后缀。示例代码:
    1
    basename /home/kaka/apache-tomcat-8.5.81/conf/server.xml .xml
    运行结果:
    1
    server

dirname

dirname,取路径里的目录部分。

基本语法:dirname 文件绝对路径

举例:

  1. 取绝对路径中的目录部分,示例代码:
    1
    dirname /home/kaka/apache-tomcat-8.5.81/conf/server.xml
    运行结果:
    1
    /home/kaka/apache-tomcat-8.5.81/conf
  2. 取相对路径中的目录部分,示例代码:
    1
    dirname apache-tomcat-8.5.81/conf/server.xml
    运行结果:
    1
    apache-tomcat-8.5.81/conf

cat

cat:将文件内容输出到控制台(以只读的方式)。

常用选项:

  • -n:显示行号

示例代码:

1
cat -n A\ New\ Day\ Has\ Come.txt

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
 1  A New Day Has Come
2 新的一天已经来临
3 A New Day Has Come
4 新的一天已经来临
5 I was waiting for so long

【部分运行结果略】

90 不敢相信
91 If Ive been touched by an angel with love
92 天使触动了我 赐予我爱情
93 Hush, now
94 万籁俱寂[kaka@centos-linux ~]$

more

more:分页查看文本文件的内容。

通过more打开文件后,可以进行一些操作:

  • 空格键(Space):向下朝一页
  • Enter:向下翻一行
  • Ctrl + f:向下滚动一屏
  • Ctrl + b:向上滚动一屏
  • =:打印当前行的行号(在底部命令行打印)
  • : + f:打印文件名和当前行的行号(在底部命令行打印)
  • q:退出

less

less:分页查看文本文件的内容。与more类似,但是比more更强大,在查看文件内容时,并不是一次将整个文件加载,而是根据内容需要加载,对于查看大型文件具有较高的效率。

通过less打开文件后,同样可以进行一些操作:

  • 空格键(Space):向下朝一页
  • Enter:向下翻一行
  • f:向下滚动一屏
  • b:向上滚动一屏
  • =:显示当前页面是第几行到第几行
  • /:搜索
    • n:向下查找
    • N:向上(反向向下)查找
  • q:退出

>和>>

功能:输出重定向,可以将内容重定向至文件。如果文件不存在,会自动创建。
语法:

  • 覆盖:>
  • 追加:>>

举例:

  1. ll输出的内容,写入到a.txt中。示例代码:
    1
    2
    ll > a.txt
    cat a.txt
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    total 15264
    -rw-rw-r--. 1 kaka kaka 2679 Jul 3 09:08 111.txt
    -rw-rw-r--. 1 kaka kaka 370 Jul 1 20:02 123.txt
    -rw-rw-r--. 1 kaka kaka 2668 Jul 3 00:59 A New Day Has Come.txt
    drwxrwxr-x. 9 kaka kaka 4096 Jun 25 10:45 apache-tomcat-8.5.81
    -rw-r--r--. 1 kaka kaka 15380480 Jun 25 10:44 apache-tomcat-8.5.81.tar

    【部分运行结果略】

    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Pictures
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Public
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Templates
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Videos
    -rw-------. 1 kaka kaka 171879 Jul 3 09:57 web.xml
  2. ll输出的内容,追加到A New Day Has Come.txt。示例代码:
    1
    2
    ll >> A\ New\ Day\ Has\ Come.txt 
    cat A\ New\ Day\ Has\ Come.txt
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    A New Day Has Come
    新的一天已经来临
    A New Day Has Come
    新的一天已经来临
    I was waiting for so long
    漫长等待
    For a miracle to come
    等待奇迹的出现

    【部分运行结果略】

    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Music
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Pictures
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Public
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Templates
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Videos
    -rw-------. 1 kaka kaka 171879 Jul 3 09:57 web.xml
  3. 将文件111.txt的内容覆盖到222.txt。示例代码:
    1
    cat 111.txt > 222.txt
  4. 将当前日历信息写到cal.txt。示例代码:
    1
    2
    cal > cal.txt
    cat cal.txt
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
          July 2022     
    Su Mo Tu We Th Fr Sa
    1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    31

echo

echo:输出内容到控制台。

示例代码:

1
echo 123

运行结果:

1
123

head:打印文件的开头部分内容,默认10行。

常用选项:

  • -数字-n 数字:打印前指定的行。

打印前5行,示例代码:

1
head -5 A\ New\ Day\ Has\ Come.txt

运行结果:

1
2
3
4
5
A New Day Has Come
新的一天已经来临
A New Day Has Come
新的一天已经来临
I was waiting for so long

tail

tail:输出文件中尾部的内容,默认10行。
常用选项:

  • -数字-n 数字:打印结尾指定的行
  • -f:实时追踪该文档的所有更新,通常用于观察日志。

示例代码:

1
tail -5f Milan\ Milan\ 米兰米兰.txt

运行结果:

1
2
3
4
5
愿你远离污染
Milan Milansolocon te
米兰,米兰 只愿拥护你
Milan Milansempreper te
米兰,米兰 永远为了你

Linux中的命令headtail用于显示前若干行或后若干行,这个容易联想到Pandas中DataFrame的函数head()tail()
关于Pandas中的DataFrame的函数head()tail(),可以参考《用Python分析数据的方法和技巧:3.pandas》

split

用法:

1
split [参数] [要分割的文件名] [分割后的文件名前缀]

参数:

  • -b,指定切割文件大小,单位b、k、m。
  • -l,指定每多少行切割一次,用于文本文件分割。
  • -C,与-b类似,但尽量维持每行完整性。
  • -a,指定后缀名的长度,默认为2位。
  • -d,使用数字而不是字母作为后缀名。
  • –version,显示版本信息。

示例代码:

1
2
# 把 wm6.dmg 这个文件以 wm6.dmg. 开头,按1024m大小进行分割
split -b 1024m wm6.dmg wm6.dmg.

如何需要合并文件,可以用上文的cat方法。
files_name_1files_name_2files_name_3这三个文件进行合并,合并成一个叫files_name的文件,示例代码:

1
cat files_name_1 files_name_2 files_name_3 > files_name

ln -s

ln -s:创建软连接。
注意!一般都是建立软连接!即一般在ln加上选项-s
该命令需要两个操作对象,第一个是源,第二个是连接名。

示例代码:

1
2
ln -s apache-tomcat-8.5.81/logs/ tomcat-logs
ll

运行结果:

1
2
3
4
5
6

【部分运行结果略】

lrwxrwxrwx. 1 kaka kaka 26 Jul 4 21:30 tomcat-logs -> apache-tomcat-8.5.81/logs/

【部分运行结果略】

特别的,当我们使用pwd查看目录时,看到的是软链接所在目录。示例代码:

1
2
cd tomcat-logs/
pwd

运行结果:

1
/home/kaka/tomcat-logs

history

history:查看已经执行过的命令。

示例代码:

1
history

运行结果:

1
2
3
4
5
6
7
8

【部分运行结果略】

332 history
333 cal
334 cal 202206
335 cal 2022
336 history

上述的history命令没有显示执行时间。
显示执行时间有两种方法:

  1. 先执行HISTTIMEFORMAT="%F %T ",然后执行history
    该方法只在当前会话有效。
  2. 修改/etc/profile,添加如下内容,再执行source /etc/profile
    1
    2
    HISTTIMEFORMAT="%F %T: "
    export HISTTIMEFORMAT
    该方法长期有效。

时间日期

date

date:查看时间。

常见用法:

  • date:当前时间
  • date +%Y:年
  • date +%m:月
  • date +%d:日
  • date +%H:时
  • date +%S:秒(S,大写)
  • date +%s:当前时间戳(s,小写)

如果我们想查看"年-月-日 时:分:秒"这种格式的呢?
'+%Y-%m-%d %H:%M:%S'(需要用单引号或者双引号括起来),示例代码:

1
date '+%Y-%m-%d %H:%M:%S'

运行结果:

1
2022-07-04 21:43:16

date的另一个作用,是设置时间。

语法:date -s 字符串时间

示例代码:

1
date -s '2020-12-12 12:12:12'
运行结果:
1
Sat Dec 12 12:12:12 CST 2020

cal

cal:查看日历。

举例:

  1. 查看当前月份的日历,示例代码:
    1
    cal
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
          July 2022     
    Su Mo Tu We Th Fr Sa
    1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    31
  2. 查看指定年的日历,示例代码:
    1
    cal 2022

搜索查找

find

find:从指定目录向下遍历符合条件的各个文件、子目录。

注意!该命令,操作对象在前,选项在后。语法如下:

1
find 查找范围 选项

常用选项:

  • -name 文件名:按文件名查找。
  • -size 文件大小:按文件大小查找。
    • +文件大小:大于
    • -文件大小:小于
    • 文件大小:等于
  • -user 用户名:按所属用户查找。

举例:

  1. 查找文件名为1的,示例代码:

    1
    find ~ -name 1

    运行结果:

    1
    2
    /home/kaka/.local/share/webkitgtk/deviceidhashsalts/1
    /home/kaka/dir2/1

    注意,是包括拓展名的全名匹配。
    我们查找不含拓展名的111,无结果,示例代码:

    1
    find ~ -name 111

    运行结果:

    1
    【无】

    但是查找含拓展名的111.txt,有结果。示例代码:

    1
    find ~ -name 111.txt

    运行结果:

    1
    /home/kaka/111.txt

    如果想模糊匹配,可以利用通配符*

  2. 查找大于10M的文件,示例代码:

    1
    find ~ -size +10M

    运行结果:

    1
    2
    /home/kaka/Desktop/apache-tomcat-8.5.81.tar
    /home/kaka/apache-tomcat-8.5.81.tar
  3. 查找小于1K的文件,示例代码:

    1
    find ~ -size -1k

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /home/kaka/apache-tomcat-8.5.81/logs/manager.2022-07-04.log
    /home/kaka/apache-tomcat-8.5.81/logs/localhost_access_log.2022-07-04.txt
    /home/kaka/apache-tomcat-8.5.81/logs/manager.2022-07-03.log

    【部分运行结果略】

    /home/kaka/.cache/gdm/session.log.old
    /home/kaka/.cache/gdm/session.log
    /home/kaka/.cache/gnome-shell/update-check-3.28

    注意!命令中的k是小写的。

  4. 查找等于168k的,示例代码:

    1
    find ~ -size 168k

    运行结果:

    1
    2
    /home/kaka/web.xml
    /home/kaka/apache-tomcat-8.5.81/conf/web.xml

grep 和 |

grep:过滤查找。
|:管道符号,表示将前一个命令的运行结果输出传递给后面的命令处理。

grep命令的选项有:

  • -n:输出匹配行及行号。
  • -i:忽略大小写。

例如,查看文件中,含有"new"的行号以及内容,忽略大小写,示例代码:

1
cat A\ New\ Day\ Has\ Come.txt |grep -n -i new

运行结果:

1
2
3
4
5
6
7
8
9
1:A New Day Has Come
3:A New Day Has Come
15:I knew Id make it through
35:Let it shatter the walls for a new sun
37:A new day has come, oh
39:A New Day Has Come
63:Let it shatter the walls for a new sun

【部分运行结果略】

wc

wc:统计文件内容信息(包含行数、单词数、字节数)
常用参数:

  • -l:统计行数
  • -w:统计单词数
  • -c:统计字节数

举例:

  1. 统计行数,示例代码:
    1
    wc -l Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    34 Milan Milan 米兰米兰.txt
  2. 统计单词数,示例代码:
    1
    wc -w Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    121 Milan Milan 米兰米兰.txt
  3. 统计字节数,示例代码:
    1
    wc -c Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    1113 Milan Milan 米兰米兰.txt
  4. 统计行数、字数和字节数,示例代码:
    1
    wc Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    34  121 1113 Milan Milan 米兰米兰.txt
  5. grep结合,可以统计含有关键字的行数,例如可以用于分析日志中出现"ERROR"的行数。
    在这里,我们以Milan为例,示例代码:
    1
    grep Milan Milan\ Milan\ 米兰米兰.txt | wc -l
    运行结果:
    1
    10

压缩和解压

gzip gunzip

  • gzip:压缩文件,压缩后不会保留源文件。
  • gunzip:解压

举例:

  1. 压缩文件,示例代码:
    1
    2
    gzip A\ New\ Day\ Has\ Come.txt 
    ll
    运行结果:
    1
    2
    3
    4
    5
    6

    【部分运行结果略】

    -rw-rw-r--. 1 kaka kaka 1354 Jul 4 13:02 A New Day Has Come.txt.gz

    【部分运行结果略】
  2. 同时压缩两个文件。示例代码:
    1
    2
    gzip A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt 
    ll
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    【部分运行结果略】

    -rw-rw-r--. 1 kaka kaka 1354 Jul 4 13:02 A New Day Has Come.txt.gz

    【部分运行结果略】

    -rw-r--r--. 1 kaka kaka 625 Jul 3 03:47 Milan Milan 米兰米兰.txt.gz

    【部分运行结果略】
    解释说明:当gzip命令后面跟着两个操作对象的时候,两个操作对象都会被压缩。这一点不同于cpmv等命令(第一个是源,第二个是目标)。

zip unzip

基本用法

  • zip:压缩。
  • unzip:解压。

zipgzip的比较:

  1. 操作对象:
    zip至少需要两个操作对象,第一个操作对象是压缩文件的名字,之后的操作对象是被压缩文件。
    gzip可以只有一个操作对象,如果有多个操作对象,多个操作都会被压缩。
  2. 是否保留源文件:
    zip保留源文件。
    gzip不保留源文件。

举例:

  1. 如果只有一个操作对象的,会报错。示例代码:
    1
    zip A\ New\ Day\ Has\ Come.txt
    运行结果:
    1
    2
    3
    4
    5
    zip warning: missing end signature--probably not a zip file (did you
    zip warning: remember to use binary mode when you transferred it?)
    zip warning: (if you are trying to read a damaged archive try -F)

    zip error: Zip file structure invalid (A New Day Has Come.txt)
  2. 两个操作对象,第一个是压缩文件,第二个是被压缩文件。示例代码:
    1
    zip new.zip A\ New\ Day\ Has\ Come.txt
    运行结果:
    1
    updating: A New Day Has Come.txt (deflated 66%)
  3. 三个操作对象,第一个是压缩文件,之后的都是被压缩文件。示例代码:
    1
    zip n.zip A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    2
    adding: A New Day Has Come.txt (deflated 66%)
    adding: Milan Milan 米兰米兰.txt (deflated 48%)
  4. 如果被压缩对象是一个目录,加上-r。示例代码:
    1
    zip k.zip -r kafka_2.13-3.4.0

unzip命令只需要一个操作对象,被解压文件。

示例代码:

1
unzip tomcat.zip

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
Archive:  tomcat.zip
creating: apache-tomcat-8.5.81/
inflating: apache-tomcat-8.5.81/RELEASE-NOTES
creating: apache-tomcat-8.5.81/bin/
inflating: apache-tomcat-8.5.81/bin/digest.sh
inflating: apache-tomcat-8.5.81/bin/startup.bat
inflating: apache-tomcat-8.5.81/bin/catalina.bat
inflating: apache-tomcat-8.5.81/bin/tomcat-native.tar.gz
inflating: apache-tomcat-8.5.81/bin/version.bat
inflating: apache-tomcat-8.5.81/bin/setclasspath.bat

【部分运行结果略】

选项

zip的常用选项:

  • -r:递归压缩,即压缩目录。

unizp的常用选项:

  • -d 目录:指定解压后文件的存放目录

举例:

  1. 利用-r,压缩目录,示例代码:

    1
    zip -r tomcat.zip apache-tomcat-8.5.81

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    adding: apache-tomcat-8.5.81/ (stored 0%)
    adding: apache-tomcat-8.5.81/RELEASE-NOTES (deflated 60%)
    adding: apache-tomcat-8.5.81/bin/ (stored 0%)

    【部分运行结果略】

    adding: apache-tomcat-8.5.81/conf/server.xml (deflated 66%)
    adding: apache-tomcat-8.5.81/conf/tomcat-users.xsd (deflated 67%)
    adding: apache-tomcat-8.5.81/LICENSE (deflated 75%)
  2. 解压文件到指定目录,示例代码:

    1
    unzip -d tomcat_un tomcat.zip

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Archive:  tomcat.zip
    creating: tomcat_un/apache-tomcat-8.5.81/
    inflating: tomcat_un/apache-tomcat-8.5.81/RELEASE-NOTES
    creating: tomcat_un/apache-tomcat-8.5.81/bin/
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/digest.sh
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/startup.bat
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/catalina.bat
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/tomcat-native.tar.gz
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/version.bat

    【部分运行结果略】

    inflating: tomcat_un/apache-tomcat-8.5.81/conf/jaspic-providers.xml
    inflating: tomcat_un/apache-tomcat-8.5.81/conf/catalina.policy
    inflating: tomcat_un/apache-tomcat-8.5.81/conf/server.xml
    inflating: tomcat_un/apache-tomcat-8.5.81/conf/tomcat-users.xsd
    inflating: tomcat_un/apache-tomcat-8.5.81/LICENSE

    apache-tomcat-8.5.81tomcat_un的子文件夹,示例代码:

    1
    ll tomcat_un/

    运行结果:

    1
    drwxrwxr-x. 9 kaka kaka 4096 Jun 25 10:45 apache-tomcat-8.5.81

tar

tar,根据选项参数的不同,可以分别实现压缩和解压的功能。
常用选项:

  • -c生成.tar
  • -x解压.tar
  • -v显示详细信息
  • -z压缩
  • -f后面接着文件或目录(这也是为什么f必须在最后)。

常见用法:

  • 压缩:-cvzf
  • 解压:-xvzf

举例:

  1. 压缩多个文件,示例代码:

    1
    tar -cvzf a.tar A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt
  2. 压缩文件夹,示例代码:

    1
    tar -cvzf d.tar dir1/
  3. tar包解压到当前目录,示例代码:

    1
    tar -xvzf a.tar
  4. tar包解压到指定目录,示例代码:

    1
    tar -xvzf d.tar -C zhiDing/

    注意:

    • 需要基于参数-C
    • 指定解压到的那个目录,事先要存在,否则会报错。

用户、组和权限

用户管理

添加用户

命令:useradd
操作对象:用户名
常用选项:

  • -c,指定一段注释性描述。
  • -d,指定用户主目录(默认会在home目录下创建一个和用户名相同的目录)。
  • -g,添加用户时指定用户所属的用户组。

举例:

  1. 添加用户,示例代码:

    1
    useradd u1
  2. 给新创建的用户指定主目录,示例代码:

    1
    2
    useradd -d /home/uu/ u2 
    ll /home/

    运行结果:

    1
    2
    3
    4
    drwx------. 25 kaka kaka  4096 Jul  5 13:02 kaka
    drwx------. 2 root root 16384 Jun 23 07:41 lost+found
    drwx------. 2 u1 u1 4096 Jul 5 13:22 u1
    drwx------. 2 u2 u2 4096 Jul 5 13:24 uu
  3. 新增用户u1,同时指定组g1,示例代码:

    1
    useradd -g g1 u1

    在Linux中,每一个用户都必须有一个其所属的组。如果没有指定组,会自动会生成一个与用户名同名的工作组。

删除用户

userdel:删除用户。
操作对象:需要被删除的用户名。
参数:

  • -r:同时删除用户主目录,以及邮箱信息等。

举例:

  1. 删除用户u1,示例代码:
    1
    userdel u1
  2. 删除用户u2以及u2的主目录,示例代码:
    1
    userdel -r u2

有些资料建议删除用户的时候,不要加上-r,因为会把用户的主目录也删除。

我建议,加上-r,做好用户管理,不给以后留下"坑"。但在删除之前将用户目录中的内容备份。

修改用户

usermod,修改已有用户的信息。
操作对象:用户名
常用选项:

  • -c,指定一段注释性描述。
  • -d,指定用户主目录(默认会在home目录下创建一个和用户名相同的目录)。
  • -g,添加用户时指定用户所属的用户组。

修改用户u1ut组,示例代码:

1
usermod -g ut u1

密码管理

用户账号刚创建时没有密码,被系统锁定,无法使用,必须为其指定密码后才可以使用(此时由root用户指定密码)。

passwd指定用户密码或者修改用户密码。

操作对象:被修改密码的用户(如不写,则默认当前用户)。
常用选项:

  • -l:锁定密码,即禁用账号。
  • -u:密码解锁。
  • -d:删除密码,使账号无密码,也无法登录。
  • -f:强迫用户下次登录时修改密码。

输入密码

用户信息

  • whoami:查看当前系统当前账号的用户名。
  • who:查看当前所有登录系统的用户信息。
  • id:查询用户信息。

举例:

  1. 查看kaka用户的信息,示例代码:
    1
    id kaka
    运行结果:
    1
    uid=1000(kaka) gid=1000(kaka) groups=1000(kaka),10(wheel)
  2. 查询root用户的信息,示例代码:
    1
    id root
    运行结果:
    1
    uid=0(root) gid=0(root) groups=0(root)

切换用户

su:切换用户。
当需要返回到原来用户时,使用exit命令。

注意:从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。

还要一个命令sudo,临时权限提升,以root身份来执行之后的命令。与su的区别在于:

  • su是身份完全转变
  • sudo是普通用户临时转变成root用户来执行命令,该命令执行完,仍为普通用户。

增加组

groupadd:增加组。

示例代码:

1
groupadd g1

删除组

groupdel:删除组。
示例代码:

1
groupdel g1

修改组

groupmod:修改组。
常用选项:

  • -n:将用户组的名字改为新名字。

将组g1重命名为newG,示例代码:

1
groupmod -n newG g1

查看用户的组

groups:查看用户的组。
操作对象:用户名(默认查看当前用户的组)

举例:

  1. 查看当前用户所在的组,示例代码:
    1
    groups
    运行结果:
    1
    root
  2. 查看指定用户所在的组,示例代码:
    1
    groups u1
    运行结果:
    1
    u1 : u1

权限管理

访问者类型

如果要讨论权限,就必须先梳理清楚Linux中的访问者类型:

  1. 所有者
    默认是文件的创建者,谁创建了该文件,就是该文件的所有者。
  2. 所属组
    默认所有者所在的组,就是所属组。
  3. 其他
    除文件的所有者和所属组的用户外的其它用户.

权限

示例代码:

1
ll startup.sh

运行结果:

1
-rwxr-x---. 1 kaka kaka 1904 Jun  9 05:30 startup.sh

说明

我们重点讨论一下-rwxr-x---部分。

  • 第0位表示文件类型:
    • b:块设备,例如:硬盘。
    • c:字符设备,例如:键盘、鼠标、显示器等。
    • d:目录文件。
    • l:链接文件。
    • s:套接字文件,用于进程之间的通信。
    • -:普通文件。
  • 第1-3位表示所有者拥有该文件的权限。
  • 第4-6位表示所属组拥有该文件的权限。
  • 第7-9位表示其他用户拥有该文件的权限。

我们看到权限写的是rwx,解释一下:

  • r:read
    • 对文件而言,具有读取文件内容的权限。
    • 对目录来说,具有浏览该目录信息的权限。
  • w:write
    • 对文件而言,具有修改文件内容的权限。注意,是可以修改文件内容,不代表可以删除该文件,删除文件的条件是对该文件所在的目录有写权限。
    • 对目录来说具有删除、移动目录内文件的权限。
  • x:execute
    • 对文件而言,具有执行文件的权限。
    • 对目录来说,具有进入目录的权限。
  • -:不具有该权限。

在上例中,我们看到权限部分写的是-rwxr-x---

  • 第0位,-:普通文件。
  • 第1-3位,rwx:对于所有者,可读,可写,可执行。
  • 第4-6位,r-x:对于所属组,可读,可执行,不可写。
  • 第7-9位,---:对于其他,不可读,不可写,不可执行。

修改权限

只有文件的拥有者和root用户才可以修改文件的权限。

chmod,修改文件或者目录的权限。
常用选项:

  • -R:如果是目录,则使其下所有子文件或目录都生效。

有两种方式:

  1. 通过=+-
  2. 通过数字

通过=、+、-

规则:

  • u,所有者
  • g:所属组
  • o;其他
  • a:所有用户(ugo的总和)(默认为所有用户)

举例:

  1. 对于所有者赋予rwx,对于所属组赋予rx,对于其他用户赋予x。示例代码:
    1
    2
    chmod u=rwx,g=rx,o=x startup.sh 
    ll startup.sh
    运行结果:
    1
    -rwxr-x--x. 1 kaka kaka 1904 Jun  9 05:30 startup.sh
  2. 为所属组,增加w的权限。示例代码:
    1
    2
    chmod g+w startup.sh
    ll startup.sh
    运行结果:
    1
    -rwxrwx--x. 1 kaka kaka 1904 Jun  9 05:30 startup.sh
  3. 为所有人,去除x的权限。示例代码:
    1
    2
    chmod a-x startup.sh 
    ll startup.sh
    运行结果:
    1
    -rw-rw----. 1 kaka kaka 1904 Jun  9 05:30 startup.sh

通过数字变更权限

规则:

  • r=4
  • w=2
  • x=1

所以,有:

权限 数字
r 4
w 2
x 1
r w 6
r x 5
w x 3
r w x 7
- - - 0

chmod 751就相当于上文的chmod u=rwx,g=rx,o=x

示例代码:

1
2
chmod 777 startup.sh 
ll startup.sh

运行结果:

1
-rwxrwxrwx. 1 kaka kaka 1904 Jun  9 05:30 startup.sh

修改所有者

只有root用户才可以修改文件所有者。

chown,修改文件的所有者。
常用选项:

  • -R:如果是目录,则使其下所有子文件或目录都生效。

举例:

  1. 修改目录u1机器所有的子文件或目录,所有者为root
    查看原始的所有者,示例代码:
    1
    ll u1
    运行结果:
    1
    drwx------ 2 u1 u1 4096 Jul  7 14:32 u1
    修改所有者为root,示例代码:
    1
    2
    chown root -R u1
    ll
    运行结果:
    1
    drwx------ 2 root u1 4096 Jul  7 14:32 u1
  2. 修改所有者的同时,修改所属组。
    修改目录u1的所有者为uu,所属组为root。示例代码:
    1
    2
    chown uu:root u1
    ll
    运行结果:
    1
    drwx------ 2 uu root 4096 Jul  7 14:32 u1

修改所属组

chgrp,修改文件或目录的所属组
常用选项:

  • -R:如果是目录,则使其下所有子文件或目录都生效。

配置文件

最后,我们讨论三个配置文件:

  1. /etc/passwd
  2. /etc/shadow
  3. /etc/group

/etc/passwd,用户的配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

【部分内容略】

postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
kaka:x:1000:1000:Kaka Wan Yifan:/home/kaka:/bin/bash
u1:x:1001:1002::/home/u1:/bin/bash

含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

/etc/shadow,口令的配置文件,内容如下:

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
root:76SaZUF4ETOd.::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::

【部分内容略】

postfix:!!:19165::::::
oprofile:!!:19165::::::
tcpdump:!!:19165::::::
kaka:76SaZUF4ETOd.::0:99999:7:::
u1:!!:19179:0:99999:7:::

含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

/etc/group,组的配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

【部分内容略】

oprofile:x:16:
tcpdump:x:72:
kaka:x:1000:kaka
g1:x:1001:
ut:x:1002:

含义:组名:口令:组标识号:组内用户列表

定时任务

命令

crontab,时程表。
常用选项:

  • -u:指定用户的时程表,默认当前用户。
  • -e:编辑时程表
  • -l:查看时程表
  • -r:删除时程表

开始

步骤:

  1. 编辑时程表,crontab –e
  2. 添加如下内容:
    1
    * * * * * date >> /tmp/d.txt
  3. 保存并退出

我们可以通过tail -10f /tmp/d.log查看一下,每分钟都会执行一次。

1
2
3
4
5
tail -100f /tmp/d.log 
Thu Jul 7 21:53:01 CST 2022
Thu Jul 7 21:54:01 CST 2022
Thu Jul 7 21:55:01 CST 2022
Thu Jul 7 21:56:01 CST 2022

Linux中的cron

解释一下调度文件的* * * * *,从左到右,分别是:

  1. 分钟,取值[0,59][0,59]
  2. 小时,取值[0,23][0,23]
  3. 日期:取值[1,31][1,31]
  4. 月份:取值[1,12][1,12]
  5. 星期:取值[0,7][0,7]0077都代表星期天

还有一些特殊字符。

特殊字符 含义 示例
* 所有可能的值 在月域中,*表示每个月;在星期域中,*表示星期的每一天。
, 列出枚举值 在分钟域中,5,20表示分别在5分钟和20分钟触发一次。
- 范围 在分钟域中,5-20表示从5分钟到20分钟之间每隔一分钟触发一次。
/ 指定数值的增量 在分钟域中,0/15表示从第0分钟开始,每15分钟,3/20表示从第3分钟开始,每20分钟。

举例

  1. 每天6时0分,执行sh start.sh
    1
    0 6 * * * sh start.sh
  2. 在12月, 每天的6点12点,每隔3个小时,在0分钟执行一次/usr/bin/backup
    1
    0 6-12/3 * 12 * /usr/bin/backup
  3. 周一到周五每天17时,执行sh stop.sh
    1
    0 17 * * 1-5 sh stop.sh
  4. 每天的0时20分、2时20分、4时20分等,执行echo "haha"
    1
    20 0-23/2 * * * echo "haha"
  5. 每两个小时重启一次服务mysqld
    1
    0 */2 * * * systemctl restart mysqld.service
  6. 每天7时50分,开启ssh服务:
    1
    50 7 * * * /sbin/service sshd start
  7. 每天22时50分,关闭ssh服务:
    1
    50 22 * * * /sbin/service sshd stop
  8. 每小时的第一分执行ll
    1
    1 * * * * ll
  9. 每周一至周五3时,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的,可以用于定时清理日志。
    1
    00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;

注意!我们特别强调了,是在Linux中的cron,对于其他场景的cron,可能会不一样,比如"Quartz中的cron"。

关于"Quartz中的cron",可以参考《基于Java的后端开发入门:19.Quartz和APScheduler》

权限

一般任何用户都可以创建自己的计划任务。
但root用户可以通过配置来设置某些用户不允许设置计划任务,配置文件位于/etc/cron.deny,在该文件中写用户名,一行一个。

磁盘

du

du:查看文件和目录占用的磁盘空间。
操作对象:文件或目录,默认当前目录。
常用选项:

  • -h:以较易阅读的方式表示文件大小
  • -a:不仅查看子目录大小,还要包括文件
  • -c:显示所有的文件和子目录大小后,显示总和
  • -s:只显示总和

举例:

  1. 查看当前目录,示例代码:
    1
    du -sh
    运行结果:
    1
    108M
  2. 查看指定目录,示例代码:
    1
    du -sh apache-tomcat-8.5.81
    运行结果:
    1
    17M     apache-tomcat-8.5.81

ls -lh

除了du,还有一个命令也可以查看文件和目录占用的磁盘空间,ls -lh。但是在统计口径上,存在区别。ls -lh不会统计子目录的大小。

例如:

  1. du -sh,示例代码:
    示例代码:
    1
    du -sh
    运行结果:
    1
    108M    .
  2. ls -lh,示例代码:
    1
    ls -lh
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    total 36M
    4.0K -rw-rw-r--. 1 kaka kaka 2.7K Jul 3 09:08 111.txt
    4.0K -rw-rw-r--. 1 kaka kaka 439 Jul 4 13:23 123.txt
    4.0K -rw-rw-r--. 1 kaka kaka 430 Jul 4 13:23 -123.txt
    4.0K -rw-rw-r--. 1 kaka kaka 370 Jul 1 20:02 123.txt
    4.0K -rw-rw-r--. 1 kaka kaka 2.7K Jul 4 13:06 222.txt
    4.0K -rw-rw-r--. 1 kaka kaka 3.8K Jul 4 13:02 A New Day Has Come.txt
    4.0K drwxrwxr-x. 9 kaka kaka 4.0K Jun 25 10:45 apache-tomcat-8.5.81
    15M -rw-r--r--. 1 kaka kaka 15M Jun 25 10:44 apache-tomcat-8.5.81.tar

    【部分运行结果略】

df

df:查看磁盘空间使用情况。
常用选项:

  • -h: 以较易阅读的方式表示磁盘空间占用

示例代码:

1
df -h

运行结果:

1
2
3
4
5
6
7
8
9
10
Filesystem                    Size  Used Avail Use% Mounted on
devtmpfs 901M 0 901M 0% /dev
tmpfs 917M 0 917M 0% /dev/shm
tmpfs 917M 26M 892M 3% /run
tmpfs 917M 0 917M 0% /sys/fs/cgroup
/dev/mapper/VolGroup-lv_root 50G 5.1G 42G 11% /
/dev/sda1 477M 208M 241M 47% /boot
/dev/mapper/VolGroup-lv_home 12G 148M 11G 2% /home
iCloud 932G 598G 335G 65% /media/psf/iCloud
tmpfs 184M 48K 184M 1% /run/user/1000

解释说明:

  • Mounted on:/boot,这是引导分区。
    • 所属的文件系统是在/dev设备目录下。
  • Filesystem:tmpfs,基于内存的文件系统
    • Mounted on:/dev/shmshm的含义是Shared-Memory,共享内容。
    • Mounted on:/run:运行时
  • Filesystem:devtmpfs:Linux内核启动时候的挂载点

free

free,看内存的使用情况。
常用选项:

  • -h: 以较易阅读的方式表示磁盘空间占用

示例代码:

1
free -h

运行结果:

1
2
3
              total        used        free      shared  buff/cache   available
Mem: 1.8G 853M 285M 24M 694M 783M
Swap: 2.0G 3.0M 2.0G

lsblk

lsblk:查看设备挂载情况。
常用选项:

  • -f:查看详细的设备挂载情况。

示例代码:

1
lsblk

运行结果:

1
2
3
4
5
6
7
8
9
NAME                 MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda 8:0 0 64G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 63.5G 0 part
├─VolGroup-lv_root 253:0 0 50G 0 lvm /
├─VolGroup-lv_swap 253:1 0 2G 0 lvm [SWAP]
└─VolGroup-lv_home 253:2 0 11.6G 0 lvm /home
sr0 11:0 1 1024M 0 rom
sr1 11:1 1 1024M 0 rom

网络

ifconfig

ifconfig:显示所有网络接口的配置信息。

示例代码:

1
ifconfig

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.211.55.12 netmask 255.255.255.0 broadcast 10.211.55.255
inet6 fdb2:2c26:f4e4:0:21c:42ff:feeb:31ea prefixlen 64 scopeid 0x0<global>
inet6 fe80::21c:42ff:feeb:31ea prefixlen 64 scopeid 0x20<link>
ether 00:1c:42:eb:31:ea txqueuelen 1000 (Ethernet)
RX packets 43400 bytes 14363959 (13.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24286 bytes 4139577 (3.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2165 bytes 231262 (225.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2165 bytes 231262 (225.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:29:08:95 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

hosts

hosts文件位于/etc/hosts,我们可以通过VIM修改该文件。

有些资料说,重启网卡后才会生效,在我的实际测试中,修改后会立即成效。

ping

ping:测试主机之间网络连通性。

示例代码:

1
ping kakawanyifan.com

运行结果:

1
2
3
4
PING kakawanyifan.com (218.91.183.91) 56(84) bytes of data.
64 bytes from kakawanyifan.com (218.91.183.91): icmp_seq=1 ttl=128 time=13.3 ms
64 bytes from kakawanyifan.com (218.91.183.91): icmp_seq=2 ttl=128 time=16.7 ms
64 bytes from kakawanyifan.com (218.91.183.91): icmp_seq=3 ttl=128 time=28.5 ms

如果ping不通,不一定是网络问题,可能是目标机器禁ping了。

telnet

telnet:测试目标机器的端口是否开启。

举例:

  1. 测试kakawanyifan.com的443是否开启
    示例代码:
    1
    telnet kakawanyifan.com 443
    运行结果:
    1
    2
    3
    Trying 218.91.183.91...
    Connected to kakawanyifan.com.
    Escape character is '^]'.
    解释说明:Connected to kakawanyifan.com.,说明开启了。
  2. 测试kakawanyifan.com的3306是否开启
    示例代码:
    1
    telnet kakawanyifan.com 3306
    运行结果:
    1
    Trying 218.91.183.91...
    解释说明:一直在Trying 218.91.183.91...,说明没有开启。

telnet,一般需要我们额外安装,可以通过yum安装,方法如下:

1
yum install telnet telnet-server

curl

curl:发送网络请求,打印返回。

简单使用

示例代码:

1
curl kakawanyifan.com

运行结果:

1
2
3
4
5
6
7
8
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<h1>301 Moved Permanently</h1>
<p>The requested resource has been assigned a new permanent URI.</p>
<hr/>Powered by Tengine</body>
</html>

自动跳转

-L,自动跳转到新的网址。

示例代码:

1
curl -L kakawanyifan.com

查看头信息

-i,查看响应的头信息,也查看响应体。
-I,只查看响应的头信息。

举例:

  1. -i,示例代码:
    1
    curl -i kakawanyifan.com
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    HTTP/1.1 301 Moved Permanently
    Server: Tengine
    Date: Sat, 09 Jul 2022 14:21:14 GMT
    Content-Type: text/html
    Content-Length: 262
    Connection: keep-alive
    Location: https://kakawanyifan.com/
    Via: cache62.cn4056[,0]
    Timing-Allow-Origin: *
    EagleId: 088432ca16573764746903823e

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
    <head><title>301 Moved Permanently</title></head>
    <body>
    <h1>301 Moved Permanently</h1>
    <p>The requested resource has been assigned a new permanent URI.</p>
    <hr/>Powered by Tengine</body>
    </html>
  2. -I,示例代码:
    1
    curl -I kakawanyifan.com
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HTTP/1.1 301 Moved Permanently
    Server: Tengine
    Date: Sat, 09 Jul 2022 14:23:22 GMT
    Content-Type: text/html
    Content-Length: 262
    Connection: keep-alive
    Location: https://kakawanyifan.com/
    Via: cache65.cn4056[,0]
    Timing-Allow-Origin: *
    EagleId: 088432cd16573766029225411e

查看通信过程

-v,查看通信过程。

示例代码:

1
curl -v -L kakawanyifan.com

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
* About to connect() to kakawanyifan.com port 80 (#0)
* Trying 218.91.183.91...
* Connected to kakawanyifan.com (218.91.183.91) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: kakawanyifan.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: Tengine
< Date: Sat, 09 Jul 2022 14:29:22 GMT
< Content-Type: text/html
< Content-Length: 262
< Connection: keep-alive
< Location: https://kakawanyifan.com/
< Via: cache56.cn4056[,0]
< Timing-Allow-Origin: *
< EagleId: 088432c416573769621968097e
<
* Ignoring the response-body
* Connection #0 to host kakawanyifan.com left intact
* Issue another request to this URL: 'https://kakawanyifan.com/'
* Found bundle for host kakawanyifan.com: 0x1aafee0
* About to connect() to kakawanyifan.com port 443 (#1)
* Trying 218.91.183.91...
* Connected to kakawanyifan.com (218.91.183.91) port 443 (#1)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=kakawanyifan.com
* start date: Mar 13 00:00:00 2022 GMT
* expire date: Mar 14 23:59:59 2023 GMT
* common name: kakawanyifan.com
* issuer: CN=Encryption Everywhere DV TLS CA - G1,OU=www.digicert.com,O=DigiCert Inc,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: kakawanyifan.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Tengine
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Strict-Transport-Security: max-age=5184000
< Date: Sat, 09 Jul 2022 14:17:14 GMT
< Vary: Accept-Encoding
< x-oss-request-id: 62C98DEA8E9753363080AD93
< x-oss-cdn-auth: success
< ETag: "0036CC5761D566E799858B57C3A5DADF"
< Last-Modified: Sat, 09 Jul 2022 11:11:57 GMT
< x-oss-object-type: Normal
< x-oss-hash-crc64ecma: 6015530141356455589
< x-oss-storage-class: Standard
< Content-MD5: ADbMV2HVZueZhYtXw6Xa3w==
< x-oss-server-time: 68
< Ali-Swift-Global-Savetime: 1657376234
< Via: cache24.l2et15-1[133,134,200-0,M], cache26.l2et15-1[135,0], cache27.cn4056[0,0,200-0,H], cache69.cn4056[3,0]
< Age: 728
< X-Cache: HIT TCP_MEM_HIT dirn:0:985810031
< X-Swift-SaveTime: Sat, 09 Jul 2022 14:17:14 GMT
< X-Swift-CacheTime: 1111
< Timing-Allow-Origin: *
< EagleId: 088432d116573769624151871e

【部分运行结果略】

解释说明:在收到301的响应码之后,立即发起了新的请求,即在客户端完成了重定向。

发送表单信息

发送表单信息,需要依赖两个参数:

  • -X,设置HTTP动词,默认是GET。
  • --date,设置表单内容。

示例代码:

1
curl -X POST http://localhost:8080/web_demo_war/request --data 'ch=中文'

发送二进制文件

--data-binary,表明是二进制文件。

示例代码:

1
curl - X POST 'http://localhost:8080/web_demo_war/request' --data-binary '@/Users/kaka/Downloads/jpg.jpg'

--cookie:设置cookie。

例如:--cookie "name=xxx"

--header,设置头信息。

例如:--header "Content-Type:application/json"

进程

ps

ps:查看进程状态。
该命令有两种风格的选项:一种是上文的"UNIX/LINUX"风格,带有-的;还有一种是BSD风格的,不带-

常用选项:

  • -e,列出所有进程。
  • -f,显示完整格式的进程列表。

BSD风格的选项:

  • a,列出带有终端的所有用户的进程。
  • x,列出当前用户的所有进程,包括没有终端的进程。
  • u,面向用户友好的显示风格。

举例:

  1. ps -ef,示例代码:

    1
    ps -ef

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UID        PID  PPID  C STIME TTY          TIME CMD
    root 1 0 0 00:43 ? 00:00:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root 2 0 0 00:43 ? 00:00:00 [kthreadd]
    root 4 2 0 00:43 ? 00:00:00 [kworker/0:0H]

    【部分运行结果略】

    root 31816 2 0 08:03 ? 00:00:00 [kworker/0:0]
    root 31836 1036 0 08:03 ? 00:00:00 sleep 60
    kaka 32009 29922 0 08:04 pts/0 00:00:00 ps -ef

    解释说明:

    • UID,用户ID
    • PID,进程ID
    • PPID,父进程ID
    • C,CPU用于计算执行优先级的因子,数值越小越优先。数值大,说明进程是CPU密集型运算,执行优先级会降低;数值小,说明进程是I/O密集型运算,执行优先级会提高
    • STIME:进程启动的时间
    • TTY:完整的终端名称。在CentOS中:
      • tty1是图形化终端
      • tty2-tty6是本地的字符界面终端
      • pts/0-255是远程终端
    • TIME:CPU时间
    • CMD:启动进程所用的命令和参数
  2. 在实际中,常和grep配合使用,用于快速找到相关进程。
    示例代码:

    1
    ps -ef|grep tomcat

    运行结果:

    1
    2
    kaka      4738     1  0 00:49 ?        00:01:14 /usr/bin/java -Djava.util.logging.config.file=/home/kaka/apache-tomcat-8.5.81/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/kaka/apache-tomcat-8.5.81/bin/bootstrap.jar:/home/kaka/apache-tomcat-8.5.81/bin/tomcat-juli.jar -Dcatalina.base=/home/kaka/apache-tomcat-8.5.81 -Dcatalina.home=/home/kaka/apache-tomcat-8.5.81 -Djava.io.tmpdir=/home/kaka/apache-tomcat-8.5.81/temp org.apache.catalina.startup.Bootstrap start
    kaka 5696 5616 0 08:31 pts/0 00:00:00 grep --color=auto tomcat
  3. ps axu,示例代码:

    1
    ps axu

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root 1 0.0 0.3 128824 7460 ? Ss 00:43 0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root 2 0.0 0.0 0 0 ? S 00:43 0:00 [kthreadd]
    root 4 0.0 0.0 0 0 ? S< 00:43 0:00 [kworker/0:0H]

    【部分运行结果略】

    root 31328 0.0 0.0 0 0 ? S 08:01 0:00 [kworker/u64:0]
    root 31816 0.0 0.0 0 0 ? S 08:03 0:00 [kworker/0:0]
    root 32353 0.0 0.0 0 0 ? S 08:06 0:00 [kworker/u64:1]

    解释说明:

    • USER,该进程是由哪个用户产生的
    • PID,进程的ID号
    • %CPU,该进程占用CPU资源的百分比
    • %MEM,该进程占用物理内存的百分比
    • VSZ:该进程占用虚拟内存的大小,单位KB
    • RSS:该进程占用实际物理内存的大小,单位KB
    • TTY:该进程是在哪个终端中运行的。
    • STAT:进程状态。常见的状态有:R运行状态、S睡眠状态、T暂停状态、Z僵尸状态、s包含子进程、l多线程、+前台显示
    • START:该进程的启动时间
    • TIME:该进程占用CPU的运算时间
    • COMMAND:产生此进程的命令名

kill、killall

kill:根据进程号杀死进程。
操作对象:进程号
常用选项:

  • -9,强迫进程立即停止。

killall:根据进程名称杀死进程,支持通配符(在系统因负载过大而变得很慢时有用)
操作对象:进程名
常用选项:

  • -9,强迫进程立即停止。

举例,踢掉某个非法登录用户,步骤如下:

  1. 找到相关进程,示例代码:
    1
    ps -ef|grep sshd
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    root      1830     1  0 12:47 ?        00:00:00 /usr/sbin/sshd -D
    root 5559 1830 0 20:33 ? 00:00:00 sshd: kaka [priv]
    kaka 5614 5559 0 20:34 ? 00:00:00 sshd: kaka@pts/0
    root 7842 1830 0 20:39 ? 00:00:00 sshd: kaka [priv]
    kaka 7900 7842 0 20:40 ? 00:00:00 sshd: kaka@pts/1
    root 7983 1830 0 20:40 ? 00:00:00 sshd: kaka [priv]
    kaka 8061 7983 0 20:40 ? 00:00:00 sshd: kaka@pts/2
    root 8262 8167 0 20:41 pts/1 00:00:00 grep --color=auto sshd
  2. 假设kaka@pts/2是非法登录,KILL相关进程,示例代码:
    1
    kill 8061

pstree

pstree,查看进程树。
常用选项:

  • -p,显示进程的PID
  • -u,显示进程的所属用户

示例代码:

1
pstree -p

运行结果:

1
2
3
4
5
6
7
8
9
10
11
systemd(1)─┬─NetworkManager(1168)─┬─dhclient(7395)
│ ├─{NetworkManager}(1184)
│ └─{NetworkManager}(1188)
├─abrt-watch-log(974)
├─abrt-watch-log(985)
├─abrtd(961)
├─accounts-daemon(948)─┬─{accounts-daemon}(952)
│ └─{accounts-daemon}(960)
├─at-spi-bus-laun(3092)─┬─dbus-daemon(3097)───{dbus-daemon}(3098)

【部分运行结果略】

top

top,实时监控系统进程状态(动态显示)。

示例代码:

1
top

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
top - 20:54:39 up  8:06,  3 users,  load average: 0.14, 0.06, 0.06
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 1.0 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1877316 total, 347176 free, 802392 used, 727748 buff/cache
KiB Swap: 2064380 total, 2064380 free, 0 used. 908552 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1899 root 20 0 293428 37308 5368 S 1.3 2.0 5:35.54 X
3477 kaka 20 0 820056 16328 9248 S 1.0 0.9 5:06.70 prlcc
1303 root 20 0 313820 604 440 S 0.3 0.0 0:12.41 prltoolsd
1832 root 20 0 202724 5284 3640 S 0.3 0.3 0:34.22 cupsd
1834 root 20 0 583956 19768 6712 S 0.3 1.1 0:05.25 tuned
3340 kaka 20 0 799244 17584 9640 S 0.3 0.9 0:05.24 gsd-color
1 root 20 0 128824 7460 4216 S 0.0 0.4 0:07.56 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.19 ksoftirqd/0

【部分运行结果略】

解释说明:

  • PID,进程ID
  • USER,该进程对应的用户
  • PR,优先级
  • VIRT,虚拟内存
  • RES,常驻内存
  • SHR,共享内存
  • S,进程的状态
  • %CPU,表示CPU的占用百分比
  • %MEM,表示内存的占用百分比
  • TIME+,执行的时间
  • COMMAND,进程的名称或者路径;

常用选项:

  • -d,后接秒数,指定每隔几秒更新(默认3秒)
  • -i,不显示任何闲置或者僵死进程。
  • -p,后接进程PID,监控指定的进程。

常用操作:

  • P,以CPU使用率排序(默认)
  • M,以内存的使用率排序
  • N,以PID排序
  • q,退出

netstat

netstat:显示网络状态和端口占用信息。

常用选项:

  • -a,查看所有正在监听和未监听的套接字(socket)
  • -n,不显示别名,能显示数字的全部转化成数字
  • -l,仅列出在监听的服务状态
  • -p,查看在调用的进程

常见用法:

  • netstat -anp | grep 进程号:查看该进程网络信息
  • netstat –nlp | grep 端口号:查看网络端口号占用情况

举例:

  1. 查看某个进程的网络信息。
    我们先找到相关进程(Tomcat),示例代码:

    1
    ps -ef|grep tomcat

    运行结果:

    1
    2
    kaka      4738     1  0 01:05 ?        00:01:22 /usr/bin/java -Djava.util.logging.config.file=/home/kaka/apache-tomcat-8.5.81/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/kaka/apache-tomcat-8.5.81/bin/bootstrap.jar:/home/kaka/apache-tomcat-8.5.81/bin/tomcat-juli.jar -Dcatalina.base=/home/kaka/apache-tomcat-8.5.81 -Dcatalina.home=/home/kaka/apache-tomcat-8.5.81 -Djava.io.tmpdir=/home/kaka/apache-tomcat-8.5.81/temp org.apache.catalina.startup.Bootstrap start
    kaka 17783 16432 0 09:35 pts/1 00:00:00 grep --color=auto tomcat

    查看该进程的网络信息,示例代码:

    1
    netstat -anp|grep 4738

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    (Not all processes could be identified, non-owned process info
    will not be shown, you would have to be root to see it all.)
    tcp6 0 0 127.0.0.1:8005 :::* LISTEN 4738/java
    tcp6 0 0 :::8080 :::* LISTEN 4738/java
    unix 3 [ ] STREAM CONNECTED 473836 3129/gnome-shell
    unix 2 [ ] STREAM CONNECTED 42120 4738/java
    unix 3 [ ] STREAM CONNECTED 473837 3158/ibus-daemon @/tmp/dbus-WsHjRWKu
    unix 2 [ ] STREAM CONNECTED 42123 4738/java
  2. 查看网络端口号占用情况,示例代码:

    1
    netstat -nlp|grep 8080

    运行结果:

    1
    2
    3
    (Not all processes could be identified, non-owned process info
    will not be shown, you would have to be root to see it all.)
    tcp6 0 0 :::8080 :::* LISTEN 4738/java

    查看相关进程

    1
    ls -lt /proc/4738
    • ls -lt /proc/4738,这个命令也印证了一切皆文件。

服务

区别

一个正在执行的程序或命令,被称为进程(process)。
启动之后一直存在,常驻内存的进程,被称作服务(service)。即服务是特殊的,生命周期很长的,特殊进程。

systemctl服务管理

启动服务、停止服务、重启服务和查看服务状态:

1
systemctl start | stop | restart | status 服务名

举例:

  1. 查看防火墙服务的状态,示例代码:
    1
    systemctl status firewalld
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ● firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
    Active: active (running) since Sun 2022-07-10 07:29:22 CST; 6 days ago
    Docs: man:firewalld(1)
    Main PID: 1027 (firewalld)
    Tasks: 2
    CGroup: /system.slice/firewalld.service
    └─1027 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

    Jul 10 07:29:22 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
    Jul 10 07:29:22 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
    Jul 10 07:29:22 localhost.localdomain firewalld[1027]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please c...bling it now.
    Hint: Some lines were ellipsized, use -l to show in full.
  2. 停止防火墙服务,示例代码:
    1
    systemctl stop firewalld
  3. 启动防火墙服务,示例代码:
    1
    systemctl start firewalld
  4. 重启防火墙服务,示例代码:
    1
    systemctl restart firewalld

特别的,我们可以通过/usr/lib/systemd/system,查看系统的服务(非所有)。示例代码:

1
ls /usr/lib/systemd/system

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
abrt-ccpp.service                        firewalld.service                      multi-user.target.wants             rhel-import-state.service                      systemd-fsck-root.service
abrtd.service firstboot-graphical.service ndctl-monitor.service rhel-loadmodules.service systemd-fsck@.service
abrt-oops.service flatpak-system-helper.service netcf-transaction.service rhel-readonly.service systemd-halt.service
abrt-pstoreoops.service fprintd.service NetworkManager-dispatcher.service rngd.service systemd-hibernate-resume@.service
abrt-vmcore.service fstrim.service NetworkManager.service rpcbind.service systemd-hibernate.service

【部分运行结果略】

ebtables.service mdmon@.service rhel-autorelabel-mark.service systemd-ask-password-wall.service virtlogd.socket
emergency.service messagebus.service rhel-autorelabel.service systemd-backlight@.service virt-who.service
emergency.target microcode.service rhel-configure.service systemd-binfmt.service wacom-inputattach@.service
fcoe.service multipathd.service rhel-dmesg.service systemd-bootchart.service wpa_supplicant.service
final.target multi-user.target rhel-domainname.service systemd-firstboot.service zram.service

解释说明:.service,服务;.target,一组服务的集合。

systemctl设置服务自启

常见用法:

  • systemctl is-enabled 服务名,查看某一个服务的开机启动状态
  • systemctl disable 服务名,关闭指定服务的自动启动
  • systemctl enable 服务名,开启指定服务的自动启动
  • systemctl list-unit-files,查看所有服务的开机启动状态

举例:

  1. 查看防火墙服务的开机启动状态,示例代码:
    1
    systemctl is-enabled firewalld
    运行结果:
    1
    enabled
  2. 关闭防火墙服务的开机启动,示例代码:
    1
    systemctl disable firewalld
  3. 开启防火墙服务的开机启动,示例代码:
    1
    systemctl enable firewalld
  4. 查看所有服务的开机启动状态,示例代码:
    1
    systemctl list-unit-files
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    UNIT FILE                                     STATE   
    proc-sys-fs-binfmt_misc.automount static
    dev-hugepages.mount static
    dev-mqueue.mount static
    proc-fs-nfsd.mount static
    proc-sys-fs-binfmt_misc.mount static
    sys-fs-fuse-connections.mount static
    sys-kernel-config.mount static
    sys-kernel-debug.mount static
    tmp.mount disabled
    var-lib-nfs-rpc_pipefs.mount static
    brandbot.path disabled
    cups.path enabled
    systemd-ask-password-console.path static
    systemd-ask-password-plymouth.path static
    systemd-ask-password-wall.path static
    session-1.scope static
    session-4.scope static
    session-728.scope static
    abrt-ccpp.service enabled
    abrt-oops.service enabled

    【部分运行结果略】
  5. 查看网络服务的开机启动状态,示例代码:
    1
    systemctl is-enabled network
    运行结果:
    1
    2
    3
    network.service is not a native service, redirecting to /sbin/chkconfig.
    Executing /sbin/chkconfig network --level=5
    enabled

在CentOS-6中

在CentOS-6中,有所不同。

service服务管理

CentOS-6中,是以service进行服务管理。

启动服务、停止服务、重启服务和查看服务状态:

1
service 服务名 start | stop | restart | status

注意,在这里是先写服务名,再写具体的操作。而在systemctl中,是先写具体的操作,再写服务名。

举例:

  1. 查看网络服务的状态,示例代码:
    1
    service network status
    运行结果:
    1
    2
    3
    4
    Configured devices:
    lo eth0
    Currently active devices:
    lo eth0 virbr0
  2. 停止网络服务,示例代码:
    1
    service network stop
  3. 启动网络服务,示例代码:
    1
    service network start
  4. 重启网络服务,示例代码:
    1
    service network restart

我们可以和systemctl的比较一下,systemctl的内容更多。

示例代码

1
systemctl status network

运行结果:

1
2
3
4
5
6
7
8
9
10
11
● network.service - LSB: Bring up/down networking
Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
Active: active (exited) since Sat 2022-07-16 14:43:35 CST; 26min ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0

Jul 16 14:43:34 localhost.localdomain systemd[1]: Starting LSB: Bring up/down networking...
Jul 16 14:43:34 localhost.localdomain network[27641]: Bringing up loopback interface: [ OK ]
Jul 16 14:43:35 localhost.localdomain network[27641]: Bringing up interface eth0: Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)
Jul 16 14:43:35 localhost.localdomain network[27641]: [ OK ]
Jul 16 14:43:35 centos-linux.shared systemd[1]: Started LSB: Bring up/down networking.

chkconfig-设置服务自启

CentOS-6中,是chkconfig设置服务自启的。

常见用法:

  • chkconfig,查看所有服务器自启配置
  • chkconfig 服务名 off,关掉指定服务的自动启动
  • chkconfig 服务名 on,开启指定服务的自动启动
  • chkconfig 服务名 --list,查看服务开机启动状态

其实也有图形化的方式,设置启动项,setup命令。

示例代码:

1
setup

setup

系统运行级别

运行级别,其实这个在Windows中也有,例如:安全模式、带网络的安全模式等。

在Linux中,运行级别有七种:

  • 0:停机
  • 1:单用户(root权限,不能远程操作,所以只能在机房里)
  • 2:多用户,没有网络服务
  • 3:多用户,有网络服务
  • 4:保留级别
  • 5:图形界面
  • 6:重启

所以,默认的运行级别,不能设置为06

最常用的级别是35
在CentOS中,为35,设置了专用的名称。

  • multi-user.target,3。
  • graphical.target,5。

举例:

  1. 查看当前的运行级别,示例代码:
    1
    systemctl get-default
    运行结果:
    1
    graphical.target
  2. 修改当前的运行级别,示例代码:
    1
    systemctl set-default multi-user.target
    运行结果:
    1
    2
    Removed symlink /etc/systemd/system/default.target.
    Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.

关机重启

shutdown:关机。
常用参数:

  • -r,重启。
  • 数字,表示多少分钟之后关机。
  • now,立即关机。

reboot:立即重启,等同于shutdown -r now

logout:注销。

sync:把内存的数据同步到磁盘。

Linux为了提高磁盘的读写效率,对磁盘采取了"预读迟写"操作方式。当用户保存文件时,Linux并不一定立即将保存数据写入物理磁盘中,而是将数据保存在缓冲区中,等缓冲区满时再写入磁盘,这种方式可以极大的提高磁盘写入数据的效率。但是,也带来了安全隐患,如果数据还未写入磁盘时,系统掉电或者其他严重问题出现,将导致数据丢失。使用sync可以立即将缓冲区的数据写入磁盘。

(关于该部分,我们在《MySQL从入门到实践:6.事务》redo-log刷盘策略部分也有讨论。)

软件包

RPM

概述

RPM,RedHat Package Manager,红帽软件包管理。

RPM包的名称格式,例如Apache-1.3.23-11.i386.rpm

  • Apache,软件名称
  • 1.3.23-11,软件的版本号
  • i386,软件所运行的硬件平台,i386指的是Intel32位处理器
  • rpm,文件扩展名,代表RPM包

查看是否安装过

常用选项:

  • -q,查询
  • -a,所有
  • -i,详细信息

常见用法:

  • rpm -qa | grep 关键词,查询所安装的所有rpm软件包。
  • rpm -qi 软件包,查询某个软件包的详细信息

举例:

  1. 查询名称有Java的软件包,示例代码:
    1
    rpm -qa | grep java
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    python-javapackages-3.4.1-11.el7.noarch
    javassist-3.16.1-10.el7.noarch
    javamail-1.4.6-8.el7.noarch
    java-1.8.0-openjdk-headless-1.8.0.332.b09-1.el7_9.x86_64
    java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64
    javapackages-tools-3.4.1-11.el7.noarch
    java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
    tzdata-java-2022a-1.el7.noarch
    java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
  2. 查看某个软件包的详细安装信息,示例代码:
    1
    rpm -qi java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Name        : java-1.8.0-openjdk
    Epoch : 1
    Version : 1.8.0.332.b09
    Release : 1.el7_9
    Architecture: x86_64
    Install Date: Sat 02 Jul 2022 11:27:22 PM CST
    Group : Development/Languages
    Size : 661711
    License : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib
    Signature : RSA/SHA256, Thu 12 May 2022 09:37:45 PM CST, Key ID 24c6a8a7f4a80eb5
    Source RPM : java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.src.rpm
    Build Date : Tue 10 May 2022 10:45:38 PM CST
    Build Host : x86-02.bsys.centos.org
    Relocations : (not relocatable)
    Packager : CentOS BuildSystem <http://bugs.centos.org>
    Vendor : CentOS
    URL : http://openjdk.java.net/
    Summary : OpenJDK 8 Runtime Environment
    Description :
    The OpenJDK 8 runtime environment.

安装

常用选项:

  • -i,安装
  • -v,显示详细信息
  • -h,进度条
  • --nodeps,安装前不检查依赖

常见用法:rpm -ivh

卸载

常用选项:

  • -e,卸载
  • --nodeps,卸载软件时,不检查依赖。

YUM

概述

YUM,Yellow dog Updater,Modified,软件包管理器,基于RPM,能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖性关系。类似于Java中的maven。

语法

1
yum 选项 参数

常用选项

  • -y,对所有提问都回答"yes"。

常见参数

  • install,安装rpm软件包
  • update,更新rpm软件包
  • check-update,检查是否有更新的rpm软件包
  • remove,删除指定的rpm软件包
  • list,显示软件包信息
  • clean,清理过期的缓存
  • deplist,显示软件包的所有依赖关系

更多软件的安装

关于更多软件的安装方法,散落在其他文章中。

  1. JDK:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
  2. Tomcat:参考《基于Java的后端开发入门:13.Servlet、Filter和Listener》
  3. MySQL:参考《MySQL从入门到实践:1.概述和工具准备》
  4. ElasticSearch:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
  5. Kibana:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
  6. DataX:参考《离线数据同步工具DataX快速入门:1.操作方法》
  7. Zookeeper:参考《基于Java的后端开发入门:19.Dubbo和Zookeeper》
  8. Kafka:参考《分布式事件流平台Kafka:1.初步认识》
  9. Kafka-Eagle:参考《分布式事件流平台Kafka:5.监控和调优》
  10. Node.js:参考《基于JavaScript的前端开发入门:3.Node.js》
  11. Nginx:参考《NGINX入门与提高:1.安装、基础操作和配置》

更多的软件的安装方法,不再列举。

问题

在有些时候,我们安装软件会出现如下的报错:

1
2
3
4
5
Failed to set locale, defaulting to C
error: rpmdb: BDB0113 Thread/process 29534/140369042343168 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 - (-30973)
error: cannot open Packages database in /var/lib/rpm

这个原因是因为yum命令有非正常的停止(被kill或其他原因)。
解决办法为重新构建。示例代码:

1
2
3
4
5
cd /var/lib/rpm
rm __db.* -rf #删除所有rpm库
rpm --rebuilddb #rpm的重新构建命令
yum clean all #用yum clean all清除
yum makecache #重新生成yum缓存

后台运行

引例

假设现在存在一个Java程序,每隔一秒钟,打印当前时间。示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
package com.kakawanyifan;

import java.time.Instant;

public class main {
public static void main(String[] args) throws InterruptedException {
while (true){
System.out.println(Instant.now());
Thread.sleep(1000);
}
}
}

我们将其打成Jar包,并在服务器上执行。

示例代码:

1
java -jar testJ.jar

运行结果:

1
2
3
4
5
6
7
2022-07-23T09:01:42.883Z
2022-07-23T09:01:43.971Z
2022-07-23T09:01:44.972Z
2022-07-23T09:01:45.974Z
2022-07-23T09:01:46.976Z

【部分运行结果略】

服务器上会一直输出内容,那么有没有办法让程序在后台运行,不输出内容呢?

& 后台运行

在命令之后加个&就可以了,在后台运行了。

示例代码:

1
java -jar testJ.jar &

运行结果:

1
2
3
4
5
2022-07-23T09:08:23.951Z
2022-07-23T09:08:24.954Z
2022-07-23T09:08:25.954Z
2022-07-23T09:08:26.956Z
2022-07-23T09:08:27.957Z

但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但依然不停的输出到当前终端。因此,还应将log重定向到指定的文件。示例代码:

1
java -jar testJ.jar >> out.txt 2>&1 &

解释说明:2>&1是指将标准错误重定向到标准输出,于是标准错误和标准输出都重定向到指定的out.txt文件。

那现在程序在后台运行了,我们怎么找到它呢?
两种方法:

  1. jobs,查看当前有多少在后台运行,例如jobs -l
  2. ps

nohup 不挂起

在命令的末尾加个&符号后,程序可以在后台运行,但是一旦当前终端关闭(即退出当前帐户),该程序就会停止运行。
那假如说我们想要退出当前终端,但又想让程序在后台运行,该如何处理呢?

可以使用nohup,no hang up,不挂起,示例代码:

1
nohup java -jar testJ.jar &

这样程序既在后台运行,又不会挂起。但是程序的输出会默认重定向到nohup.out文件下。如果我们想要输出到指定文件,可另外指定输出文件:

1
nohup java -jar testJ.jar > myout.txt 2>&1 &

jar包的步骤:

  1. 点击Open Module Settings
    Open Module Settings
  2. 依次点击ArtifactsJARFrom modules with dependencies
    Artifacts JAR From modules with dependencies
  3. 注意此处,是src目录,而非src的下级目录
    src
  4. 如有引入外部的JAR包,还需要在此处lib目录,并将外部的包拖入该目录
    lib
  5. 依次点击BuildBuild Artifacts,打包。
    build
文章作者: Kaka Wan Yifan
文章链接: https://kakawanyifan.com/11002
版权声明: 本博客所有文章版权为文章作者所有,未经书面许可,任何机构和个人不得以任何形式转载、摘编或复制。

评论区