(1)、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理
Systemd
POST--->Boot sequeue(BIOS)--->Bootloader(MBR)--->kernel(ramdisk)--->rootfs--->/sbin/init
init
- CentOS 5: SysV init
- CentOS 6: Upstart
- CentOS 7: Systemd
Systemd的新特性
- 系统引导时实现服务并行启动
- 按需激活进程
- 系统状态快照
- 基于依赖关系定义服务控制逻辑
核心概念: unit
- unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其他于init相关的信息;这些配置文件主要保存在下面的路径文件中
/usr/lib/systemd/system
/etc/systemd/system
/run/systemd/system
unit的常见类型
unit单元 | 文件扩展名 | 解释说明 |
---|---|---|
Service unit | .service | 定义系统服务 |
Target unit | .Target | 用于模拟实现"运行级别" |
Device unit | .device | 定义内核识别的设备 |
Mount unit | .mount | 定义文件系统挂载点 |
Socket unit | .socket | 标识进程间通信用到的socket文件 |
Snapshot unit | .snapshot | 管理系统快照 |
Swap unit | .swap | 标识swap设备 |
Automount unit | .automount | 文件系统自动挂载点设备 |
Path unit | .path | 定义文件系统中的一文件或目录 |
关键特性:
- 基于socket的激活机制: socket与程序分离;
- 基于bus的激活机制;
- 基于device的激活机制;
- 基于Path的激活机制;
- 系统快照: 保存各unit的当前状态信息于持久存储设备中
- 向后兼容sysv init脚本; /etc/init.d
不兼容:
- systemctl的命令是固定不变的;
- 非由systemd启动的服务,systemctl无法与之通信;
管理系统服务:
CentOS 7: service类型的unit文件
- systemctl命令:
- Control the systemd system and service manager
- systemctl [OPTIONS...] COMMAND [NAME...]
动作 | CentOS 6 | CentOS 7 |
---|---|---|
启动 | service NAME start | systemctl start NAME.service |
停止 | service NAME stop | systemctl stop NAME.service |
重启 | service NAME restart | systemctl restart NAME.service |
状态 | service NAME status | systemctl status NAME.service |
条件式重启 | service NAME condrestart | systemctl try-restart NAME.service |
重载或重启 | systemctl reload-or-restart NAME.service | |
重载或条件式重启 | systemctl reload-or-try-restart NAME.service | |
查看某服务当前激活与否的状态 | systemctl is-active NAME.service | |
查看所有已激活的服务 | systemctl list-units --t service | |
查看所有服务(包含未激活) | chkconfig --list | systemctl list-units -t NAME.service -a |
设置服务开机自启 | chkconfig NAME on | systemctl enable NAME.service |
禁止服务开机自启 | chkconfig NAME off | systemctl disable NAME.service |
查看某服务是否能开机自启 | chkconfig --list NAME | systemctl is-enabled NAME.service |
禁止某服务设定为开机自启 | systemctl mask NAME.service | |
取消此禁止 | systemctl umask NAME.service | |
查看服务依赖关系 | systemctl list-dependencies NAME.service |
管理target units:
- 运行级别:
运行级别 | 对应别名 | 服务名 |
---|---|---|
0 | runlevel0.target | poweroff.target |
1 | runlevel1.target | rescue.target |
2 | runlevel2.target | multi-user.target |
3 | runlevel3.target | multi-user.target |
4 | runlevel4.target | multi-user.target |
5 | runlevel5.target | graphical.target |
6 | runlevel6.target | reboot.target |
- 模式切换
动作 | 命令操作 |
---|---|
级别切换 | init N ==> systemctl isolate NAME.target |
查看级别 | runlevel ==> systemctl list-units -t target |
查看所有级别 | systemctl list-units -t target -a |
获取默认运行级别 | systemctl get-default |
修改默认运行级别 | systemctl set-default NAME.target |
切换至紧急救援模式 | systemctl rescue |
切换至emergency模式 | systemctl emergency |
其他常用命令:
动作 | 命令操作 |
---|---|
关机 | systemctl halt, systemctl poweroff |
重启 | systemctl reboot |
挂起 | systemctl suspend |
快照 | systemctl hibernate |
快照并挂起 | systemctl hybird-sleep |
service unit file
- 文件通常由三部分组成:
- [Install]: 定义由"systemctl enable"以及"systemctl disable"命令在实现服务启用或禁用时用到的一些选项
- Unit段的常用选项:
- Description: 描述信息; 意义性描述;
- After: 定义unit启动次序; 表示当前unit应该晚于哪些unit启动; 其功能与Before相反;
- requles: 依赖到的其他units; 强依赖,被依赖的units无法激活时,当前unit即无法激活;
- Wants: 依赖到的其他units; 弱依赖,被依赖的units无法激活时,当前unit不影响;
- Conflicts: 定义units间的冲突关系;
- Service段的常用选项:
- Type: 用于定义影响ExecStart及相关参数的功能的unit进程启动类型;
- 类型:
- simple: 默认值,表示由ExecStart所指名的程序为主进程
- forking: 由ExecStart所指名的程序生产的多个子进程有一个会成为主进程
- oneshot: 由ExecStart所指名的程序中的子进程成为主进程后,原有主进程便退出
- dbus: 后续进程只有当主进程得到dbus后才能被使用
- notify: 类似于simple
- idle:
- EnvironmentFile: 环境配置文件
- ExecStart: 指名启动unit要运行命令或脚本;ExecStartPre,ExecStartPost
- ExecStop: 指名停止unit要运行的命令或脚本
- Restart:
- 类型:
- Install段的常用选项:
- Alias: 当前unit的别名
- RequiredBy: 被哪些units所依赖
- WantedBy: 被哪些units所依赖
- Type: 用于定义影响ExecStart及相关参数的功能的unit进程启动类型;
注意: 对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件
systemctl daemon-reload
==================================================================================
编译安装nginx\apache,并通过systemd来管理.
(第一步)====创建用户配置环境====
[root@centos7 ~]#yum install -y pcre
[root@centos7 ~]#yum install -y pcre-devel
[root@centos7 ~]#yum install -y openssl-devel
[root@centos7 ~]#useradd nginx
[root@centos7 ~]#echo "nginx"|passwd --stdin nginx
(第二步)====下载tar包并解压配置====
NGINX官网 http://nginx.org/
[root@centos7 ~]#tar -zvxf nginx-1.15.5.tar.gz -C /usr/local/
[root@centos7 ~]#cd /usr/local/nginx-1.15.5/
[root@centos7 nginx-1.15.5]#./configure
[root@centos7 nginx-1.15.5]#make && make install
(第三步)====编辑配置文件====
[root@centos7 system]#cd /usr/lib/systemd/system
[root@centos7 system]#vim nginx.service
[unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
(第四步)====启动nginx====
[root@centos7 system]#systemctl start nginx.service
[root@centos7 system]#systemctl stop nginx.service
[root@centos7 system]#systemctl restart nginx.service
(2)、描述awk命令用法及示例(至少3例)
基本用法:
- awk [options] 'program' FILE....
- program: PATTERN {ACTION STATMENTS}
- 语句之间用分号分隔
- print, printf
- 选项:
- -F: 指明输入时用到的字段分隔符;
- -v: var=value: 自定义变量;
- program: PATTERN {ACTION STATMENTS}
- print item1,item2,....
- 要点:
- (1) 逗号分隔符
- (2) 输出的各item可以是字符串,也可以是数值; 当前记录的字段、变量或awk的表达式.
- (3) 如果省略item,相当于print $0
变量
- 内建变量
- FS: input field seperator,默认为空白字符;
- OFS: output field seperator,默认为空白字符;
- RS: input record seperator, 输入时的换行符;
- ORS: output record seperator, 输出时的换行符
- NF: number of field, 字段数量
- {print NF},{print $NF}
- NR: number of record, 行数(行号)
- FNR: file number of record, 行数(行号)
- FILENAME: 当前文件名
- ARGC: 命令行参数个数
- ARGV: 数组,保存的是命令行中所给定的各参数
- 自定义变量
- (1) -v var=value
- 变量名区分字符大小写
- (2) 在program中直接定义
- (1) -v var=value
print命令
- 格式化输出: printf FORMAT, item1,item2....
- (1) FORMAT是必须给出
- (2) 不会自动换行,需要显式给出换行控制符.\n
- (3) FORMAT中需要分别为后面的每个item指定一个格式化符号;
- 格式符:
- %c: 显示字符的ASCII码
- %d,%i: 显示十进制整数
- %e,%E: 科学计数法数值显示
- %f: 显示为浮点数
- %g,%G: 以科学计数法或浮点形式显示数值;
- %s: 显示字符串
- %u: 显示无符号整数
- %%: 显示%本身
- 修饰符:
- %3.1f
- -: 左对齐
- +: 显示数值的符号
操作符
- 算术操作符:
- x+y, x-y, x*y, x/y, x^y, x%y
- -x
- +x: 转换为数值
- 字符串操作符: 没有符号的操作符,字符串连接
- 赋值操作符:
- =, +=, -=, *=, /=, %=, ^=
- ++, - -
- 比较操作符:
->, >=, <, <=, !=, == - 模式匹配符:
- ~: 左侧的字符串是否能被右侧的字符串匹配
- !~: 左侧的字符串是否不能被右侧的字符串匹配
- 逻辑操作符:
- &&
- ||
- !
- 函数调用:
- function_name(argu1,argu2,....)
- 条件表达式:
- selector?if-true-experession:if-false-experession
示例1: 判断用户UID,若大于等于1000为普通用户,否则,为系统用户或管理用户,且显示出对应的结果;
awk -F: '{$3>1000?usertype="Common user":usertype="Sysadmin or Sysuser";printf "%10s:%s\n",$1,usertype}' /etc/passwd
PATTERN
- (1) empty: 空模式,匹配每一行;
- (2) /regular expression/: 仅处理能够被此处的模式匹配到的行;
- (3) relational expression: 关系表达式;结果有"真"有"假".结果为"真"才会被处理;
- 真: 结果为非0值,非空字符串;
- (4) line ranges: 行范围
- startline,endline: /pat1/,/pat2/
- 注意: 不支持直接给出数字的格式
示例2: 求/etc/passwd中第二行到第十行的用户,并显示出来;
[root@centos7 ~]#awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
- (5) BEGIN/END模式
- BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
- END{}: 仅在文本处理完成之后执行一次;
- (6) 常用的action
-
- Expressions
-
- Control statements: if, while等
-
- Compound statements: 组合语句
-
- input statements
-
- output statements
-
- (7) 控制语句
- if(condition) {statements}
- if(condition) {statements} else {statments}
- while(condition) {statements}
- do {statements} while(condition)
- for(expr1;expr2;expr3) {statements}
- break
- continue
- delete array[index]
- delete array
- exit
- {statements}
- (7.1) if-else
- 语法: if(condition) {statements} [else statement]
使用场景: 对awk取得的整行或某个字段做条件判断;
示例3: 以if语句判断用户UID,若大于等于1000为普通用户,否则,为系统用户或管理用户,且显示出对应的结果
[root@centos7 ~]#awk -F: '{if($3>=1000){printf "Common User: %s\n",$1}else{printf "root or Sysusers: %s\n",$1}}' /etc/passwd
示例4: 如果某个字段个数大于5个,则显示出来
[root@centos7 ~]#awk '{if(NF>=5) print $0}' /etc/fstab
示例5: 对df里占用比这一字段进行监控,若设备的占用比超过20%则显示出这一设备名称.
[root@centos7 ~]#df -h|awk -F[%] '/^\//{print $1}'|awk '{if($NF>=20)print $1}'
/dev/sda1
- (7.2) while循环
- 语法: while(condition) {statements}
- 条件为"真",进入循环; 条件为"假",退出循环;
- 语法: while(condition) {statements}
使用场景: 对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;
示例6: 对/etc/grub2.cfg中以空格或linux16开头的行进行处理,取出该行内每个字段具体的长度个数;
[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg
示例7: 对上述结果,取出长度大于等于7的字段
[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=7){print $i,length($i)};i++}}' /etc/grub2.cfg
-
(7.3) do-while循环
- 语法: do statement while(condition)
- 意义: 至少执行一次
- 语法: do statement while(condition)
-
(7.4) for循环
- 语法: for(expr1;expr2;expr3) statement
- for(variable assignment;condition;interation process){for-body}
- 特殊用法:
- 能够遍历数组中的元素
- 语法: for(var in array) {for-body}
- 语法: for(expr1;expr2;expr3) statement
-
(7.5) switch语句
- 语法: switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ......; default: statement}
-
(7.6) break和continue
- break [n]
- continue
-
(7.7) next:
- 能提前结束对本行的处理,而直接进入下一行
-
(8). array数组
- 关联数组: array[index-expression]
- index-expression:
- (1) 可使用任意字符串(字符串要加双引号)
- (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为"空串"
- 若要判断数组中是否存在某元素,要使用"index in array"格式进行
- weekdays["mon"]="Monday"
- 若要遍历数组中的每个元素,要使用for循环
- for(var in array) {for-body}
- index-expression:
- 关联数组: array[index-expression]
注意: var会遍历array的每个索引;
(3)、描述awk函数示例(至少3例)
函数
- 内置函数
- 数值处理:
- rand(): 返回0和1之间的一个随机数
- 字符串处理:
- length([s]): 返回指定字符串的长度
- sub(r,s,[t]): 以r表示的模式来查找t所表示的字符串中的匹配的内容,并将其第一次出现替换为s所表示的内容;
- gsun(r,s,[t]): 全局替换
- split(s,a,[r]): 以r为分隔符,去切割字符串s,并将切割后的结果保存至a所表示的数组中;
- 自定义函数
示例:
随机数
[root@centos7 ~]#awk '{print rand()}' /etc/passwd
字符串处理
[root@centos7 ~]#awk 'length>80' /etc/passwd
[root@centos7 ~]#netstat -tan|awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'