测试Web服务时,可以直接在PyCharm代码编辑器中创建,编辑和执行HTTP请求
HTTP请求存储在.http和.rest文件中
1、创建HTTP请求文件
在文件菜单,点New 创建 HTTP Request
2、写HTTP请求
格式如下1
2
3
4Method Request-URI HTTP-Version
Header-field: Header-value
Request-Body
Supervisor是个客户端/服务器系统可以在类UNIX操作系统上管理一些进程
Supervisord将进程作为其子进程启动,并且可以配置为在崩溃时自动重新启动它们。它还可以自动配置为自行调用启动进程
如果以root用户身份启动Supervisor,则可以允许普通用户控制此类进程。 Supervisorctl允许用户通过简单的shell或Web UI发出”停止”,”启动”和”重新启动”命令来查看进程状态并管理受supervisord控制的子进程
进程通常需要成组地启动和停止,有时甚至需要按照”优先级顺序”执行。 Supervisor允许您为进程分配优先级,并允许用户通过supervisorctl发出命令,如”全部启动”和”全部重新启动”,这将按照预先分配的优先级顺序启动它们。此外,可以将进程分为”进程组”,并且可以将一组逻辑相关的进程作为一个单元停止和启动。
supervisor的服务器端为supervisord ,它负责自行调用启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdout和stderr输出。
服务进程使用配置文件,通常位于 /etc/supervisord.conf. 这个文件是 “Windows-INI” 类型的配置文件. 保持这个文件在文件系统的安全很重要, 因为它可能包含未加密的用户名和密码。
supervisor的客户端命令行部分是supervisorctl. 它提供了类似shell的接口访问 supervisord的功能. 通过 supervisorctl用户可以连接不同的 supervisord进程 (同时), 获取子进程的状态, 停止和启动子进程, 获取supervisord正在运行的子进程列表.
激活配置文件的[inet_http_server]部分后,可以访问URL(例如http://localhost:9001 )以通过Web界面查看和控制进程状态
1 | pip install supervisor |
安装完 supervisor 之后,可以运行echo_supervisord_conf 命令输出默认的配置项,也可以重定向到一个配置文件里1
echo_supervisord_conf > /etc/supervisord.conf
1、主要配置项1
2
3
4[supervisord]
logfile=/tmp/supervisord.log ; supervisord 主要的日志文件
[include]
files = /etc/supervisor/*.ini ; 加载需要管理程序的配置文件
2、需要管理程序的配置文件格式如下,例如需要管理elasticsearch的配置文件,命名为 es1.ini,program中的es1代表程序的唯一标识,不能重复1
2
3
4
5
6
7
8
9
10
11[program:es1]
command = /home/elastic/elasticsearch-7.4.2/bin/elasticsearch ;启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = es ;启动用户
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 100MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
stdout_logfile = /var/log/es1/es1.log ; stdout日志文件
1 | supervisord -c /etc/supervisord.conf |
查看 supervisord 是否在运行:1
ps aux | grep supervisord
1、后台进程
supervisord 要求管理的程序是非 daemon 程序,supervisord 会帮你把它转成 daemon 程序,因此如果用 supervisord 来管理进程,进程需要以非daemon的方式启动。
例如:管理nginx 的话,必须在 nginx 的配置文件里添加一行设置 daemon off 让 nginx 以非 daemon 方式启动
2、子进程
有时候用 Supervisor 托管的程序还会有子进程(如 Tornado),如果只杀死主进程,子进程就可能变成孤儿进程。通过这两项配置来确保所有子进程都能正确停止:
1 | stopasgroup=true |
supervisorctl 是 supervisord 的一个命令行客户端工具
输入 supervisorctl 进入交互命令1
2
3
4
5$ supervisorctl
> status # 查看程序状态
> stop es1 # 关闭 es1 程序
> start es1 # 启动 es1 程序
> restart es1 # 重启 es1 程序
除了进入 supervisorctl 的 shell 界面,也可以直接在 bash 终端运行
1 | $ supervisorctl status |
sdiff命令以并排形式显示文件差异。以下是其语法:
sdiff [OPTION]... FILE1 FILE2
sdiff file1 file2
文件1和文件2内容一样,如下
$ cat file1
1
2
3
4
5
6
$ cat file2
1
2
3
4
5
6
输出比较结果:
$ sdiff file1 file2
1 1
2 2
3 3
4 4
5 5
6 6
这意味着2个文件相同
假设文件如下:
$ cat file1
1A
2
3
4
5
6
$ cat file1
1a
2
3
4
5
6
输出:
$ sdiff file1 file2
1A | 1a
2 2
3 3
4 4
5 5
6 6
第二列第一行中的管道(|)表示两个文件在第一行本身是不同的。但是,如果需要,可以强制sdiff忽略大小写,这可以使用-i命令行选项来完成。
$ sdiff -i file1 file2
1A 1a
2 2
3 3
4 4
5 5
6 6
如果任何文件包含空格,默认情况下sdiff命令将显示差异。但是,如果需要,可以使用-Z命令行选项抑制此行为:
$ sdiff file1 file2
1a | 1a
2 2
3 3
4 4
5 5
6 6
$ sdiff -Z file1 file2
1a 1a
2 2
3 3
4 4
5 5
6 6
sdiff -s file1 file2
我们将讨论更多的命令行参数
默认情况下,文件相同时,不会产生任何输出
$ diff file1 file2
但是,存在命令参数 (-s)可以强制命令行输出此结果
$ diff -s file1 file2
Files file1 and file2 are identical
基本上,这两种格式是diff命令可以产生其输出的两种格式。使用-c命令行选项启用了复制的上下文,而使用-u启用了统一上下文。以下是前者的示例
$ diff -c file1 file2
*** file1 2016-12-29 09:36:47.175597647 +0530
--- file2 2016-12-29 09:19:55.799558326 +0530
***************
*** 1,3 ****
Hi
! Helllo
Bye
--- 1,3 ----
Hi
! Hello
Bye
因此,在“复制的上下文”输出格式中,不同的行用感叹号(!)表示。
这是统一上下文格式的示例:
$ diff -u file1 file2
--- file1 2016-12-29 09:36:47.175597647 +0530
+++ file2 2016-12-29 09:19:55.799558326 +0530
@@ -1,3 +1,3 @@
Hi
-Helllo
+Hello
Bye
在此输出格式中,在行之前的+和-符号表示不同行的版本:如果file2中缺少file1中的行,则为“-”;当file2中的行添加到file1中时,为“ +”。
diff命令还能够生成命令,“ ed”编辑器可使用该命令将原始文件(此处为示例中的file1)转换为新文件(file2)。这是您的操作方式:
假设file1和file2包含以下更改:
$ diff file1 file2
2c2
< Helllo
---
> Hello
现在,使用-e命令行选项生成“ ed”编辑器可以理解的输出,并将该输出重定向到文件中:
diff -e file1 file2 > out
输出
2c
Hello
.
接下来,您需要在out文件的末尾添加命令“ w”。
2c
Hello
.
w
现在,执行命令
ed - file1 < out
您会看到file1和file2现在相同。
$ diff file1 file2
$
存在一个命令行选项(-y),用于引导diff在两个单独的列中产生输出。这是一个例子:
$ diff -y file1 file2
Hi Hi
Helllo | Hello
Bye Bye
如您所见,此输出格式使用’|’表示不同的行。
如果您观察到上一节(上面的第4点)中显示的输出,您会注意到,使用-y命令行选项,输出中的diff-也会产生公共行。如果需要隐藏这些相同的行,可以使用–suppress-common-lines选项。
diff -y --suppress-common-lines file1 file2
Helllo | Hello
对于使用diff比较两个C语言文件的情况,有一个命令行选项(-p)指导实用程序精确显示每个更改所在的C函数。例如,假设这是两个C文件:
file1.c:
#include<stdio.h>
void compare(float x, float y)
{
if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
}
int main(void)
{
compare(1.234, 1.56789);
return 0;
}
file2.c:
#include<stdio.h>
void compare(float x, float y)
{
if(x == y)
{
printf("\n EQUAL \n");
}
}
int main(void)
{
compare(1.234, 1.56789);
return 0;
}
比较输出
$ diff file1.c file2.c
5c5
< if(x == y) // incorrect way
---
> if(x == y)
使用-p选项比较文件时:
$ diff -p file1.c file2.c
*** file1.c 2016-12-29 11:45:36.587010816 +0530
--- file2.c 2016-12-29 11:46:39.823013274 +0530
***************
*** 2,8 ****
void compare(float x, float y)
{
! if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
--- 2,8 ----
void compare(float x, float y)
{
! if(x == y)
{
printf("\n EQUAL \n");
}
如您所见,使用-p时,diff使您更详细地了解更改的位置,并使用感叹号(!)指示不同的行。
diff命令还允许您递归比较子目录,但这不是默认行为。我的意思是说,如果您采取以下情况:
$ diff diff-files/ second-diff-files/
diff diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diff命令仅比较顶级目录中的文件,但是如果使用命令行选项-r(用于递归diff),则会看到甚至比较了子目录中存在的文件:
$ diff -r diff-files/ second-diff-files/
diff -r diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2
2c2
< Hello
---
> ello
diff命令还提供了一个选项,您可以使用该选项指导该工具将不存在的文件视为空文件。例如,如果将file1与file3(不存在)进行比较,则diff的默认行为是产生错误:
$ diff file1 file3
diff: file3: No such file or directory
这本身是没有错的。实际上,这很合理。但是在某些情况下-您可能不想diff命令在这种情况下抛出错误(虽然是bash脚本的一部分,可能是吗?),那么对于这些情况,您可以使用-N命令行选项强制命令将不存在的文件视为空文件,然后继续进行比较。
$ diff -N file1 file3
1,5d0
< Hi
<
< Helllo
<
< Bye
Linux Diff 命令
diff [OPTION]... FILES
[OPTION]表示多个命令行选项,FILES 通常是2个文件名
Diff 用法
以下为2个我们想要比对的文件
file1:
test
test2
test3
file2:
test
test23
test3
比对这2个文件:
diff file1 file2
以上命令输出:
2c2
< test2
---
> test23
首先要记住的是,输出表示将file1(通常是原始文件)转换为file2(新文件或更改的文件)所需的更改。输出通常由以数字(或范围)开头,后跟字母(a,d或c)和另一个数字(或范围)的行组成。例如2c2(来自上面的输出)。
第一个数字代表从file1(原始文件)开始的行(或行的范围),而最后一个数字代表从file2(新文件)开始的行(或行的范围)。至于中间的字母,a表示添加,d表示删除,c表示更改。
因此,2c2表示原始文件中的第二行已更改,需要用新文件中的第二行替换才能使文件相同。如果您手动比较两个文件(文件1和文件2),那么您会发现情况确实如此。
至于上述示例中2c2后面的三行,以’<’开头的那一行是file1的第二行,而以’>’开头的那一行是文件2中的那一行。它们之间的三个连字符(—)仅用于分隔目的。
以下是另一个例子
file1
Hi all,
This is a diff command tutorial
from HowtoForge.
Hope you'll benefit from it.
Thanks.
file2
Hi all,
Welcome to HowtoForge.
In this tutorial, we'll discuss the diff tool.
Hope you'll find it beneficial.
Thanks.
比较命令
diff file1 file2
输出:
2,4c2,4
< This is a diff command tutorial
< from HowtoForge.
< Hope you'll benefit from it.
---
> Welcome to HowtoForge.
> In this tutorial, we'll discuss the diff tool.
> Hope you'll find it beneficial.
输出意味着原始文件(file1)中的行号2到4已更改
接下来,文件1的内容不变,改变文件2的内容如下
Welcome to HowtoForge.
In this tutorial, we'll discuss the diff tool.
Hope you'll find it beneficial.
Thanks.
Hi all,
This is a diff command tutorial
from HowtoForge.
Hope you'll benefit from it.
Thanks.
当执行比较命令的时候,输出如下
0a1,5
> Welcome to HowtoForge.
> In this tutorial, we'll discuss the diff tool.
> Hope you'll find it beneficial.
> Thanks.
>
因此,您可以看到该工具立即识别出file2中的第二段是file1包含的内容。因此,输出显示file2的第1至5行应附加在file1的开头,以使两个文件相同。
如果删除文件2的最后一行(“Thanks.”),将输出
0a1,5
> Welcome to HowtoForge.
> In this tutorial, we'll discuss the diff tool.
> Hope you'll find it beneficial.
> Thanks.
>
5d9
< Thanks.
您可以看到输出现在还包含5d9,这意味着应该删除file1中的第5行,以便使两个文件从第9行开始同步。当然,这是首先在0a1,5更改之后。
# 集群名称
cluster.name: chenkl
# 节点名称
node.name: master
# 存放数据目录,先创建该目录
path.data: /home/elastic/data
# 存放日志目录,先创建该目录
path.logs: /home/elastic/logs
# 节点IP
network.host: 192.168.25.180
# tcp端口
transport.tcp.port: 9300
# http端口
http.port: 9200
# 种子节点列表,主节点的IP地址必须在seed_hosts中
discovery.seed_hosts: ["192.168.25.180","192.168.25.181","192.168.25.182"]
# 主合格节点列表,若有多个主节点,则主节点进行对应的配置
cluster.initial_master_nodes: ["master"]
# 主节点相关配置
node.master: true
node.data: false
node.ingest: false
node.ml: false
cluster.remote.connect: false
# 跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.name: chenkl
node.name: slave1
path.data: /home/elastic/data
path.logs: /home/elastic/logs
network.host: 192.168.25.181
transport.tcp.port: 9300
http.port: 9200
discovery.seed_hosts: ["192.168.25.180","192.168.25.181","192.168.25.182"]
cluster.initial_master_nodes: ["master"]
node.master: false
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.name: chenkl
node.name: slave2
path.data: /home/elastic/data
path.logs: /home/elastic/logs
network.host: 192.168.25.182
transport.tcp.port: 9300
http.port: 9200
discovery.seed_hosts: ["192.168.25.180","192.168.25.181","192.168.25.182"]
cluster.initial_master_nodes: ["master"]
node.master: false
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false
http.cors.enabled: true
http.cors.allow-origin: "*"
cd /home/elasticsearch-7.2.0
./bin/elasticsearch
问题 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
#切换到root用户
vi /etc/sysctl.conf
#在最后追加
vm.max_map_count=262144
#使用 sysctl -p 查看修改结果
sysctl -p
curl -XGET 'http://localhost:9200/_cat/nodes?v'
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 47 96 6 1.26 1.28 0.86 dilm * node-1
127.0.0.1 26 96 6 1.26 1.28 0.86 dilm - node-2
curl -XGET 'http://localhost:9200/'
{
"name" : "node-2",
"cluster_name" : "my-es",
"cluster_uuid" : "LnsMM4p1Royo4Ea19viusw",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
cd /home/elasticsearch-7.2.0
节点1
./bin/elasticsearch -Enode.name=node-1 -Ehttp.port=9200 -Epath.data=/home/elastic/data -Epath.logs=/home/elastic/log
节点2
./bin/elasticsearch -Enode.name=node-2 -Ehttp.port=8200 -Epath.data=/home/elastic/data1 -Epath.logs=/home/elastic/log1
1 | 下载 |
发送HTTP GET请求在9200端口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20curl http://127.0.0.1:9200
{
"name" : "iZ2ze0fk8pd9zkdd29mpz6Z",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "-Jxq4rGVT_qJLnzJdnj75A",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
1、内存不足1
2
3
4
5
6
7
8
9
10
11
12
13
14Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
output:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid29117.log
error:
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Not enough space' (errno=12)
at org.elasticsearch.tools.launchers.JvmErgonomics.flagsFinal(JvmErgonomics.java:111)
at org.elasticsearch.tools.launchers.JvmErgonomics.finalJvmOptions(JvmErgonomics.java:79)
at org.elasticsearch.tools.launchers.JvmErgonomics.choose(JvmErgonomics.java:57)
at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:89)
修改 config目录的jvm.options文件,调小Xms的配置1
2
3
4
5
6
7
8# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
#-Xms2g
#-Xmx2g
-Xms512m
-Xmx512m
2、无法使用root用户启动1
2
3OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[2019-11-05T19:57:15,328][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [iZ2ze0fk8pd9zkdd29mpz6Z] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
添加新用户1
2
3
4
5
6
7
8
9#添加用户es
useradd es
#修改elasticsearch目录使用者/群组
chown -R es:es /home/elasticsearch-7.4.2/
#切换用户到es
su es
#启动elasticsearch
./bin/elasticsearch
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
1 | $ sed [-hnV][-e<script>][-f<script文件>][文本文件] |
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
1、删除文件里的逗号
$ sed 's/[,]//' 1.txt
2、删除文件特殊字符
1)、首先在vi命令模式下:set list可以将不可看见的特殊字符打印出来
2)、这些不可见的特殊字符是可以输入的方式如下
比如^I是Tab(\t),^M是WIN的换行(\n\r)
请注意^I 不是^ I, ^M也不是^ M
^I 是Ctrl + V Ctrl + I
^M 是Ctrl + V Ctrl + M
3)、然后用sed -i ‘s/^M//g’ a.txt进行删除(这个里边的^M是用2)中的方式输入的,在终端里边是不显示的,如果你要测试的话可以先用sed ‘s/^M//g’ a.txt 看看效果)
$ sed -i 's/^M//g' 1.txt
参数-i 使用此参数后,所有改动将在原文件上执行
3、将每行结尾加逗号
sed 's/.*/&,/' 1.txt
&号,当它用在替换字符串中的时候,代表的是原始的查找匹配数据
4、删除最后一行逗号
sed '$ s/,//' 1.txt
5、修改原文件的同时生成.bak备份文件
sed -i.bak 's/.*/&,/' 1.txt
ShowDoc就是一个非常适合IT团队的在线文档分享工具,它可以加快团队之间沟通的效率。 ShowDoc.
1 | #下载脚本并赋予权限 |
1 | #执行上面命令便会自动安装完成。下面附上脚本其他命令,以便管理showdoc时可以用得上。 |
安装好后,showdoc的数据都会存放在 /showdoc_data/html 目录下。./showdoc 脚本可放置在任何目录,方便以后使用。也可以重新从官方地址下载。
你可以打开 http://xxx.com:4999 来访问showdoc (xxx.com为你的服务器域名或者IP)。账户密码是showdoc/123456
1 | chmod 777 -R /showdoc_data/html |
1 | #!/bin/bash |