ziggle

Hail Hydra


  • Home

  • Archives

  • Search

CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制

Posted on 2019-09-18

在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制。主要包括打开文件描述符数量、用户的最大进程数量、coredump文件的大小等。

在centos 5/6 等版本中,资源限制的配置可以在/etc/security/limits.conf 设置,针对root/user等各个用户或者*代表所有用户来设置。 当然,/etc/security/limits.d/ 中可以配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文件,后加载配置覆盖之前的配置。 一个配置示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ziggle-linux yum.repos.d]# cat /etc/security/limits.conf 
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
#That means for example that setting a limit for wildcard domain here
#can be overriden with a wildcard setting in a config file in the
#subdirectory, but a user specific setting here can be overriden only
#with a user specific setting in the subdirectory.
1
2
3
4
5
6
*     soft   nofile    100000
* hard nofile 100000
* soft nproc 100000
* hard nproc 100000
* soft core 100000
* hard core 100000

不过,在CentOS 7 / RHEL 7的系统中,使用Systemd替代了之前的SysV,因此 /etc/security/limits.conf 文件的配置作用域缩小了一些。limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。登录用户的限制,与上面讲的一样,通过 /etc/security/limits.conf 和 limits.d 来配置即可。
对于systemd service的资源限制,如何配置呢?

全局的配置,放在文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf。 同时,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/*.conf 和 /etc/systemd/user.conf.d/*.conf
其中,system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。

1
2
3
DefaultLimitCORE=infinity
DefaultLimitNOFILE=100000
DefaultLimitNPROC=100000

注意:修改了system.conf后,需要重启系统才会生效。

针对单个Service,也可以设置,以nginx为例。
编辑 /usr/lib/systemd/system/nginx.service 文件,或者 /usr/lib/systemd/system/nginx.service.d/my-limit.conf 文件,做如下配置:

1
2
3
4
[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000

然后运行如下命令,才能生效。

1
2
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

查看一个进程的limit设置:cat /proc/YOUR-PID/limits
例如我的一个nginx service的配置效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$cat /proc/$(cat /var/run/nginx.pid)/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 100000 100000 processes
Max open files 100000 100000 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 1030606 1030606 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

顺便提一下,我还被CentOS7自带的/etc/security/limits.d/20-nproc.conf文件坑过,里面默认设置了非root用户的最大进程数为4096,难怪我上次在limits.conf中设置了没啥效果,原来被limit.d目录中的配置覆盖了。

netty-handler

Posted on 2019-08-28

channel的生命状态周期

状态 说明
channelUnregistered 说明
channelUnregistered channel创建之后,还未注册到EventLoop
channelRegistered channel注册到了对应的EventLoop
channelActive channel处于活跃状态,活跃状态表示已经连接到了远程服务器,现在可以接收和发送数据
channelInactive channel 未连接到远程服务器

一个Channel正常的生命周期如下

channelRegistered -> channelActice -> channelInactive -> channelUnregistered

零拷贝(DIRECT BUFFERS 使用堆外直接内存)

  1. Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,
    不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,
    JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,
    消息在发送过程中多了一次缓冲区的内存拷贝。
  2. Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对象,用户可以像操作一个 Buffer 那样
    方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小 Buffer 合并成一个大的
    Buffer。
  3. Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,
    避免了传统通过循环 write 方式导致的内存拷贝问题

docker-compose

Posted on 2019-08-25

安装docker-compose

1
curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose

docker-compose volumes 卷标

1
docker volume ls

mysql-配置

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
version: '3.3'
services:
redis:
# 指定镜像
image: redis:4
ports:
# 端口映射
- 6379:6379
volumes:
# 目录映射
- "redis-db:/usr/local/etc/redis"
- "redis-db:/data"
command:
# 执行的命令
redis-server
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'db'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'root'
# You can use whatever password you like
MYSQL_PASSWORD: '123456'
# Password for root access
MYSQL_ROOT_PASSWORD: '123456'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3306:3306'
expose:
# Opens port 3306 on the container
- '3306'
# Where our data will be persisted
volumes:
- my-db:/var/lib/mysql
- my-db:/etc/my.cnf"
# Names our volume
volumes:
my-db:
redis-db:

regex

Posted on 2019-08-07

Translations:

  • English
  • Español
  • Français
  • Português do Brasil
  • 中文版
  • 日本語
  • 한국어
  • Turkish
  • Greek
  • Magyar
  • Polish
  • Русский

什么是正则表达式?

正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.

一个正则表达式是在一个主体字符串中从左到右匹配字符串时的一种样式.
例如”Regular expression”是一个完整的句子, 但我们常使用缩写的术语”regex”或”regexp”.
正则表达式可以用来替换文本中的字符串,验证形式,提取字符串等等.

想象你正在写一个应用, 然后你想设定一个用户命名的规则, 让用户名包含字符,数字,下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑.
我们使用以下正则表达式来验证一个用户名:

以上的正则表达式可以接受 john_doe, jo-hn_doe, john12_as.
但不匹配Jo, 因为它包含了大写的字母而且太短了.

目录

  • 1. 基本匹配
  • 2. 元字符
    • 2.1 点运算符 .
    • 2.2 字符集
      • 2.2.1 否定字符集
        • 2.3 重复次数
      • 2.3.1 * 号
      • 2.3.2 号
      • 2.3.3 ? 号
        • 2.4 {} 号
        • 2.5 (…) 特征标群
        • 2.6 | 或运算符
        • 2.7 转码特殊字符
        • 2.8 锚点
      • 2.8.1 ^ 号
      • 2.8.2 $ 号
        • 3. 简写字符集
        • 4. 前后关联约束(前后预查)
        • 4.1 ?=… 前置约束(存在)
        • 4.2 ?!… 前置约束-排除
        • 4.3 ?<= … 后置约束-存在
        • 4.4 ?<!… 后置约束-排除
        • 5. 标志
        • 5.1 忽略大小写 (Case Insensitive)
        • 5.2 全局搜索 (Global search)
        • 5.3 多行修饰符 (Multiline)
        • 额外补充
        • 贡献
        • 许可证

1. 基本匹配

正则表达式其实就是在执行搜索时的格式, 它由一些字母和数字组合而成.
例如: 一个正则表达式 the, 它表示一个规则: 由字母t开始,接着是h,再接着是e.

"the" => The fat cat sat on the mat. 

在线练习

正则表达式123匹配字符串123. 它逐个字符的与输入的正则表达式做比较.

正则表达式是大小写敏感的, 所以The不会匹配the.

"The" => The fat cat sat on the mat.

在线练习

2. 元字符

正则表达式主要依赖于元字符.
元字符不代表他们本身的字面意思, 他们都有特殊的含义. 一些元字符写在方括号中的时候有一些特殊的意思. 以下是一些元字符的介绍:

元字符 描述
. 句号匹配任意单个字符除了换行符.
[ ] 字符种类. 匹配方括号内的任意字符.
[^ ] 否定的字符种类. 匹配除了方括号里的任意字符
* 匹配>=0个重复的在*号之前的字符.
+ 匹配>1个重复的+号前的字符.
? 标记?之前的字符为可选.
{n,m} 匹配num个中括号之前的字符 (n <= num <= m).
(xyz) 字符集, 匹配与 xyz 完全相等的字符串.
| 或运算符,匹配符号前或后的字符.
\ 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ |
^ 从开始行开始匹配.
$ 从末端开始匹配.

2.1 点运算符 .

.是元字符中最简单的例子.
.匹配任意单个字符, 但不匹配换行符.
例如, 表达式.ar匹配一个任意字符后面跟着是a和r的字符串.

".ar" => The car parked in the garage.

在线练习

2.2 字符集

字符集也叫做字符类.
方括号用来指定一个字符集.
在方括号中使用连字符来指定字符集的范围.
在方括号中的字符集不关心顺序.
例如, 表达式[Tt]he 匹配 the 和 The.

"[Tt]he" => The car parked in the garage.

在线练习

方括号的句号就表示句号.
表达式 ar[.] 匹配 ar.字符串

"ar[.]" => A garage is a good place to park a car.

在线练习

2.2.1 否定字符集

一般来说 ^ 表示一个字符串的开头, 但它用在一个方括号的开头的时候, 它表示这个字符集是否定的.
例如, 表达式[^c]ar 匹配一个后面跟着ar的除了c的任意字符.

"[^c]ar" => The car parked in the garage.

在线练习

2.3 重复次数

后面跟着元字符 +, * or ? 的, 用来指定匹配子模式的次数.
这些元字符在不同的情况下有着不同的意思.

2.3.1 * 号

*号匹配 在*之前的字符出现大于等于0次.
例如, 表达式 a* 匹配以0或更多个a开头的字符, 因为有0个这个条件, 其实也就匹配了所有的字符. 表达式[a-z]* 匹配一个行中所有以小写字母开头的字符串.

"[a-z]*" => The car parked in the garage #21.

在线练习

*字符和.字符搭配可以匹配所有的字符.*.
*和表示匹配空格的符号\s连起来用, 如表达式\s*cat\s*匹配0或更多个空格开头和0或更多个空格结尾的cat字符串.

"\s*cat\s*" => The fat cat sat on the concatenation.

在线练习

2.3.2 + 号

+号匹配+号之前的字符出现 >=1 次个字符.
例如表达式c.+t 匹配以首字母c开头以t结尾,中间跟着任意个字符的字符串.

"c.+t" => The fat cat sat on the mat.

在线练习

2.3.3 ? 号

在正则表达式中元字符 ? 标记在符号前面的字符为可选, 即出现 0 或 1 次.
例如, 表达式 [T]?he 匹配字符串 he 和 The.

"[T]he" => The car is parked in the garage.

在线练习

"[T]?he" => The car is parked in the garage.

在线练习

2.4 {} 号

在正则表达式中 {} 是一个量词, 常用来一个或一组字符可以重复出现的次数.
例如, 表达式 [0-9]{2,3} 匹配 2~3 位 0~9 的数字.

"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.

在线练习

我们可以省略第二个参数.
例如, [0-9]{2,} 匹配至少两位 0~9 的数字.

如果逗号也省略掉则表示重复固定的次数.
例如, [0-9]{3} 匹配3位数字

"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.

在线练习

"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.

在线练习

2.5 (...) 特征标群

特征标群是一组写在 (...) 中的子模式. 例如之前说的 {} 是用来表示前面一个字符出现指定次数. 但如果在 {} 前加入特征标群则表示整个标群内的字符重复 N 次. 例如, 表达式 (ab)* 匹配连续出现 0 或更多个 ab.

我们还可以在 () 中用或字符 | 表示或. 例如, (c|g|p)ar 匹配 car 或 gar 或 par.

"(c|g|p)ar" => The car is parked in the garage.

在线练习

2.6 | 或运算符

或运算符就表示或, 用作判断条件.

例如 (T|t)he|car 匹配 (T|t)he 或 car.

"(T|t)he|car" => The car is parked in the garage.

在线练习

2.7 转码特殊字符

反斜线 \ 在表达式中用于转码紧跟其后的字符. 用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字符. 如果想要匹配这些特殊字符则要在其前面加上反斜线 \.

例如 . 是用来匹配除换行符外的所有字符的. 如果想要匹配句子中的 . 则要写成 \..

"(f|c|m)at\.?" => The fat cat sat on the mat.

在线练习

2.8 锚点

在正则表达式中, 想要匹配指定开头或结尾的字符串就要使用到锚点. ^ 指定开头, $ 指定结尾.

2.8.1 ^ 号

^ 用来检查匹配的字符串是否在所匹配字符串的开头.

例如, 在 abc 中使用表达式 ^a 会得到结果 a. 但如果使用 ^b 将匹配不到任何结果. 应为在字符串 abc 中并不是以 b 开头.

例如, ^(T|t)he 匹配以 The 或 the 开头的字符串.

"(T|t)he" => The car is parked in the garage.

在线练习

"^(T|t)he" => The car is parked in the garage.

在线练习

2.8.2 $ 号

同理于 ^ 号, $ 号用来匹配字符是否是最后一个.

例如, (at\.)$ 匹配以 at. 结尾的字符串.

"(at\.)" => The fat cat. sat. on the mat.

在线练习

"(at\.)$" => The fat cat. sat. on the mat.

在线练习

3. 简写字符集

正则表达式提供一些常用的字符集简写. 如下:

简写 描述
. 除换行符外的所有字符
\w 匹配所有字母数字, 等同于 [a-zA-Z0-9_]
\W 匹配所有非字母数字, 即符号, 等同于: [^\w]
\d 匹配数字: [0-9]
\D 匹配非数字: [^\d]
\s 匹配所有空格字符, 等同于: [\t\n\f\r\p{Z}]
\S 匹配所有非空格字符: [^\s]

4. 前后关联约束(前后预查)

前置约束和后置约束都属于非捕获簇(用于匹配不在匹配列表中的格式).
前置约束用于判断所匹配的格式是否在另一个确定的格式之后.

例如, 我们想要获得所有跟在 $ 符号后的数字, 我们可以使用正向向后约束 (?<=\$)[0-9\.]*.
这个表达式匹配 $ 开头, 之后跟着 0,1,2,3,4,5,6,7,8,9,. 这些字符可以出现大于等于 0 次.

前后关联约束如下:

符号 描述
?= 前置约束-存在
?! 前置约束-排除
?<= 后置约束-存在
?<! 后置约束-排除

4.1 ?=... 前置约束(存在)

?=... 前置约束(存在), 表示第一部分表达式必须跟在 ?=...定义的表达式之后.

返回结果只瞒住第一部分表达式.
定义一个前置约束(存在)要使用 (). 在括号内部使用一个问号和等号: (?=...).

前置约束的内容写在括号中的等号后面.
例如, 表达式 [T|t]he(?=\sfat) 匹配 The 和 the, 在括号中我们又定义了前置约束(存在) (?=\sfat) ,即 The 和 the 后面紧跟着 (空格)fat.

"[T|t]he(?=\sfat)" => The fat cat sat on the mat.

在线练习

4.2 ?!... 前置约束-排除

前置约束-排除 ?! 用于筛选所有匹配结果, 筛选条件为 其后不跟随着定义的格式
前置约束-排除 定义和 前置约束(存在) 一样, 区别就是 = 替换成 ! 也就是 (?!...).

表达式 [T|t]he(?!\sfat) 匹配 The 和 the, 且其后不跟着 (空格)fat.

"[T|t]he(?!\sfat)" => The fat cat sat on the mat.

在线练习

4.3 ?<= ... 后置约束-存在

后置约束-存在 记作(?<=...) 用于筛选所有匹配结果, 筛选条件为 其前跟随着定义的格式.
例如, 表达式 (?<=[T|t]he\s)(fat|mat) 匹配 fat 和 mat, 且其前跟着 The 或 the.

"(?<=[t|t]he\s)(fat|mat)" => The fat cat sat on the mat.

在线练习

4.4 ?<!... 后置约束-排除

后置约束-排除 记作 (?<!...) 用于筛选所有匹配结果, 筛选条件为 其前不跟着定义的格式.
例如, 表达式 (?<!(T|t)he\s)(cat) 匹配 cat, 且其前不跟着 The 或 the.

"(?<![T|t]he\s)(cat)" => The cat sat on cat.

在线练习

5. 标志

标志也叫修饰语, 因为它可以用来修改表达式的搜索结果.
这些标志可以任意的组合使用, 它也是整个正则表达式的一部分.

标志 描述
i 忽略大小写.
g 全局搜索.
m 多行的: 锚点元字符 ^ $ 工作范围在每行的起始.

5.1 忽略大小写 (Case Insensitive)

修饰语 i 用于忽略大小写.
例如, 表达式 /The/gi 表示在全局搜索 The, 在后面的 i 将其条件修改为忽略大小写, 则变成搜索 the 和 The, g 表示全局搜索.

"The" => The fat cat sat on the mat.

在线练习

"/The/gi" => The fat cat sat on the mat.

在线练习

5.2 全局搜索 (Global search)

修饰符 g 常用于执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部).
例如, 表达式 /.(at)/g 表示搜索 任意字符(除了换行) + at, 并返回全部结果.

"/.(at)/" => The fat cat sat on the mat.

在线练习

"/.(at)/g" => The fat cat sat on the mat.

在线练习

5.3 多行修饰符 (Multiline)

多行修饰符 m 常用于执行一个多行匹配.

像之前介绍的 (^,$) 用于检查格式是否是在待检测字符串的开头或结尾. 但我们如果想要它在每行的开头和结尾生效, 我们需要用到多行修饰符 m.

例如, 表达式 /at(.)?$/gm 表示在待检测字符串每行的末尾搜索 at后跟一个或多个 . 的字符串, 并返回全部结果.

"/.at(.)?$/" => The fat
                cat sat
                on the mat.

在线练习

"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

在线练习

额外补充

  • 正整数: ^\d+$
  • 负整数: ^-\d+$
  • 手机国家号: ^+?[\d\s]{3,}$
  • 手机号: ^+?[\d\s]+(?[\d\s]{10,}$
  • 整数: ^-?\d+$
  • 用户名: ^[\w\d_.]{4,16}$
  • 数字和英文字母: ^[a-zA-Z0-9]*$
  • 数字和应为字母和空格: ^[a-zA-Z0-9 ]*$
  • 密码: ^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$
  • 邮箱: ^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$
  • IP4 地址: ^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$
  • 纯小写字母: ^([a-z])*$
  • 纯大写字母: ^([A-Z])*$
  • URL: ^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$
  • VISA 信用卡号: ^(4[0-9]{12}(?:[0-9]{3})?)*$
  • 日期 (MM/DD/YYYY): ^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$
  • 日期 (YYYY/MM/DD): ^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$
  • MasterCard 信用卡号: ^(5[1-5][0-9]{14})*$

贡献

  • 报告问题
  • 开放合并请求
  • 传播此文档
  • 直接和我联系 ziishaned@gmail.com 或 Twitter URL

许可证

MIT © Zeeshan Ahmad

linux-awk

Posted on 2019-08-06

打印某一列

1
awk '{print $1}' file
1
2
3
4
awk  -F ","   '{print $1,$2}'   file
|参数 | |操作|

awk -F "," '/^a/ {print $3}' file
1…789…22
ziggle

ziggle

Hail Hydra !

110 posts
45 tags
RSS
GitHub
© 2021 ziggle
Powered by Hexo
|
Hail Hydra—