Process:进程是CPU进行资源分配的基本单元,每一个应用程序至少包含一个进程(也可以包含多个进程)
Thread:线程是cpu执行的基本单元,一个进程至少包含一个线程(也可以包含多个线程)
ps -ef 以完整格式查看全部进程
e对应单词entire,表示全部,具体指显示系统中全部的进程信息
f对应单词ful-formate,表示完整格式

进程信息各列的说明:
| 列名 | 含义 |
|---|---|
| UID | 进程的用户信息 |
| PID | 当前进程的id,每一个进程都有的唯一的id。由系统分配,不会重复。 |
| PPID | 父进程的id。你这个进程是谁启动的就是父进程。 |
| CMD | 当前进程所对应的程序。 |
| C | 用整数表示的CPU使用率 |
| STIME | 进程启动时间 |
| TTY | 进程所在终端。所谓终端就是用户输入命令的操作界面。 |
| TIME | 进程所占用的CPU时间 |
父进程和子进程之间的关系
父进程和子进程的关系是:父进程启动了子进程。我们可以使用pstree命令查看整个进程树

和其它命令配合一起查看进程信息
ps -ef | less 分屏查看全部进程
ps -ef | grep ssh 精确查询一个具体进程信息
ps -ef | grep ssh | grep -v grep ,怎么排除最后一个呢,再用一层管道,使用grep命令的-v参数把匹配grep的行排除
结束进程:
何为杀死进程?就是Windows中的结束进程,
为什么要结束进程?(非正常关闭)
采用正常关闭已经做不了了,我不知道怎么去关闭一个进程了
但是一般不推荐杀死进程,举例:杀进程,临时文件不会被删除。
kill -9 进程id表示杀死指定id的进程
类似于windows任务管理器的性能面板
| 命令名 | 更新时间间隔(秒) | 不显示任何闲置或者僵死进程 | 通过进程id监控单一进程 |
|---|---|---|---|
| top | -d 间隔秒数 | -i | -p 进程id |

上面这一部分:整个系统的健康状态
第一行:任务队列信息
| 内容举例 | 说明 |
|---|---|
| 09:55:40 | 系统当前时间 |
| up 8:50 | 系统的运行时间 |
| 2 users | 当前登录了2个用户 |
| load average:0.00, 0.05, 0.07 | 系统在之前1分钟,5分钟,15分钟的平均负载。 一般认为小于1时,负载较小。如果大于1,系统已经超出负荷。 |
第二行:进程信息
| 内容举例 | 说明 |
|---|---|
| Tasks: 198 total | 系统中的进程总数 |
| 1 running | 正在运行的进程数 |
| 197 sleeping | 睡眠的进程 |
| 0 stopped | 正在停止的进程 |
| 0 zombie | 僵尸进程。如果不是0,需要手工检查僵尸进程 |
第三行:CPU信息
| 内容举例 | 说明 |
|---|---|
| Cpu(s):0.1%us | 用户空间占用的CPU百分比,us对应user |
| 0.1%sy | 内核空间占用的CPU百分比,sy对应system |
| 0.0%ni | 改变过优先级的进程占用的CPU百分比,ni对应niced |
| 99.7%id | 空闲CPU的CPU百分比 |
| 0.1%wa | 等待输入/输出的进程的占用CPU百分比,wa对应IO wait |
| 0.0%hi | 硬中断请求服务占用的CPU百分比,hi对应hardware IRQ |
| 0.1%si | 软中断请求服务占用的CPU百分比,si对应software IRQ |
| 0.0%st | st(Steal time)虚拟时间百分比,也叫被hypervisor偷走的时间。 就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比。 |
第四行:物理内存信息
| 内容举例 | 说明 |
|---|---|
| 997980 total | 物理内存的总量,单位KB |
| 61296 free | 空闲的物理内存数量 |
| 514552 used | 已经使用的物理内存数量 |
| 422132 buff/cache | 作为缓冲的内存数量 |
第五行:交换区使用情况
| 内容举例 | 说明 |
|---|---|
| 2097148 total | 交换分区(虚拟内存)的总大小 |
| 1789704 free | 空闲交换分区的大小 |
| 307444 used | 已经使用的交互分区的大小 |
| 277064 avail Mem | 在不交换的情况下,对启动新应用程序可用内存的估计 |
下面这一部分:就是进程信息了,可以通过按键操作按照不同条件排序,比如我按了“N”,就按照pid排序了

可以有的按键操作
| 按键 | 功能 |
|---|---|
| P | 默认值,根据CPU使用率排序 |
| M | 以内存的使用率排序 |
| N | 以PID排序 |
| d | 设置数据刷新的时间间隔,单位是秒 |
| q | 退出 |
netstat命令是查看网络状态,常用参数列表如下:
| 参数名 | 作用 |
|---|---|
| -a | 显示所有正在或不在侦听的套接字。 |
| -n | 显示数字形式地址而不是去解析主机、端口或用户名。 |
| -p | 显示套接字所属进程的PID和名称。 |
为什么要去查看网络状态,大部分时侯是去查询谁占用了某个端口
netstat -anp
第一部分:tcp/udp 与外部服务器建立的连接
第二部分:linux 内部应用之间的连接
netstat -anp | less 分屏查看网络状态
netstat -anp | grep sshd 根据进程名称查看网络状态

netstat -anp | grep :22 根据端口号查看网络状态,找谁占用22端口

basename 获取一个资源中的资源名部分,文件或目录本身部分
usr/local/aa/bb/cc.txt 真正的资源是cc.txt
usr/local/aa/bb/cc 获取的是cc
dirname(和basename 相反) 返回路径字符串中的目录部分
dirname /usr/local/aa/bb/cc
dirname /usr/local/aa/bb/cc.txt
cut 切割文件
根据指定符号拆分字符串并提取。默认根据 \t 拆分 (默认制表符)
cut -f 1 cut.txt 拿第一列
cut -f 2- cut.txt 拿第二列,及以后的列
cut切割变量值
ifconfig | grep netmask,怎么通过切割只获取ip的值呢

ifconfig | grep netmask | cut -d 'i' -f 2,这样就能把前面的空白符去掉了

再按空格切分获取第二列就好了,管道是一个很实用的技术

sort 文件排序
将文件进行排序,并将排序结果标准输出。
| 参数名 | 作用 |
|---|---|
| -n | 依照数值大小排序 |
| -r | 相反顺序排序 |
| -t | 指定每列分割符 |
| -k | 指定需要排序的列 |
sort -t ' ' -k 2 sort.txt
只有拥有权限的用户才能操作这些资源。
专业术语
1.用户(登录系统的账户密码,用户的身份标识)
2.登录(专业说法是认证)
3.资源 (这个系统的所有内容,无论文件还是目录,资源是权限控制系统要保护的对象 )
4.授权(系统给用户分配权限)
5.校验(当用户操作某个资源的时候,系统会校验用户是否有权限)
6.用户组(同一类用户归类到同一个组)
用户:一个账号和密码
用户组:多个用户
只要给用户组授权,那么每一个用户就都授权了。
创建用户和用户组的命令(只能root做)
| 命令 | 作用 |
|---|---|
| groupadd 组名 | 创建用户组 |
| id 用户名 | 查看用户信息 |
| useradd -g 组名 用户名 | 创建用户,同时指定所属用户组 |
| passwd 用户名 | 给用户账号设置密码 |

创建用户不指定组,会创建一个新组,组名就是用户名

1. 文件权限信息说明
资源所属用户 资源所属用户组
root root
文件权限就是最前面那10个字符,如下图 drwxr-xr-x
第一个字符:表示当前资源类型 d是目录,l是连接,-是文件
后九个字符:表示当前资源的权限
后九个字符又分为:
前三个字符:资源拥有者的权限
中间三个字符:资源拥有组里用户的权限
后三个字符:其它组的用户的权限
每三个字符中又可能包含
r(read):
如果资源是一个文件,那么有r权限代表可以使用cat、more、less、tail、vim命令查看文件如果资源是一个目录,那么有r权限代表可以使用ls、ll命令列出目录中的内容
w(write):
如果资源是一个文件,那么有w权限代表可以可以使用vim命令编辑文件如果资源是一个目录,那么有w权限代表可以在该目录中使用mkdir、touch、rm、rmdir,mv等等命令创建、删除、攻变资源
x (execut):
如果资源是一个文件,那么有x权限代表可以直接执行这个文件(可执行文件);]
如果资源是一个目录,那么有x权限代表可以使用cd命令进入这个目录
-:无权限
由于每一位要么有权限要么没有权限,所以天然可以使用二进制来表示权限信息,即可以用十进制表示权限。
1:有
0:无
| 权限的符号表示 | 权限的二进制表示 | 权限的十进制表示 |
|---|---|---|
| rwx r-x r-x | 111 101 101 | 7 5 5 |
| rw- r-- r-- | 110 100 100 | 6 4 4 |
修改文件权限
目标:让tom能在/opt目录中新建内容
| 命令名 | 作用 |
|---|---|
| chmod | 修改权限信息 |
| chown | 修改文件或目录的所属用户 |
| chgrp | 修改文件或目录的所属用户组 |
方式一:让tom成为/opt目录的拥有者(只有root可以改)
- chown tom /opt 修改拥有者
- chgrp atguigu /opt 修改拥有组
- chown root:root /opt 同时修改拥有者和拥有组
方式二:修改资源的权限
精准修改资源的权限
chmod u=rwx,g=rx,o=rwx /opt其中u表示拥有者,g表示同组用户,o表示其它用户
chmod 755 /opt
这三位数字分别表示: 拥有者的权限、同组用户的权限、其它用户的权限
r:是4;w:是2;x:是1
提升普通用户的权限
方式三:让tom变得跟root-一样牛皮!!
提升普通用户的权限(sudo)
为什么root那么牛皮?
vim /etc/sudoers,改这个文件
Allow root to run any commands anywhere
Allows people in group wheel to run all commands
得亮尚方宝剑
sudo rmdir xixi
Linux系统的服务管理
操作系统中在后台持续运行的程序,本身并没有操作界面,需要通过端口号访问和操作
启动、停止、查看状态、重启、设置开机自启动,停止开机自启动
启动服务:systemctl start 服务名(xxxx.service)
重启服务:systemctl restart 服务名(xxxx.service)
停止服务:systemctl stop 服务名(xxxx.service)
重新加载服务:systemctl reload 服务名(xxxx.service)
查看服务状态:systemctl status 服务名(xxxx.service)设置开机自动启动:systemctl enable 服务名
取消开机自动启动:systemctl disable 服务名
systemctl status firewalld 查看防火墙状态
查看服务状态列表(root)
systemctl list-unit-files 查所有服务
linux里面的防火墙
防火墙的作用是啥:拦截外部访问
防火墙拦截外部访问的机制:
1.基于白名单:只有在白名单中的路径才不拦截
2.基于黑名单:只有在黑名单中的路径才拦截
防火墙端口设置:
基于白名单
firewall-cmd --zone=public --list-ports 查看所有放行的端口号
firewall-cmd --zone=public --query-port=22/tcp 查看某个端口是否放行
firewall-cmd --add-port=3306/tcp --permanent 防火墙开放端口
firewall-cmd --reload 更新防火墙规则
firewall-cmd --remove-port=端口/tcp --permanent 防火墙取消端口开放
学习阶段:
关闭防火墙 systemctl stop firewalld
设置开机不自启动 systemctl disable firewalld查看防火墙开机时是否启动 systemctl list-unit-files | grep firewalld
常用端口
8080 tomcat
80 http协议
443 https协议
22 ssh远程连接
3306 mysql
6379 redis
做某一件事情:需要执行10行Linux命令,而我们又要经常做这件事情。我们将这10行命令编写到一个.sh结尾的文件中,到时候要做这件事情了,就只需要执行那个.sh结尾的文件。这种.sh结尾的文件叫Shell脚本,而编写.sh结尾的文件的过程就叫做Shell编程!
Shell是一个命令行解释器,它接收应用程序或用户的命令,然后调用操作系统内核。 它是一个功能强大的编程语言,易编写、易调试、灵活性强
Shell解释器:解释执行Shell脚本的
js也是脚本语言,js解释器内置在浏览器 。
Linux系统提供的Shell解析器,其中最常用的是 /bin/sh 和 /bin/bash。sh是bash的软链接,Linux默认使用的是bash
1.使用touch创建脚本文件,以.sh作为扩展名

2.编写脚本内容,使用vim jade.sh
3.运行脚本

其中“.”是source的另一种写法。在当前进程中发布的全局变量可以在当前进程的其他脚本中继续沿用,也可以在子进程中使用;但是子进程发布的变量仅限于子进程内部使用
| 命令名 | 在当前进程运行 | 新建子进程运行 |
|---|---|---|
| source | √ | |
| . | √ | |
| sh | √ | |
| bash | √ | |
| chmod +x后直接运行 | √ |
老师使用多的是 sh,向老师看齐

1.变量
shell系统预定义变量
$PATH,$USER、$HOME、$PWD、$SHELL等,可以使用echo命令输出他们的值
执行文件:
Shell自定义变量
1.2.5 语法规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
等号两侧不能有空格,衍生规则就是变量声明时必须初始化
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
变量的值如果有空格,需要使用双引号或单引号括起来。
变量名区分大小写。
变量名=变量值
执行文件:
静态变量(只读变量),就得加上readonly
自定义的变量还可以使用unset命令进行撤销(让变量失效),但是静态变量无法撤销
unset username
特殊变量
$0 表示获取执行的脚本的名称
$1-$n 表示获取用户执行脚本时传入的第1个到第n个参数,
从${10}开始数字需要使用{}括起来
$# 表示获取用户执行脚本时传入的参数个数
$? 表示获取上一句命令的执行结果
如果上一句命令执行结果是boolean值则true为0 false为1
如果上一句执行结果不是boolean类型,那么执行成功为0,执行失败为非零
$*和$@都是获取用户执行脚本时传入的所有参数,只有在循环中且放在引号中能够体现出它们的区别。下面会说到!
2.运算表达式
Shell中运算表达式写法: $((表达式))或$[表达式]
142857,又名走马灯数。它发现于埃及金字塔内,它是一组神奇的数字,细思则恐的数字


3.条件判断
常用判断条件:
| 数据类型 | 写法 | 单词 | 含义 |
|---|---|---|---|
| 数值 | -lt | less than | 小于 |
| 数值 | -le | less equal | 小于等于 |
| 数值 | -eq | equal | 等于 |
| 数值 | -gt | greater than | 大于 |
| 数值 | -ge | greater equal | 大于等于 |
| 数值 | -ne | not equal | 不等于 |
| 文件 | -r | read | 判断当前用户是否可以读取该文件 |
| 文件 | -w | write | 判断当前用户是否可以修改该文件 |
| 文件 | -x | execute | 判断当前用户对该文件是否有执行权限 |
| 文件 | -f | file | 判断是否存在并且必须是文件 |
| 文件 | -e | existence | 判断目录或者文件是否存在 |
| 文件 | -d | directory | 判断是否存在并且是一个目录 |
判断表达式的俩种写法
test condition
[ condition ]
4.流程控制
三元运算符:判断表达式 && true || false
判断表达式连接符表达式为true的时候执行的代码
连接符表达式为false的时候执行的代码

if语句
if 判断表达式
then
判断为true时执行的代码
fi
多重条件判断
if
elif
else
fi
case判断
case
esac
for 循环
1、打印1-10
2、
for in 循环,遍历集合
使用forin循环遍历出用户执行脚本时传入的每一个参数
”$@“
" $* " 把要遍历的内容作为一个字符串,只遍历一次输出
while 循环
求1-100累加和
5.函数:
在一个Shell脚本中会出现重复代码->函数
Shell 编程中要求函数的返回值只能是整数。
并且只能通过 $? 方式获得
function sum(){
在函数内部$1表示获取调用函数时传入的第一个参数
return $[$1+$2]
}
6.获取脚本外部数
脚本内部代码不能完全写死,
所以我们要在脚本内部获取脚本外部传入的数据
编写一个脚本:
你传入什么路径,我就给你创建一个什么文件
read
-t 等待时间
-p 提示文字
备份配置文件
在修改任何配置文件之前都多复制一份:把原始、纯净、正确的配置文件执行了备份。将来万一发生问题,拿原始配置文件覆盖错误配置文件
虚拟机备份,通过快照恢复
为了避免安装失败以后没有退路可以重新开始,建议在执行相关安装之前拍摄快照。一旦发生问题,可以恢复快照重新开始。
创建快照:
恢复快照:
删除快照
安装jdk
rpm,通过 rpm 可以管理 Linux 环境下的安装包
| 参数名 | 作用 |
|---|---|
| -qa | 查询系统中已经安装的程序,通常配合管道,使用 grep 精确匹配想要查询的包 |
| -ivh | 执行 rpm 包安装操作 |
| -e | 卸载 rpm 包 |
| --nodeps | 在卸载过程中忽略依赖关系 |
Linux 系统中命令的参数往往有这样的特点:
参数如果是一个或多个完整的单词那么前面是两个“-”
参数如果是单词的缩写,是一个字母,那么前面是一个“-”
查询系统中已经安装的jdk
rpm -qa | grep openjdk
执行卸载,卸载过程中使用 --nodeps 忽略依赖关系
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
解压就安装好的软件/opt 下
复制过来之后,解压,
tar -zxvf jdk-8u152-linux-x64.tar.gz
配置JDK的环境变量
为了防止修改配置文件的时候出现错误,提前复制一份/etc/profile cp /etc/profile /etc/profile.bak
下面内容添加到文件末尾 ,export 声明全局变量
#配置JAVA HOME
export JAVA_HOME=/opt/jdk1.8.0_152
export PATH=SPATH:$JAVA_HOME/bin
保存退出vim后,使用source命令执行/etc/profile脚本,让脚本中发布的环境变量生效。但是仅限于当前进程,如果想让新环境变量全局生效,可以reboot。
验证:
安装tomcat
cd /opt,进入/opt目录,把tomcat的压缩包从物理机拽过来
tar -zxvf /opt/apache-tomcat-8.5.32.tar.gz 解压就是
启动tomcat
/opt/apache-tomcat-8.5.32/bin/startup.sh
在物理机上访问tomcat,在 Windows 系统访问 Linux 服务器端的 Tomcat 需要使用 LInux 的 IP 地址,并且要保证防火墙关闭,或者放行了8080端口

查看tomcat日志信息
tail -F /opt/apache-tomcat-8.5.32/logs/catalina.out
停止 tomcat
/opt/apache-tomcat-8.5.32/bin/shutdown.sh
如果要部署项目,将部署 war 包放在 webapps 目录下(这一步不一定要去做)
/opt/apache-tomcat-8.5.32/webapps
安装mysql
安装mysql之前一定要拍快照.
mariadb 和mysql的关系
MySQL 被 Oracle 收购,社区担心将来 MySQL 被 Oracle 关闭开源模式,和 Oracle 数据库一样变成商业化运作。所以社区开发了一个 MySQL 的社区版,内部和 MySQL 一样,只是名字不同,这就是 mariadb。
卸载系统预装 mariadb
1.查询系统中预装的mariadb
rpm -qa | grep mariadb --color
2.删除系统中预装的mariadb(如果第一步没查到就不删)
rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
1.在虚拟机中的/usr/local中创建一个mysql目录
mkdir /usr/local/mysql
2.将mysql压缩包拷贝到/usr/local/mysql目录中,解压mysql的tar包
cd /usr/local/mysql
tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz
3 安装MySQL,下述步骤依次执行
中间会停下来,按回车键就好
rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm
4. 修改MySQL的字符集配置
mysql默认使用的字符集是latin1,即:iso-8859-1,是不支持中文的。
要想让MySql支持中文,需要通过配置文件设置指定MySql使用utf-8字符集才可以。
修改MySql的字符集:
使用vim打开mysql的配置文件: vim /etc/my.cnf
进入编辑模式o,在[mysqld]下边添加内容:
character-set-server=utf8
5.启动MySQL服务
systemctl start mysqld
6 设置MySQL服务开机自启动
systemctl enable mysqld
7.查看MySQL初始密码
安装MySQL的过程中会自动生成初始密码,我们可以在/var/log/mysqld.log文件中进行查看
cat /var/log/mysqld.log | grep "temporary password" --color
8.使用初始密码登录MySQL
p和初始密码之间千万不能空格
mysql -uroot -p'初始密码'
9.修改root的密码
在使用初始密码登录mysql之后,依次执行下面三行命令
set global validate_password_length=4;
set global validate_password_policy=LOW;
set password = password('root');
第一次修改密码一定要按照上述三步来做,修改完之后你如果想将密码改成其它的密码,你可以在退出mysql之后执行(需要在未登录mysql的情况下执行):exit是退出客户端,不是服务器
mysqladmin -uroot -p password 新密码 -- 新密码不需要加上引号
会遇到的问题:
1 .被防火墙拦截
解决方案是关闭防火墙或者是让防火墙放行3306端口
关闭防火墙命令
systemctl stop firewalld.service
放行3306端口的操作:
firewall-cmd --add-port=3306/tcp --permanent
# 放行端口后一定要重新加载防火墙配置
firewall-cmd --reload
问题2:MySQL服务器不允许远程访问
解决方案是让root用户能够远程访问MySQL服务器:
mysql默认不允许远程访问
mysql数据库-user表-放的是登录mysql的用户信息host字段,表示当前这个用户能在什么客户端进行登录,
如果值为localhost表示只能本机登录
如果值为%表示可以远程登录。
# 允许远程访问:创建一个新的root对象,并且指定这个root对象对所有数据库里面的所有表都有所有权限,并且指定这个root用户的密码是123456
grant all on *.* to 'root'@'%' identified by '123456';
# 刷新设置
flush privileges;
解决上述俩问题之后,就可以使用宿主机中的SQLYog远程连接访问虚拟机中的MySQL了