Linux常用shell命令

This commit is contained in:
heibaiying 2019-07-03 15:29:17 +08:00
parent dc01f929d3
commit f892e2d22a
15 changed files with 1272 additions and 1672 deletions

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.heibaiying</groupId>
<artifactId>rabbitmq-basis</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.6.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,45 @@
package com.heibaiying;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* 消费者
*/
public class Consumer {
private static final String QUEUE_NAME = "queue-hello";
private static final String USER_NAME = "root";
private static final String PASSWORD = "root";
private static final String IP_ADDRESS = "192.168.200.229";
/* RabbitMQ 服务默认的连接端口号 */
private static final int PORT = 5672;
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
factory.setUsername(USER_NAME);
factory.setPassword(PASSWORD);
Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
// 设置客户端最多接收多少个未被 Ack 的消息, 0 代表没有限制
channel.basicQos(64);
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("收到消息:" + new String(body));
// 消息 Ack
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(QUEUE_NAME, consumer);
// 等到回调函数执行后再关闭连接
TimeUnit.SECONDS.sleep(5);
channel.close();
connection.close();
}
}

View File

@ -0,0 +1,45 @@
package com.heibaiying;
import com.rabbitmq.client.*;
/**
* 生产者
*/
public class Producer {
private static final String EXCHANGE_NAME = "exchange-hello";
private static final String ROUTING_KEY = "routingkey-hello";
private static final String QUEUE_NAME = "queue-hello";
private static final String USER_NAME = "root";
private static final String PASSWORD = "root";
private static final String IP_ADDRESS = "192.168.200.229";
/* RabbitMQ 服务默认的连接端口号 */
private static final int PORT = 5672;
public static void main(String[] args) throws Exception {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
factory.setUsername(USER_NAME);
factory.setPassword(PASSWORD);
// 获取新的连接
Connection connection = factory.newConnection();
// 创建信道
Channel channel = connection.createChannel();
// 创建一个 type="direct"持久化的非自动删除的交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, null);
// 创建一个持久化非排他的非自动删除的队列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
// 将交换器与队列通过路由键绑定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
String message = "hello world";
// 发送一条持久化的文本消息
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
// 关闭信道
channel.close();
// 关闭连接
connection.close();
}
}

79
notes/Java并发.md Normal file
View File

@ -0,0 +1,79 @@
# Java 并发编程基础
## 一、线程基础
### 1.1 创建线程
创建线程通常以下两种方式:
- 实现 Runnable 接口:
```java
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable:" + Thread.currentThread().getId());
}
}
Thread thread = new Thread(new MyRunnable());
thread.start();
```
- 采用匿名内部类:
```java
// 1.创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread:" + Thread.currentThread().getId());
}
});
// 2.启动线程
thread.start();
```
```java
// 使用Java 8的lambda可以简写如下
new Thread(() -> System.out.println("Thread:" + Thread.currentThread().getId())).start();
```
由于 Thread类 实现了 Runnable 接口,所以两种方式本质上还是同一种。需要注意的是,当你使用 `new` 关键字创建了一个线程后,此时线程并没有开始执行,所以你还需要调用`start`方法启动线程。启动一个线程的实质是请求 Java 虚拟机运行相应的线程而这个线程具体何时能够运行是由线程调度器Scheduler决定的线程可能立即执行也可能稍后运行甚至有可能永远不会被执行。
### 1.2 线程属性
**编号(ID)** :用于标识线程的唯一编号,只读属性。
**名称(Name)**:用于区分不同线程的名称,可读可写。
**线程类别(Daemon)**:布尔类型,为 true 表示是守护线程,否则为用户线程,用户线程会阻止 Java 虚拟机正常停止,守护线程则不会。通常可以把一些不重要的线程设置为守护线程,比如监控其他线程工作的线程,当工作线程停止后,虚拟机就可以正常退出。在开发中我们可以使用`setDaemonn`方法设置线程为守护线程,该方法必须在`start`方法前调用,如果在其后调用,则会抛出`IllegalThreadStateException`异常。
**优先级(Priority)**Java 线程支持 1~10 的 10个优先级默认值为5代表一般优先级。Java 线程的优先级本质上只是给线程调度器一个提示信息,它并不能保证线程一定按照优先级的高低顺序运行,所以它是不可靠的,需要谨慎使用。
需要说明的是在 Java 平台中,一个线程的线程类别,优先级都默认与其父线程相同。
### 1.3 线程状态
Java 线程的生命周期分为以下几个状态:
**RUNABLE**该状态包括两个子状态READY 和 RUNING。处于 READY 状态的线程被称为活跃线程,被线程调度器选中后则开始运行,转化为 RUNING 状态。
**BLOCKED**:一个线程发起一个阻塞式 IO 操作后,或者申请一个由其他线程持有的独占资源(比如锁)时,相应的线程就会处于该状态。
**WAITING**:线程处于无时间限制的等待状态。
**TIMED_WAITING**:有时间限制的等待状态,如果在指定时间内并没有执行的特定的操作,则该线程自动转换为 RUNABLE。
**TERMINATED**`Thread.run()`正常返回或者由于抛出异常而提前终止,则对应的线程都会处于终止状态。
各个状态之间的转换关系如下图:
![线程完整生命周期](D:\Full-Stack-Notes\pictures\线程完整生命周期.jpg)
## 二、线程同步机制

View File

@ -0,0 +1,744 @@
# Linux 常用Shell命令
<nav>
<a href="#一Linux目录结构">一、Linux目录结构</a><br/>
<a href="#二帮助命令">二、帮助命令</a><br/>
<a href="#三Yum相关命令">三、Yum相关命令</a><br/>
<a href="#四服务相关命令">四、服务相关命令</a><br/>
<a href="#五常用系统命令">五、常用系统命令</a><br/>
<a href="#六状态检测命令">六、状态检测命令</a><br/>
<a href="#七目录相关命令">七、目录相关命令</a><br/>
<a href="#八文件编辑命令">八、文件编辑命令 </a><br/>
<a href="#九文件管理命令">九、文件管理命令</a><br/>
<a href="#十压缩与搜索命令">十、压缩与搜索命令</a><br/>
<a href="#十一用户管理相关命令">十一、用户管理相关命令</a><br/>
<a href="#十二文件权限相关命令">十二、文件权限相关命令</a><br/>
<a href="#十三Vim编辑器常用命令">十三、Vim编辑器常用命令</a><br/>
<a href="#十四输入输出重定向">十四、输入输出重定向</a><br/>
</nav>
## 一、Linux目录结构
| 目录名称 | 应放置文件的内容 |
| ----------- | --------------------------------------------------------- |
| /boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
| /dev | 以文件形式存放任何设备与接口 |
| /etc | 配置文件 |
| /home | 用户主目录 |
| /bin | 存放单用户模式下还可以操作的命令 |
| /lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
| /sbin | 开机过程中需要的命令 |
| /media | 用于挂载设备文件的目录 |
| /opt | 放置第三方的软件 |
| /root | 系统管理员的家目录 |
| /srv | 一些网络服务的数据文件目录 |
| /tmp | 任何人均可使用的“共享”临时目录 |
| /proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
| /usr/local | 用户自行安装的软件 |
| /usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
| /usr/share | 帮助与说明文件,也可放置共享文件 |
| /var | 主要存放经常变化的文件,如日志 |
| /lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
## 二、帮助命令
想要查看某个命令的帮助信息,可以使用 man 命令。执行 man 命令后,就进入到浏览页面,浏览页面常用按键及其用途如下:
| 按键 | 用处 |
| --------- | ---------------------------------- |
| 空格键 | 向下翻一页 |
| PaGe down | 向下翻一页 |
| PaGe up | 向上翻一页 |
| home | 直接前往首页 |
| end | 直接前往尾页 |
| / | 从上至下搜索某个关键词,如“/linux” |
| ? | 从下至上搜索某个关键词,如“?linux” |
| n | 定位到下一个搜索到的关键词 |
| N | 定位到上一个搜索到的关键词 |
| q | 退出帮助文档 |
## 三、Yum相关命令
| 命令 | 列出所有仓库 |
| ------------------------- | ---------------------------- |
| yum repolist all | 列出所有仓库 |
| yum list all | 列出仓库中所有软件包 |
| yum info 软件包名称 | 查看软件包信息 |
| yum install 软件包名称 | 安装软件包 |
| yum reinstall 软件包名称 | 重新安装软件包 |
| yum update 软件包名称 | 升级软件包 |
| yum remove 软件包名称 | 移除软件包 |
| yum clean all | 清除所有仓库缓存 |
| yum check-update | 检查可更新的软件包 |
| yum grouplist | 查看系统中已经安装的软件包组 |
| yum groupinstall 软件包组 | 安装指定的软件包组 |
| yum groupremove 软件包组 | 移除指定的软件包组 |
| yum groupinfo 软件包组 | 查询指定的软件包组信息 |
## 四、服务相关命令
服务的启动、重启、停止、重载、查看状态等常用命令如下:
| System V init 命令RHEL 6系统 | systemctl命令RHEL 7 系统) | 作用 |
| -------------------------------- | ----------------------------- | ------------------------------ |
| service foo start | systemctl start foo.service | 启动服务 |
| service foo restart | systemctl restart foo.service | 重启服务 |
| service foo stop | systemctl stop foo.service | 停止服务 |
| service foo reload | systemctl reload foo.service | 重新加载配置文件(不终止服务) |
| service foo status | systemctl status foo.service | 查看服务状态 |
服务开机启动、不启动、查看各级别下服务启动状态等常用命令:
| System V init 命令RHEL 6系统 | systemctl命令RHEL 7 系统) | 作用 |
| -------------------------------- | ---------------------------------------- | ---------------------------------- |
| chkconfig foo in | systemctl enable foo.service | 开机自动启动 |
| chkconfig foo off | systemctl disable foo.service | 开机不自动启动 |
| chkconfig foo | systemctl is-enable foo.service | 查看特定服务是否为开启自动启动 |
| chkconfig --list | systemctl list-unit-files --type=service | 查看各个级别下服务的启动与禁用情况 |
## 五、常用系统命令
### 1. echo
echo 命令用于在终端输出字符串或变量提取后的值格式为echo [字符串 | $变量]。
```shell
[root@hadoop001 ~]# echo hello
hello
[root@hadoop001 ~]# echo $JAVA_HOME
/usr/java/jdk1.8.0_201
```
### 2. date
date 命令用于显示及设置系统的时间或日期。
**表: date命令中的参数以及作用**
| 参数 | 作用 |
| ---- | -------------- |
| %t | 跳格[Tab键] |
| %H | 小时0023 |
| %I | 小时0012 |
| %M | 分钟0059 |
| %S | 秒0059 |
| %j | 今年中的第几天 |
按照默认格式查看当前时间:
```shell
[root@hadoop001 ~]# date
2019年 07月 02日 星期二 14:07:34 CST
```
按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的date命令如下所示
```shell
[root@hadoop001 ~]# date "+%Y-%m-%d %H:%M:%S"
2019-07-02 14:07:52
```
设置系统时间:
```shell
[root@hadoop001 ~]# date -s "20190702 14:10:10"
2019年 07月 02日 星期二 14:10:10 CST
```
### 3. reboot
reboot 命令用于重启系统,其格式为 reboot。
### 4. poweroff
poweroff 命令用于关闭系统,其格式为 poweroff。
### 5. wget
wget 命令用于在终端中下载网络文件,格式为: wget [参数] 下载地址。
**表wget 命令的参数以及作用**
| 参数 | 作用 |
| ---- | ------------------------------------ |
| -b | 后台下载模式 |
| -P | 下载到指定目录 |
| -t | 最大尝试次数 |
| -c | 断点续传 |
| -p | 下载页面内所有资源,包括图片、视频等 |
| -r | 递归下载 |
示例:下载百度首页的内容到`/usr/baidu`目录下:
```shell
[root@hadoop001 usr]# wget -r -p www.baidu.com -P /usr/baidu
```
### 6. ps
ps 命令用于查看系统中的进程状态格式为ps [参数] ,常用参数如下:
| 参数 | 作用 |
| ---- | ---------------------------------- |
| -a | 显示所有进程(包括其他用户的进程) |
| -u | 用户以及其他详细信息 |
| -x | 显示没有控制终端的进程 |
在 Linux 系统中有5种常见的进程状态分别为运行、中断、不可中断、僵死与停止其各自含义如下所示。
- **R运行**:进程正在运行或在运行队列中等待。
- **S中断**:进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。
- **D不可中断**进程不响应系统异步信号即便用kill命令也不能将其中断。
- **Z僵死**:进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
- **T停止**:进程收到停止信号后停止运行。
示例如下:
```shell
[root@hadoop001 usr]# ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2688 0.0 0.0 110092 856 tty1 Ss+ 13:45 0:00 /sbin/agetty --
root 3679 0.0 0.1 115572 2216 pts/0 Ss 13:52 0:00 -bash
root 12471 0.0 0.1 155360 1888 pts/0 R+ 14:17 0:00 ps -u
```
各个参数的含义如下:
| USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
| ------------ | -------- | ------------ | ---------- | ------------------------ | -------------------------- | -------- | -------- | ------------ | ----------------- | -------------- |
| 进程的所有者 | 进程ID号 | 运算器占用率 | 内存占用率 | 虚拟内存使用量(单位是KB) | 占用的固定内存量(单位是KB) | 所在终端 | 进程状态 | 被启动的时间 | 实际使用CPU的时间 | 命令名称与参数 |
### 7. top
top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。
```shell
top - 14:21:25 up 35 min, 1 user, load average: 0.00, 0.02, 0.05
Tasks: 104 total, 1 running, 103 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 1882148 total, 1316728 free, 203592 used, 361828 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1497748 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3680 root 20 0 113444 1776 1344 S 0.3 0.1 0:06.45 bash
13685 root 20 0 161880 2200 1560 R 0.3 0.1 0:00.09 top
1 root 20 0 193696 6656 4180 S 0.0 0.4 0:03.10 systemd
```
top 命令执行结果的前5行为系统整体的统计信息其所代表的含义如下
**第1行**系统时间、运行时间、登录终端数、系统负载三个数值分别为1分钟、5分钟、15分钟内的平均值数值越小意味着负载越低
**第2行**:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
**第3行**用户占用资源百分比us、系统内核占用资源百分比sy、改变过优先级的进程资源百分比ni、空闲的资源百分比id等。其中数据均为CPU数据并以百分比格式显示例如`98.7 id`意味着有 98.7% 的 CPU 处理器资源处于空闲。
**第4行**:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。
**第5行**:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。
### 8. pidof
pidof 命令用于查询某个指定服务进程的 PID 值格式为pidof \[参数][服务名称]。
### 9. kilL
kill 命令用于终止某个指定 PID 的服务进程格式为kill \[参数][进程 PID]。
### 10. killall
killall 命令用于终止某个指定名称的服务所对应的全部进程格式为killall \[参数][服务名称]。
## 六、状态检测命令
### 1. ifconfig
ifconfig 命令用于获取网卡配置与网络状态等信息格式为ifconfig \[网络设备][参数]。
### 2. uname
uname 命令用于查看系统内核与系统版本等信息格式为uname [-a]。-a 参数用来查看详细信息,主要有内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。
```shell
[root@hadoop001 ~]# uname -a
Linux hadoop001 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
如果要查看当前系统版本的详细信息,可以使用如下命令:
```shell
[root@hadoop001 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```
### 3. uptime
uptime 用于查看系统的负载信息。显示**当前系统时间**、**系统已运行时间**、**启用终端数量**以及**平均负载值**等信息。平均负载值指的是系统在最近1分钟、5分钟、15分钟内的压力情况。
```shell
[root@hadoop001 ~]# uptime
14:32:06 up 46 min, 1 user, load average: 0.00, 0.01, 0.05
```
### 4. free
free 用于显示当前系统中内存的使用量信息格式为free [-h]。 执行`free -h`命令后的输出信息如下:
| | 内存总量 | 已用量 | 可用量 | 进程共享的内存量 | 磁盘缓存的内存量 | 缓存的内存量 |
| ----- | -------- | ------ | ------ | ---------------- | ---------------- | ------------ |
| | total | used | free | shared | buffers | cached |
| Mem: | 1.8G | 198M | 1.3G | 8.5M | 353M | 1.4G |
| Swap: | 2.0G | 0B | 2.0G | | | |
swap 全称为 swap place即交换区当内存不够的时候被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候就从交换区重新加载到内存否则它不会主动交换到真实内存中。
### 5. who
who 用于查看当前登入主机的用户终端信息格式为who [参数]。
```
[root@hadoop001 ~]# who
```
**表: 执行who命令的结果**
| 登陆的用户名 | 终端设备 | 登陆到系统的时间 |
| ------------ | -------- | ---------------- |
| rootpts/0 | pts/0 | 2019-07-02 13:52 |
### 6. last
last 命令用于查看所有系统的登录记录格式为last [参数]。
### 7. history
history 命令用于显示历史执行过的命令格式为history [-c]默认显示最近1000条命令记录。可以使用 `!序号` 的方式来重复执行某条命令。
### 8. sosreport
sosreport 命令用于收集系统配置及架构信息并输出诊断文档。使用时如果找不到该命令,则需要先使用`yum install sos`命令来安装 sos 包。
## 七、目录相关命令
### 1. pwd
显示当前所在的路径信息。
### 2. cd
切换到指定目录,`cd -`命令返回到上一次所处的目录。
### 3. ls
显示当前路径下的文件信息。想要查看文件的详细信息可以使用`ls -l `,也可以简写为`ll`
## 八、文件编辑命令
### 1. cat
cat 命令用于查看内容较少的纯文本文件格式为cat \[选项][文件]。常用参数为`-n`,代表带行号显示。
### 2. more
more 命令用于查看内容较多的纯文本文件格式为more [选项]文件。可以使用空格键或回车键向下翻页。
### 3.head
head 命令用于查看纯文本文档的前N行格式为head \[选项][文件]。
```shell
head -n 20 hdfs-site.xml
```
### 4. tail
tail 命令用于查看纯文本文档的后N行或持续刷新内容格式为tail \[选项][文件]。
```shell
head -n 20 hdfs-site.xml
```
tail 命令可以持续观察一个文件新写入的内容此时命令为tail -f 文件名。
### 5. stat
stat 命令用于查看文件的具体存储信息和时间等信息,示例如下:
```shell
[root@hadoop001 hadoop]# stat hdfs-site.xml
文件:"hdfs-site.xml"
大小1021 块8 IO 块4096 普通文件
设备fd00h/64768d Inode3305180 硬链接1
权限:(0644/-rw-r--r--) Uid( 1106/ UNKNOWN) Gid( 4001/ UNKNOWN)
环境unconfined_u:object_r:usr_t:s0
最近访问2019-07-02 14:50:22.700674460 +0800
最近更改2019-04-30 16:06:24.421716553 +0800
最近改动2019-04-30 16:06:24.423716557 +0800
创建时间:-
```
### 6. diff
diff 命令用于比较多个文本文件的差异格式为diff [参数] 文件。 常用参数如下:
- 使用`-c`参数来详细比较出多个文件的差异之处
- 使用`--brief`参数来确认两个文件是否不同。
```shell
diff -c diff_A.txt diff_B.txt
diff --brief diff_A.txt diff_B.txt
```
## 九、文件管理命令
### 1. touch
touch 命令用于创建空白文件或设置文件的时间格式为touch \[选项][文件]。常用参数如下:
| 参数 | 作用 |
| ---- | ----------------------- |
| -a | 仅修改读取时间atime |
| -m | 仅修改修改时间mtime |
| -d | 同时修改atime与mtime |
```shell
[root@hadoop001 hadoop]# touch -d "2018-08-08 08:08" hdfs-site.xml
```
### 2. mkdir
mkdir 命令用于创建空白的目录格式为mkdir [选项] 目录。常用参数为`-p`,代表递归创建:
```shell
mkdir -p a/b/c/d/e
```
### 3. cp
cp 命令用于复制文件或目录,格式为:`cp [选项] 源文件 目标文件`。 常用参数如下:
| 参数 | 作用 |
| ---- | -------------------------------------------- |
| -p | 保留原始文件的属性 |
| -d | 若对象为“链接文件”,则保留该“链接文件”的属性 |
| -r | 递归持续复制(用于目录) |
| -i | 若目标文件存在则询问是否覆盖 |
| -a | 相当于 -pdrp、d、r为上述参数 |
### 4. mv
mv 命令用于剪切文件或将文件重命名,格式为:`mv [选项] 源文件 [目标路径|目标文件名]`。 如果在同一个目录中对一个文件进行剪切操作,等价于对其进行重命名:
```shell
mv yarn-site.xml hello.xml
```
### 5. rm
rm 命令用于删除文件或目录格式为rm [选项] 文件。 常用参数如下:
- `-f`:参数来强制删除;
- `-r` :参数递归删除文件夹。
### 6. file
file 命令用于查看文件的类型格式为file 文件名。
```shell
[root@hadoop001 hadoop]# file yarn-site.xml
yarn-site.xml: XML 1.0 document, UTF-8 Unicode text
```
## 十、压缩与搜索命令
### 1. tar
tar 命令用于对文件进行压缩或解压格式为tar \[选项] [文件]。 常用参数如下:
| 参数 | 作用 |
| ---- | ---------------------- |
| -c | 创建压缩文件 |
| -x | 解开压缩文件 |
| -t | 查看压缩包内有哪些文件 |
| -z | 用Gzip压缩或解压 |
| -j | 用bzip2压缩或解压 |
| -v | 显示压缩或解压的过程 |
| -f | 目标文件名 |
| -p | 保留原始的权限与属性 |
| -P | 使用绝对路径来压缩 |
| -C | 指定解压到的目录 |
常用打包命令:`tar -czvf 压缩包名称.tar.gz 要打包的目录`
常用解压命令:`tar -xzvf 压缩包名称.tar.gz`
### 2. grep
grep 命令用于执行关键词搜索并显示匹配的结果格式为grep \[选项][文件]。 常用参数如下:
| 参数 | 作用 |
| ---- | ------------------------------------------------ |
| -b | 将可执行文件binary当作文本文件text来搜索 |
| -c | 仅显示找到的行数 |
| -i | 忽略大小写 |
| -n | 显示行号 |
| -v | 反向选择——仅列出没有关键词的行。 |
```shell
[root@hadoop001 hadoop]# cat core-site.xml | grep hadoop -n
22: <value>hdfs://hadoop001:8020</value>
25: <name>hadoop.proxyuser.root.hosts</name>
29: <name>hadoop.proxyuser.root.groups</name>
```
### 3. find
find 命令用于按照指定条件来查找文件,格式为:`find [查找路径] 寻找条件 操作`。 常用命令如下:
| 参数 | 作用 |
| ------------------ | ------------------------------------------------------------ |
| -name | 匹配名称 |
| -perm | 匹配权限mode为完全匹配-mode为包含即可 |
| -user | 匹配所有者 |
| -group | 匹配所有组 |
| -mtime -n +n | 匹配修改内容的时间(-n指n天以内+n指n天以前 |
| -atime -n +n | 匹配访问文件的时间(-n指n天以内+n指n天以前 |
| -ctime -n +n | 匹配修改文件权限的时间(-n指n天以内+n指n天以前 |
| -nouser | 匹配无所有者的文件 |
| -nogroup | 匹配无所有组的文件 |
| -newer f1 !f2 | 匹配比文件f1新但比f2旧的文件 |
| --type b/d/c/p/l/f | 匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件) |
| -size | 匹配文件的大小(+50KB为查找超过50KB的文件而-50KB为查找小于50KB的文件 |
| -prune | 忽略某个目录 |
| -exec …… {}\; | 后面可跟用于进一步处理搜索结果的命令 |
获取到指定目录中所有以 host 开头的文件列表,可以执行如下命令:
```shell
find /etc -name "host*" -print
```
## 十一、用户管理相关命令
### 1. useradd
useradd 命令用于创建新的用户格式为useradd [选项] 用户名。使用该命令创建用户账户时,默认的用户家目录会被存放在`/home`目录中,默认的 Shell 解释器为`/bin/bash`,默认会创建一个与该用户同名的基本用户组。常用配置如下:
| 参数 | 作用 |
| ---- | ---------------------------------------- |
| -d | 指定用户的家目录(默认为/home/username |
| -e | 账户的到期时间格式为YYYY-MM-DD. |
| -u | 指定该用户的默认UID |
| -g | 指定一个初始的用户基本组(必须已存在) |
| -G | 指定一个或多个扩展用户组 |
| -N | 不创建与用户同名的基本用户组 |
| -s | 指定该用户的默认 Shell 解释器 |
```shell
[root@hadoop001 ~]# useradd heibaiying
[root@hadoop001 ~]# id heibaiying
uid=1000(heibaiying) gid=1000(heibaiying) 组=1000(heibaiying)
```
UID就相当是用户的唯一标识其赋值规则如下
- 管理员UID为0系统的管理员用户。
- 系统用户UID为1999 Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器默认服务程序会有独立的系统用户负责运行进而有效控制被破坏范围。
- 普通用户UID从1000开始是由管理员创建的用于日常工作的用户。
### 2. groupadd
groupadd 命令用于创建用户组格式为groupadd [选项] 群组名。
### 3. usermod
创建后用户的信息保存在`/etc/passwd`文件中,可以直接对其进行编辑来修改用户参数,或使用 usermod 命令。常用参数如下:
| 参数 | 作用 |
| ----- | ------------------------------------------------------------ |
| -c | 填写用户账户的备注信息 |
| -d -m | 参数-m与参数-d连用可重新指定用户的家目录并自动把旧的数据转移过去 |
| -e | 账户的到期时间格式为YYYY-MM-DD |
| -g | 变更所属用户组 |
| -G | 变更扩展用户组 |
| -L | 锁定用户禁止其登录系统 |
| -U | 解锁用户,允许其登录系统 |
| -s | 变更默认终端 |
| -u | 修改用户的UID |
```shell
[root@hadoop001 ~]# id heibaiying
uid=9999(heibaiying) gid=1000(heibaiying) 组=1000(heibaiying)
```
### 4. passwd
passwd 命令用于设置或修改用户密码、过期时间、认证信息等格式为passwd \[选项][用户名]。常用参数如下:
| 参数 | 作用 |
| ------- | ------------------------------------------------------------ |
| -l | 锁定用户,禁止其登录 |
| -u | 解除锁定,允许用户登录 |
| --stdin | 允许通过标准输入修改用户密码如echo "NewPassWord" \| passwd --stdin Username |
| -d | 使该用户可用空密码登录系统 |
| -e | 强制用户在下次登录时修改密码 |
| -S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
```shell
[root@hadoop001 ~]# passwd
更改用户 root 的密码 。
新的 密码:
重新输入新的 密码:
passwd所有的身份验证令牌已经成功更新。
```
### 5. userdel
userdel 命令用于删除用户格式为userdel [选项] 用户名。常用参数如下:
| 参数 | 作用 |
| ---- | ------------------------ |
| -f | 强制删除用户 |
| -r | 同时删除用户及用户家目录 |
## 十二、文件权限相关命令
使用 `ll` 命令可以查看到文件的详细属性,各个属性的含义如下:
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/文件属性信息.png"/> </div>
- -:普通文件。
- d目录文件。
- l链接文件。
- b块设备文件。
- c字符设备文件。
- p管道文件。
### 1. chmod
chmod 用于设置文件或目录的权限格式为chmod [参数] 权限 文件或目录名称。 权限支持字符表示和数字表示两种形式,其对应关系如下:
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/文件权限的字符与数字表示.png"/> </div>
示例如下:
```
[root@hadoop001 ~]# ll test.txt
-rw-r--r--. 1 root root 0 7月 3 14:49 test.txt
[root@hadoop001 ~]# chmod 760 test.txt
[root@hadoop001 ~]# ll test.txt
-rwxrw----. 1 root root 0 7月 3 14:49 test.txt
```
### 2. chown
chown 设置文件或目录的所有者和所属组格式为chown [参数] 所有者:所属组 文件或目录名称。
```shell
[root@hadoop001 ~]# stat test.txt
......
权限:(0760/-rwxrw----) Uid( 0/ root) Gid( 0/ root)
......
[root@hadoop001 ~]# chown heibaiying:heibaiying test.txt
[root@hadoop001 ~]# stat test.txt
......
权限:(0760/-rwxrw----) Uid( 9999/heibaiying) Gid( 1000/heibaiying)
......
```
### 3. 软硬链接
**硬链接hard link**可以将它理解为一个“指向原始文件inode的指针”系统不为它分配独立的inode和文件。所以硬链接文件与原始文件其实是同一个文件只是名字不同。我们每添加一个硬链接该文件的inode连接数就会增加1而且只有当该文件的inode连接数为0时才算彻底将它删除。换言之由于硬链接实际上是指向原文件inode的指针因此即便原始文件被删除依然可以通过硬链接文件来访问。
**软链接(也称为符号链接[symbolic link]**仅仅包含所链接文件的路径名因此能链接目录文件也可以跨越文件系统进行链接。但是当原始文件被删除后链接文件也将失效与Windows系统中的快捷方式类似。
ln命令用于创建链接文件格式为ln [选项] 目标。常用参数如下:
| 参数 | 作用 |
| ---- | ------------------------------------------------ |
| -s | 创建符号链接(如果不带-s参数则默认创建硬链接 |
| -f | 强制创建文件或目录的链接 |
| -i | 覆盖前先询问 |
| -v | 显示创建链接的过程 |
## 十三、Vim编辑器常用命令
Vim编辑器有三种状态模式
- 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
- 输入模式:正常的文本录入。
- 末行模式:保存或退出文档,以及设置编辑环境。
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/vim不同模式间的切换.png"/> </div>
命令模式中常用的命令如下:
| 命令 | 作用 |
| ---- | -------------------------------------------------- |
| dd | 删除(剪切)光标所在整行 |
| 5dd | 删除剪切从光标处开始的5行 |
| yy | 复制光标所在整行 |
| 5yy | 复制从光标处开始的5行 |
| n | 显示搜索命令定位到的下一个字符串 |
| N | 显示搜索命令定位到的上一个字符串 |
| u | 撤销上一步的操作 |
| p | 将之前删除dd或复制yy过的数据粘贴到光标后面 |
末行模式中可用的命令如下:
| 命令 | 作用 |
| ------------- | --------------------------------------- |
| :w | 保存 |
| :q | 退出 |
| :q! | 强制退出(放弃对文档的修改内容) |
| :wq! | 强制保存退出 |
| :set nu | 显示行号 |
| :set nonu | 不显示行号 |
| :命令 | 执行该命令 |
| :整数 | 跳转到该行 |
| :s/one/two | 将当前光标所在行的第一个 one 替换成 two |
| :s/one/two/g | 将当前光标所在行的所有 one 替换成 two |
| :%s/one/two/g | 将全文中的所有 one 替换成 two |
| ?字符串 | 在文本中从下至上搜索该字符串 |
| /字符串 | 在文本中从上至下搜索该字符串 |
使用 a、 i、 o 三个键从命令模式切换到输入模式。其中, a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,而 **o 键则是在光标的下面再创建一个空行**,此时可敲击 a 键进入到编辑器的输入模式。
## 十四、输入输出重定向
输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。同时输出重定向又分为标准输出重定向和错误输出重定向。
- 标准输入重定向STDIN文件描述符为0默认从键盘输入也可从其他文件或命令中输入。
- 标准输出重定向STDOUT文件描述符为1默认输出到屏幕。
- 错误输出重定向STDERR文件描述符为2默认输出到屏幕。
输入重定向中用到的符号及其作用如下:
| 符号 | 作用 |
| -------------------- | -------------------------------------------- |
| 命令 < 文件 | 将文件作为命令的标准输入 |
| 命令 << 分界符 | 从标准输入中读入直到遇见分界符才停止 |
| 命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
输出重定向中用到的符号及其作用如下:
| 符号 | 作用 |
| ------------------------------------- | ------------------------------------------------------------ |
| 命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
| 命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
| 命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
| 命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
| 命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
## 参考资料
[《Linux 就该这么学》刘遄](https://www.linuxprobe.com/chapter-00.html)

112
notes/RabbitMQ简介.md Normal file
View File

@ -0,0 +1,112 @@
# RabbitMQ 简介
## 一、简介
RabbitMQ 是目前最为广泛使用的开源消息中间件,它具备以下的特点:
支持多种消息传递协议,拥有丰富的交换器类型,能够将消息灵活路由到各个队列;
轻量级,支持多种部署方式,易于部署在公共云和私有云中;
支持跨语言开发Java.NETPHPPythonJavaScriptRubyGo
可以通过集群来实现高可用性和高吞吐,还可以通过 Federation 插件来连接不同的服务;
插拔式的身份验证和授权支持TLS和LDAP
支持持续集成,能够使用各种工具和插件进行灵活地扩展;
能够使用多种方式进行监控和管理,如 HTTP-API命令行工具和 UI 界面。
## 二、模型架构
![rabbitmq-架构](D:\Full-Stack-Notes\pictures\rabbitmq-架构.jpg)
### 2.1 核心概念
**1. Exchange交换器**
负责将消息路由到一个或者多个队列中。
**2. Queue消息队列**
用于存储消息。多个消费者可以订阅同一个消息队列,此时候队列中的消息会被平均分配给多个消费者进行处理。
**3. BindingKey (绑定键)**
交换器与队列通过 BindingKey 进行绑定。
**4. Routingkey (路由键)**
生产者将消息发给交换器的时候,一般会指定一个 RountingKey用来指定这个消息的路由规则。当 RountingKey 与 BindingKey 在规则上相符合时,消息被路由到对应的队列中。
### 2.2 运转流程
**生产者发送消息过程**
1. 生产者连接到RabbitMQ Broker , 建立一个连接Connection, 开启一个信道Channel
2. 生产者声明一个交换器,并设置相关属性;
3. 生产者声明一个队列并设置相关属性;
4. 生产者通过路由键将交换器与队列绑定起来;
5. 生产者发送消息至 RabbitMQ Broker ,其中包含路由键、交换器等信息;
6. 相应的交换器根据接收到的路由键查找相应的匹配队列;
7. 如果找到,则将从生产者发送过来的消息存入相应的队列中;
8. 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者;
9. 关闭信道;
10. 关闭连接。
**消费者接收消息的过程**
1. 消费者连接到 RabbitMQ Broker, 建立一个连接Connection, 开启一个信道Channel
2. 消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数;
3. 等待 RabbitMQ Broker 回应并投递相应对列中的消息,消费者接收消息;
4. 消费者确认ack接收到的消息
5. RabbitMQ 从队列中删除相应已经被确认的消息;
6. 关闭信道;
7. 关闭连接。
### 2.3 连接与信道
生产者和消费者都需要与 Broker 建立 TCP 连接,但由于创建和销毁 TCP 的操作非常昂贵,所以 RabbitMQ 采用了连接复用的方式,在同一个 TCP 连接上建立多个互相独立的信道。
## 三、交换器类型
### 3.1 fanout
把消息路由到与该交换器绑定的所有队列中。
### 3.2 direct
把消息路由到 BindingKey 和 RountingKey 完全一样的队列中。
### 3.3 topic
将消息路由到 BindingKey 和 RountingKey 相匹配的队列中,匹配规则如下:
- RountingKey 和 BindingKey 由多个单词使用`.`号进行连接;
- BindingKey 支持两个特殊符号:`#``*` 。其中`*`用于匹配一个单词,`#`用于匹配零个或者多个单词。
以下是官方文档中的示例,交换器与队列的 BindingKey 如图所示:
![topic-exchange](D:\Full-Stack-Notes\pictures\topic-exchange.png)
+ 路由键为`lazy.orange.elephant`的消息会发送给所有队列;
+ 路由键为`quick.orange.fox`的消息只会发送给第一个队列;
+ 路由键为`lazy.brown.fox`的消息只会发送给第二个队列;
+ 路由键为`lazy.pink.rabbit`的消息只会发送给第二个队列;
+ 路由键为`quick.brown.fox`的消息与任何绑定都不匹配;
+ 路由键为`orange``quick.orange.male.rabbit`的消息也与任何绑定都不匹配。
### 3.4 headers
在 Queue 与 Exchange 进行绑定时可以指定一组键值对作为 BindingKey在发送消息的 headers 中的可以指定一组键值对属性,当这些属性与 BindingKey 相匹配时,则将消息路由到该队列。同时还可以使用 `x-match`指定匹配模式:
- **x-match = all** :所有的键值对都相同才算匹配成功;
- **x-match = any**:只要有一个键值对相同就算匹配成功。
## 四、死信队列

View File

@ -0,0 +1,169 @@
# RabbitMQ 单机环境搭建
## 一、前置条件
RabbitMQ 由 Erlang 语言所编写,所以在安装 RabbitMQ 前需要安装 Erlang 。两者的版本兼容关系如下。本篇文章选用的 RabbitMQ 版本为 3.7.15 Erlang 版本为 22.0 。
| RabbitMQ version | Minimum required Erlang/OTP | Maximum supported Erlang/OTP |
| :----------------------------------------------------------- | :-------------------------- | :--------------------------- |
| 3.7.15 | 20.3.x | 22.0.x |
| 3.7.7 ~ 3.7.14 | 20.3.x | 21.3.x |
| 3.7.0 ~ 3.7.6 | 19.3 | 20.3.x |
> 表格来源https://www.rabbitmq.com/which-erlang.html
## 二、Erlang 安装
### 2.1 下载并解压
Erlang 源码包下载地址http://erlang.org/download/ ,下载后进行解压:
```shell
# 下载
wget http://erlang.org/download/otp_src_22.0.tar.gz
# 解压
tar -zxvf otp_src_22.0.tar.gz
```
### 2.2 编译和安装
Erlang 的编译过程中使用到了 `ncurses-devel` 库,需要预先安装:
```
yum install ncurses-devel
```
进入解压后的根目录:
```shell
# 配置安装目录
./configure --prefix=/usr/app/erlang
# 编译
make
# 安装
make install
```
### 2.3 验证安装结果
进入安装目录的 bin 目录下,执行 `erl`命令,出现对应的版本号信息则代表安装成功:
```shell
[root@hadoop001 bin]# ./erl
Erlang/OTP 22 [erts-10.4] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1]
Eshell V10.4 (abort with ^G)
```
### 2.4 配置环境变量
```she
vim /etc/profile
```
配置环境变量:
```shell
export ERLANG_HOME=/usr/app/erlang
export PATH=$PATH:$ERLANG_HOME/bin
```
使得配置的环境变量立即生效:
```shell
source /etc/profile
```
## 三、RabbitMQ 安装
### 3.1 下载并解压
从 RabbitMQ 的 GitHub 仓库进行下载地址为https://github.com/rabbitmq/rabbitmq-server/releases/
```shell
# 下载
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz
# 解压
tar -Jxf rabbitmq-server-generic-unix-3.7.15.tar.xz
```
### 3.2 配置环境变量
```she
vim /etc/profile
```
配置环境变量:
```shell
export RABBITMQ_HOME=/usr/app/rabbitmq_server-3.7.15
export PATH=$PATH:$RABBITMQ_HOME/sbin
```
使得配置的环境变量立即生效:
```shell
source /etc/profile
```
### 3.3 启动 RabbitMQ 服务
以后台守护进程的方式启动 RabbitMQ ,命令如下:
```shell
rabbitmq-server start -detached
```
### 3.4 查看服务状态
```shell
rabbitmqctl status
```
## 四、Web UI界面
### 4.1 启动 Web UI
想要使用 RabbitMQ 的 Web UI 界面,需要启动管理插件,命令如下:
```shell
rabbitmq-plugins enable rabbitmq_management
```
访问端口为 `15672`。默认的用户名和密码都是 `guest` 。如果你所用浏览器和 RabbitMQ 服务不在同一台主机上,此时应该无法登录,并出现下面的提示
![RabbitMQ-访问限制](D:\Full-Stack-Notes\pictures\RabbitMQ-访问限制.png)
之所以会出现这个提示是因为出于安全考虑RabbitMQ 只允许在本机使用默认的`guest`用户名登录。想要在其他主机上登录,可以使用自定义的账户。
### 4.2 新增账户
新增用户,用户名和密码都是 root
```sh
rabbitmqctl add_user root root
```
赋予用户在默认的名为 `/` 的 Virtual Host 上的所有权限:
```shell
rabbitmqctl set_permissions -p / root '.*' '.*' '.*'
```
设置用户的角色为管理员:
```
rabbitmqctl set_user_tags root administrator
```
### 4.3 使用新账户登录
登录后可以查看到RabbitMQ 和 Erlang 的版本号,以及对应的账户信息:
![rabbitmq-管控台](D:\Full-Stack-Notes\pictures\rabbitmq-管控台.png)

View File

@ -0,0 +1,58 @@
# Redis 单机环境搭建
### 一、下载并解压
下载地址http://download.redis.io/releases/ ,下载后进行解压:
```shell
# 下载
http://download.redis.io/releases/redis-5.0.5.tar.gz
# 解压
tar -zxvf redis-5.0.5.tar.gz
```
### 二、编译
进入解压后的根目录,执行下面的命令:
```shell
make
```
### 三、启动服务
进入`src`目录,执行下面的命令,启动 Redis 服务:
```shell
redis-server
```
### 四、启动客户端
`src`目录下,执行以下命令启动客户端:
```shell
# 不加任何参数默认连接的也是 127.0.0.1:6379
redis-cli -h 127.0.0.1 -p 6379
```
### 五、修改访问配置
默认情况下,不能从其他主机访问 Redis 服务。如果想要从其他主机访问 Redis 服务,需要修改根目录下的` redis.conf`
```shell
bind 127.0.0.1
```
默认绑定的是本机地址,可以改成其他地址。如果想要所有主机都能访问,需要注释掉上面一行,同时将保护模式关闭:
```shell
protected-mode no
```
修改完成后,以指定配置的方式启动:
```shell
./redis-server ../redis.conf
```

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB