Centos7的systemd新特性

1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理
2、描述awk命令用法及示例(至少3例)
3、描述awk函数示例(至少3例)

1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理

systemd简介

systemd是一种管理系统初始化及正常运行时服务进程的管理工具,在centos5,6上使用工具时init在centos7上创新性的使用了systemd,相比较老版本的init而言多了许多新的特性,同时systemd也向后兼容sysv init所以在centos7上也可以使用service来管理服务进程。

systemd 新特性

  • 系统初始化时并行启动服务
  • 服务只在需要的时候才被激活
  • 系统状态快照
  • 基于依赖关系定义服务控制逻辑

unit简介

systemd将不同的资源称为unit,unit表示不同类型的systemd对象。

unit的配置文件

/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system

unit的类型

unit的类型可以通过 systemctl -t help 命令来查看

 ~]# systemctl -t help
Available unit types:
service        #.service,用于定义系统服务;
socket         #.socket,用于标识进程间通信用到的socket文件;
target            #.target,用于模拟实现“运行级别”;
snapshot       # .snapshot, 管理系统快照;
device           #  .device,用于定义内核识别的设备;
mount           # .mount,定义文件系统挂载点;
automount        # .automount,文件系统自动点设备;
swap             #.swap, 用于标识swap设备;
path              # .path, 用于定义文件系统中的一文件或目录

systemd的关键特性:

  • 基于socket的激活机制:socket与程序分离;
  • 基于bus的激活机制;
  • 基于device的激活机制;
  • 基于Path的激活机制;
  • 系统快照:保存各unit的当前状态信息于持久存储设备中;
  • 向后兼容sysv init脚本:/etc/init.d/

注意:非由systemd启动的服务,systemctl无法与之通信

编译安装nginx受systemd管理

前提:开发环境,包括nginx编译要启用的功能依赖到的开发库;

 yum groupinstall "Development Tools" "Server Platform Development"
 yum -y pcre-devel openssl-devel
#然后解压缩网上下载的源码包
tar -xf nginx-1.14.1.tar.gz -C /tmp
cd /tmp/nginx-1.14.1

./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx 
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
 --http-log-path=/var/log/nginx/access.log
 --user=nginx --group=nginx --with-http_ssl_module
  --with-http_stub_status_module
 --with-http_flv_module --with-http_mp4_module
 --with-threads --with-file-aio

 make -j 4 && make install

到此nginx的编译安装就算完成了,接下来我们创建nginx.service文件

service unit file:

文件通常由三部分组成:

  • [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等;
  • [Service]:与特定类型相关的专用选项;此处为Service类型;
  • [Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项;

Unit段的常用选项:

  • Description:描述信息; 意义性描述;
  • After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
  • Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活;
  • Wants:依赖到的其它units;弱依赖;
  • Conflicts:定义units间的冲突关系;

Service段的常用选项:

  • Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型;
    • simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
    • forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
    • oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
    • dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
    • notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess 来让Systemd 接收消息
    • idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
  • EnvironmentFile:环境配置文件;
  • ExecStart:指明启动unit要运行命令或脚本;
  • ExecStartPre, ExecStartPost
  • ExecStop:指明停止unit要运行的命令或脚本;
  • Restart:

Install段的常用选项:

  • Alias:
  • RequiredBy:被哪些units所依赖;
  • WantedBy:被哪些units所依赖;

注意:对于新创建的unit文件或,修改了的unit文件,要通知systemd重载此配置文件;

systemctl daemon-reload

vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=The Nginx Server
After=network.target remote-fs.target nss-lookup.target

[Service]
PIDFile=/run/nginx.pid
EnvironmentFile=/etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -WINCH ${MAINPID} 
PrivateTmp=true

[Install]
WantedBy=multi-user.target

配置完成后记得执行systemctl daemon-reload
可以看到nginx服务能被systemd管理了

Centos7的systemd新特性_第1张图片
image.png

2、描述awk命令用法及示例(至少3例)

基本用法:
gawk [options] 'program' FILE ...
program: PATTERN{ACTION STATEMENTS}
语句之间用分号分隔
option:
-F:指明输入时用到的字段分隔符;
-v var=value: 自定义变量;

1、print

print item1, item2, ...
要点:
(1) 逗号分隔符;
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
(3) 如省略item,相当于print $0;

2、变量

  • 2.1 内建变量
    FS:input field seperator,默认为空白字符;
    OFS:output field seperator,默认为空白字符;
    RS:input record seperator,输入时的换行符;
    ORS:output record seperator,输出时的换行符;
    NF:number of field,字段数量
    NR:number of record, 行数;
    FNR:各文件分别计数;行数;
    FILENAME:当前文件名;
    ARGC:命令行参数的个数;
    ARGV:数组,保存的是命令行所给定的各参数;

  • 2.2 自定义变量
    (1) -v var=value:变量名区分字符大小写;
    (2) 在program中直接定义

3、printf命令

  • 3.1格式化输出:printf FORMAT, item1, item2, ...
    (1) FORMAT必须给出;
    (2) 不会自动换行,需要显式给出换行控制符,\n
    (3) FORMAT中需要分别为后面的每个item指定一个格式化符号;

  • 3.2格式符:
    %c: 显示字符的ASCII码;
    %d, %i: 显示十进制整数;
    %e, %E: 科学计数法数值显示;
    %f:显示为浮点数;
    %g, %G:以科学计数法或浮点形式显示数值;
    %s:显示字符串;
    %u:无符号整数;
    %%: 显示%自身;

  • 3.3修饰符:
    #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;
    %3.1f
    -: 左对齐
    +:显示数值的符号

4、操作符

  • 4.1算术操作符:
    x+y, x-y, x*y, x/y, x^y, x%y
    -x
    +x: 转换为数值;

  • 4.2字符串操作符:没有符号的操作符,字符串连接

  • 4.3赋值操作符:
    =, +=, -=, *=, /=, %=, ^=
    ++, --

  • 4.4比较操作符:
    >, >=, <, <=, !=, ==

  • 4.5模式匹配符:
    ~:是否匹配
    !~:是否不匹配

  • 4.6逻辑操作符:
    &&
    ||
    !

  • 4.7函数调用:
    function_name(argu1, argu2, ...)

  • 4.8条件表达式:
    selector?if-true-expression:if-false-expression

5、PATTERN

(1) empty:空模式,匹配每一行;
(2) /regular expression/:仅处理能够被此处的模式匹配到的行;
(3) relational expression: 关系表达式;结有“真”有“假”;结果为“真”才会被处理;
真:结果为非0值,非空字符串;
(4) line ranges:行范围,
startline,endline:/pat1/,/pat2/
(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
END{}:仅在文本处理完成之后执行一次;

例子:

cat awktest.txt 
12 231 3432
23 43 3141
31 3321 43 
#找出文件第一列的最大值
1、awk 'BEGIN {max=$1}{max=max>$1?max:$1}END{print max}' awktest.txt 
31
#找出文件中数字的最大值
2、awk '{for(n=1;n<=NF;n++){a[$n]=$n;if(a[$n]>=max)max=a[$n]}} END {print max}' awktest.txt 
3432
#查找/etc/passwd 第二行到第十行,的第一个字段
3、awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd 
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
#统计当前链接状态的数量
4、netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
LISTEN 5
ESTABLISHED 3
#/etc/passwd 输出开头为root与bin之间的行
5、awk -F: '/^root\>/,/^adm\>/{print}' /etc/passwd   
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
#统计当前HTTP服务的ip链接数量
6、awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log

3、描述awk函数示例(至少3例)

内置函数

  • 数值处理:

    • rand():返回0和1之间一个随机数;
  • 字符串处理:

    • length([s]):返回指定字符串的长度;
    • sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;
    • gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;
    • split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;

例子

#统计当前链接IP的数量
 1、netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
192.168.31.242 3
0.0.0.0 3

#输出每一列最后一个字段的长度
2、awk '{print length($NF)}'  awktest.txt      
4
4
2
#生成了文件行数个随机数
3、awk '{print rand()}'  awktest.txt            
0.237788
0.291066
0.845814
#并不是真正的随机数
#生成10个随机数
 4、awk 'BEGIN {for (i=0;i<10;i++){print rand()}}'
0.237788
0.291066
0.845814
0.152208
0.585537
0.193475
0.810623
0.173531
0.484983
0.151863

你可能感兴趣的:(Centos7的systemd新特性)