系统管理

接着我们来查看一些系统管理相关的命令,比如我们Windows中的任务管理器,我们可以使用top命令来打开:

复制代码
top - 10:48:46 up  5:52,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 191 total,   2 running, 189 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3919.1 total,   2704.2 free,    215.0 used,    999.9 buff/cache
MiB Swap:   3923.0 total,   3923.0 free,      0.0 used.   3521.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                       
  10528 test      20   0    8944   3072   2652 R   0.7   0.1   0:00.07 top                           
   9847 root      20   0       0      0      0 I   0.3   0.0   0:00.87 kworker/0:0-events            
      1 root      20   0  102760  10456   7120 S   0.0   0.3   0:02.02 systemd                       
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd                      
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                        
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                    
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-kblockd          
      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq                  
      9 root      20   0       0      0      0 S   0.0   0.0   0:00.15 ksoftirqd/0                   
     10 root      20   0       0      0      0 R   0.0   0.0   0:01.49 rcu_sched                     
     11 root      rt   0       0      0      0 S   0.0   0.0   0:00.24 migration/0                   
     12 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0                 
     14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0                       
     15 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1                       
     16 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/1                 
     17 root      rt   0       0      0      0 S   0.0   0.0   0:00.30 migration/1                   
     18 root      20   0       0      0      0 S   0.0   0.0   0:00.07 ksoftirqd/1                   
     20 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-kblockd  

可以很清楚地看到当前CPU的使用情况以及内存的占用情况。

按下数字键1,可以展示所有CPU核心的使用情况:

复制代码
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

按下f键可以设置以哪一列进行排序或是显示那些参数:

复制代码
Fields Management for window 1:Def, whose current sort field is %MEM
   Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
   'd' or <Space> toggles display, 's' sets sort.  Use 'q' or <Esc> to end!

按下q键即可退出监控界面。

我们可以直接输入free命令来查看当前系统的内存使用情况:

复制代码
test@ubuntu-server:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3919         212        2706           1         999        3523
Swap:          3922           0        3922

其中-m表示以M为单位,也可以-g表示以G为单位,默认是kb为单位。

最后就是磁盘容量,我们可以使用lsblk来查看所有块设备的信息,其中就包括我们的硬盘、光驱等:

复制代码
test@ubuntu-server:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0                       7:0    0 48.9M  1 loop /snap/core18/2127
loop1                       7:1    0 28.1M  1 loop /snap/snapd/12707
loop2                       7:2    0   62M  1 loop /snap/lxd/21032
sr0                        11:0    1 1024M  0 rom  
nvme0n1                   259:0    0   20G  0 disk 
├─nvme0n1p1               259:1    0  512M  0 part /boot/efi
├─nvme0n1p2               259:2    0    1G  0 part /boot
└─nvme0n1p3               259:3    0 18.5G  0 part 
  └─ubuntu--vg-ubuntu--lv 253:0    0 18.5G  0 lvm  /

可以看到nvme开头的就是我们的硬盘(这个因人而异,可能你们的是sda,磁盘类型不同名称就不同)可以看到nvme0n1 容量为20G,并且512M用作存放EFI文件,1G存放启动文件,剩余容量就是存放系统文件和我们的用户目录。

这里要提到一个挂载的概念:

挂载,指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。

比如我们的主硬盘,挂载点就被设定为/根目录,而我们所有保存的文件都会存储在硬盘中,如果你有U盘(最好将U盘的文件格式改为ExFat,可以直接在Windows中进行格式化,然后随便放入一些文件即可)之类的东西,我们可以演示一下对U盘进行挂载:

sh 复制代码
test@ubuntu-server:~$ sudo fdisk -l
...
Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors
Disk model: USB DISK        
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4a416279

Device     Boot     Start       End   Sectors  Size Id Type
/dev/sda1  *       614400 125214719 124600320 59.4G  7 HPFS/NTFS/exFAT
/dev/sda2       125214720 125825022    610303  298M  6 FAT16

将U盘插入电脑,选择连接到Linux,输入sudo fdisk -l命令来查看硬盘实体情况,可以看到有一个USB DISK设备,注意观察一下是不是和自己的U盘容量一致,可以看到设备名称为/dev/sda1。

接着我们设备挂载到一个目录下:

sh 复制代码
test@ubuntu-server:~$ mkdir u-test
test@ubuntu-server:~$ sudo mount /dev/sda1 u-test/
test@ubuntu-server:~$ cd u-test/
test@ubuntu-server:~/u-test$ ls
 CGI
 cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24.iso
 cn_windows_7_professional_x64_dvd_x15-65791.iso
 cn_windows_8.1_enterprise_with_update_x64_dvd_6050374.iso
 cn_windows_8.1_professional_vl_with_update_x64_dvd_4050293.iso
 cn_windows_server_2019_updated_july_2020_x64_dvd_2c9b67da.iso
'System Volume Information'
 zh-cn_windows_10_consumer_editions_version_21h1_updated_sep_2021_x64_dvd_991b822f.iso
 zh-cn_windows_11_consumer_editions_x64_dvd_904f13e4.iso

最后进入到此目录中,就能看到你U盘中的文件了,如果你不想使用U盘了,可以直接取消挂载:

复制代码
test@ubuntu-server:~/u-test$ cd ..
test@ubuntu-server:~$ sudo umount /dev/sda1

最后我们可以通过df命令查看当前磁盘使用情况:

复制代码
test@ubuntu-server:~$ df -m
Filesystem                        1M-blocks  Used Available Use% Mounted on
udev                                   1900     0      1900   0% /dev
tmpfs                                   392     2       391   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv     18515  6544     11009  38% /
tmpfs                                  1960     0      1960   0% /dev/shm
tmpfs                                     5     0         5   0% /run/lock
tmpfs                                  1960     0      1960   0% /sys/fs/cgroup
/dev/nvme0n1p2                          976   109       800  12% /boot
/dev/nvme0n1p1                          511     4       508   1% /boot/efi
/dev/loop0                               49    49         0 100% /snap/core18/2127
/dev/loop1                               29    29         0 100% /snap/snapd/12707
/dev/loop2                               62    62         0 100% /snap/lxd/21032
tmpfs                                   392     0       392   0% /run/user/1000

输入ps可以查看当前运行的一些进程,其实和top有点类似,但是没有监控功能,只能显示当前的。

复制代码
test@ubuntu-server:~$ ps
    PID TTY          TIME CMD
  11438 pts/0    00:00:00 bash
  11453 pts/0    00:00:00 ps

添加-ef查看所有的进程:

复制代码
test@ubuntu-server:~$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 04:55 ?        00:00:02 /sbin/init
root           2       0  0 04:55 ?        00:00:00 [kthreadd]
root           3       2  0 04:55 ?        00:00:00 [rcu_gp]
root           4       2  0 04:55 ?        00:00:00 [rcu_par_gp]
root           6       2  0 04:55 ?        00:00:00 [kworker/0:0H-kblockd]
...

我们可以找到对应的进程ID(PID),使用kill命令将其强制终止:

复制代码
test@ubuntu-server:~$ ps
    PID TTY          TIME CMD
  11438 pts/0    00:00:00 bash
  11455 pts/0    00:00:00 ps
test@ubuntu-server:~$ kill -9 11438
Connection to 192.168.10.6 closed.

比如我们可以将当前会话的bash给杀死,那么会导致我们的连接直接断开,其中-9是一个信号,表示杀死进程:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程。

最后如果我们想要正常关机,只需要输入shutdown即可,系统会创建一个关机计划,并在指定时间关机,或是添加now表示立即关机:

复制代码
test@ubuntu-server:~$ sudo shutdown
[sudo] password for test: 
Shutdown scheduled for Mon 2022-01-24 11:46:18 UTC, use 'shutdown -c' to cancel.
test@ubuntu-server:~$ sudo shutdown now
Connection to 192.168.10.6 closed by remote host.
Connection to 192.168.10.6 closed.

压缩解压

比较常用的压缩和解压也是重点,我们在Windows中经常需要下载一些压缩包,并且将压缩包解压才能获得里面的文件,而Linux中也支持文件的压缩和解压。

这里我们使用tar命令来完成文件亚索和解压操作,在Linux中比较常用的是gzip格式,后缀名一般为.gz,tar命令的参数-c表示对文件进行压缩,创建新的压缩文件,-x表示进行解压操作,-z表示以gzip格式进行操作,-v可以在处理过程中输出一些日志信息,-f表示对普通文件进行操作,这里我们创建三个文件并对这三个文件进行打包:

sh 复制代码
test@ubuntu-server:~$ tar -zcvf test.tar.gz *.txt
1.txt
2.txt
3.txt
test@ubuntu-server:~$ ls
1.txt  2.txt  3.txt  test.tar.gz
test@ubuntu-server:~$ 

接着我们删除刚刚三个文件,再执行解压操作,得到压缩包中文件:

sh 复制代码
test@ubuntu-server:~$ rm *.txt
test@ubuntu-server:~$ ls
test.tar.gz
test@ubuntu-server:~$ tar -zxvf test.tar.gz 
1.txt
2.txt
3.txt
test@ubuntu-server:~$ ls
1.txt  2.txt  3.txt  test.tar.gz

同样的,我们也可以对一个文件夹进行打包:

sh 复制代码
test@ubuntu-server:~$ mv *.txt test
test@ubuntu-server:~$ tar -zcvf test.tar.gz test/
test/
test/1.txt
test/2.txt
test/3.txt
test@ubuntu-server:~$ rm -r test
test@ubuntu-server:~$ ls
test.tar.gz 
test@ubuntu-server:~$ tar -zxvf test.tar.gz 
test/
test/1.txt
test/2.txt
test/3.txt
test@ubuntu-server:~$ ls
test  test.tar.gz
test@ubuntu-server:~$ ls test
1.txt  2.txt  3.txt

到此,Linux的一些基本命令就讲解为止。


vim文本编辑器

和Windows中的记事本一样,Linux中也有文本编辑器,叫做Vi编辑器,Ubuntu中内置了Vi编辑器的升级版Vim,我们这里就讲解Vim编辑器的使用。

我们可以直接输入vim 文件名称来使用Vim编辑器对文本文件进行编辑:

sh 复制代码
test@ubuntu-server:~$ vim hello.txt

进入编辑器之后,我们发现界面变成了:

复制代码
~                                                                                                                                                                                         
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
"hello.txt" [New File]                                                            0,0-1         All

这时我们直接输入内容是无法完成的,因为默认进入之后为命令模式,Vim编辑器默认有三种模式:

img
  • 命令模式:此模式下可以输入任意的命令进行操作,所有的输入都被看做是命令输入,而不是文本编辑输入。
  • 编辑模式:此模式下输入的任何内容都会以文本编辑方式写入到文件中,就像我们直接在Windows的记事本中写内容一样。
  • 末行模式:此模式下用于输入一些复杂命令,会在最后一行进行复杂命令的输入。

在命令模式下,我们可以直接按下键盘上的i,此命令表示进行插入操作,会自动切换到编辑模式,这时可以看到最下方变为:

复制代码
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
~                                                                                                   
-- INSERT --                                                                      1,1           All

而这时我们所有的输入内容都可以直接写到文件中了,如果我们想回到命令模式,按下Esc键即可。

除了i以外,我们也可以按下a表示从当前光标所在位置之后继续写,与i不同的是,i会在光标之前继续写,o会直接跳到下一行,而A表示在当前行的最后继续写入,I表示在当前行的最前面继续写入。

这里我们随便粘贴一段文本信息进去(不要用Ctrl+V,Linux中没这操作,XShell右键点粘贴):

复制代码
I was hard on people sometimes, probably harder than I needed to be. 
I remember the time when Reed was six years old, coming home, and I had just fired somebody that day.
And I imagined what it was like for that person to tell his family and his young son that he had lost his job. 
It was hard. 
But somebody’s got to do it. 
I figured that it was always my job to make sure that the team was excellent, and if I didn’t do it, nobody was going to do it.
You always have to keep pushing to innovate.
Dylan could have sung protest songs forever and probably made a lot of money, but he didn’t. 
He had to move on, and when he did, by going electric in 1965, he alienated a lot of people.

在我们编辑完成之后,需要进入到末行模式进行文件的保存并退出,按下:进入末行模式,再输入wq即可保存退出。

接着我们来看一些比较常用的命令,首先是命令模式下的光标移动命令:

  • ^ 直接调到本行最前面
  • $ 直接跳到本行最后面
  • gg 直接跳到第一行
  • [N]G 跳转到第N行
  • [N]方向键 向一个方向跳转N个字符

在末行模式下,常用的复杂命令有:

  • :set number 开启行号
  • :w 保存
  • :wq或:x 保存并关闭
  • :q 关闭
  • :q! 强制关闭

我们可以输入/或是?在末行模式中使用搜索功能,比如我们要搜索单词it:

复制代码
/it  

接着会在文本中出现高亮,按n跳转到下一个搜索结果,?是从后向前搜索,/是从前向后搜索。

它还支持替换功能,但是使用起来稍微比较复杂,语法如下:

复制代码
:[addr]s/源字符串/目的字符串/[option]

addr表示第几行或是一个范围,option表示操作类型:

  • g: globe,表示全局替换
  • c: confirm,表示进行确认
  • p: 表示替代结果逐行显示(Ctrl + L恢复屏幕)
  • i: ignore,不区分大小写

比如我们要将当前行中的it全部替换为he,那么可以这样写:

复制代码
:s/it/he/g

实际上除了以上三种模式外,还有一种模式叫做可视化模式,按下键盘上的v即可进入,它能够支持选取一段文本,选取后,我们可以对指定段落的文本内容快速进行复制、剪切、删除、插入等操作,非常方便。在此模式下,我们可以通过上下左右键进行选取,以进入可视化模式时的位置作为基本位置,通过移动另一端来进行选取。

我们可以使用以下命令来对选中区域进行各种操作:

  • y 复制选中区域
  • d/x 剪切(删除)选中区域
  • p 粘贴
  • u 撤销上一步

当然,这些命令在命令模式下也可以使用,但是可视化模式下使用更适合一些。


环境安装和项目部署

在学习完了Linux操作系统的一些基本操作之后,我们接着来看如何进行项目的环境安装和部署,包括安装JDK、Nginx服务器,以及上传我们的SpringBoot项目并运行。

我们可以直接使用apt进行软件的安装,它是一个高级的安装包管理工具,我们可以直接寻找对应的软件进行安装,无需再去官网进行下载,非常方便,软件仓库中默认已经帮助我们存放了大量实用软件的安装包,只需要一个安装命令就可以进行安装了。

实际上Ubuntu系统已经为我们自带了一些环境了,比如Python3:

复制代码
test@ubuntu-server:~$ python3
Python 3.8.10 (default, Nov 26 2021, 20:14:08) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("HelloWorld!")
HelloWorld!
>>> exit()

C语言的编译工具GCC可以通过APT进行安装:

sh 复制代码
sudo apt install gcc

安装后,可以编写一个简单的C语言程序并且编译为可执行文件:

c 复制代码
#include<stdio.h>

int main(){
        printf("Hello World!\n");
}  
sh 复制代码
test@ubuntu-server:~$ vim hello.c
test@ubuntu-server:~$ gcc hello.c -o hello
test@ubuntu-server:~$ ./hello 
Hello World!

而JDK实际上安装也非常简单,通过APT即可:

sh 复制代码
test@ubuntu-server:~$ sudo apt install openjdk-8-j
openjdk-8-jdk           openjdk-8-jre           openjdk-8-jre-zero      
openjdk-8-jdk-headless  openjdk-8-jre-headless  
test@ubuntu-server:~$ sudo apt install openjdk-8-jdk

接着我们来测试一下编译和运行,首先编写一个Java程序:

复制代码
test@ubuntu-server:~$ vim Main.java
复制代码
public class Main{
        public static void main(String[] args){
                System.out.println("Hello World!");
        }
}
复制代码
test@ubuntu-server:~$ javac Main.java 
test@ubuntu-server:~$ ls
Main.class  Main.java
test@ubuntu-server:~$ java Main 
Hello World!

接着我们来部署一下Redis服务器:

复制代码
test@ubuntu-server:~$ sudo apt install redis

安装完成后,可以直接使用redis-cli命令打开Redis客户端连接本地的服务器:

复制代码
test@ubuntu-server:~$ redis-cli
127.0.0.1:6379> keys *
(empty list or set)

使用和之前Windows下没有区别。

接着我们安装一下MySQL服务器,同样的,直接使用apt即可:

复制代码
sudo apt install mysql-server-8.0 

我们直接直接登录MySQL服务器,注意要在root权限下使用,这样就不用输入密码了:

复制代码
sudo mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.27-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit

可以发现实际上就是我们之前在Windows的CMD中使用的样子,接着我们就创建一个生产环境下使用的数据库:

复制代码
mysql> create database book_manage;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| book_manage        |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

接着我们创建一个用户来使用这个数据,一会我们就可以将SpringBoot配置文件进行修改并直接放到此服务器上进行部署。

复制代码
mysql> create user test identified by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all on book_manage.* to test;
Query OK, 0 rows affected (0.00 sec)

如果觉得这样很麻烦不是可视化的,可以使用Navicat连接进行操作,注意开启一下MySQL的外网访问。

复制代码
test@ubuntu-server:~$ mysql -u test -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.27-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| book_manage        |
| information_schema |
+--------------------+
2 rows in set (0.01 sec)

使用test用户登录之后,查看数据库列表,有book_manage就OK了。

最后我们修改一下SpringBoot项目的生产环境配置即可:

yaml 复制代码
spring:
  mail:
    host: smtp.163.com
    username: javastudy111@163.com
    password: TKPGLAPDSWKGJOWK
  datasource:
    url: jdbc:mysql://localhost:3306/book_manage
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: test
    password: 123456
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: update
springfox:
  documentation:
    enabled: false

然后启动我们的项目:

sh 复制代码
test@ubuntu-server:~$ java -jar springboot-project-0.0.1-SNAPSHOT.jar 

现在我们将前端页面的API访问地址修改为我们的SpringBoot服务器地址,即可正常使用了。

我们也可以将我们的静态资源使用Nginx服务器进行代理:

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

Nginx非常强大,它能够通提供非常方便的反向代理服务,并且支持负载均衡,不过我们这里用一下反向代理就可以了,实际上就是代理我们的前端页面,然后我们访问Nginx服务器即可访问到静态资源,这样我们前后端都放在了服务器上(你也可以搞两台服务器,一台挂静态资源一台挂SpringBoot服务器,实现真正意义上的分离,有条件的还能上个域名和证书啥的)。

安装如下:

复制代码
test@ubuntu-server:~$ sudo apt install nginx

安装完成后,我们可以直接访问:http://192.168.10.4/,能够出现Nginx页面表示安装成功!

接着我们将静态资源上传到Linux服务器中,然后对Nginx进行反向代理配置:

复制代码
test@ubuntu-server:~$ cd /etc/nginx/
test@ubuntu-server:/etc/nginx$ ls
conf.d		koi-utf     modules-available  proxy_params	sites-enabled  win-utf
fastcgi.conf	koi-win     modules-enabled    scgi_params	snippets
fastcgi_params	mime.types  nginx.conf	       sites-available	uwsgi_params
test@ubuntu-server:/etc/nginx$ sudo vim nginx.conf
复制代码
server {
                listen       80;
                server_name  192.168.10.4;
                add_header Access-Control-Allow-Origin *;
                location / {
                        root /home/test/static;
                        charset utf-8;
                        add_header 'Access-Control-Allow-Origin' '*';
                        add_header 'Access-Control-Allow-Credentials' 'true';
                        add_header 'Access-Control-Allow-Methods' '*';
                        add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
                }
        }

然后就可以直接访问到我们的前端页面了,这时再开启SpringBoot服务器即可,可以在最后添加&符号表示后台启动。

正在加载页面,请稍后...