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管理了
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
网友评论