1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理
2、描述awk命令用法及示例(至少3例)
3、描述awk函数示例(至少3例)
1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理
Systemd
简介
系统初始化与服务管理工具,是Centos7与Centos5,Centos6不同的init工具。
特性
- 系统引导时实现服务并行启动;
- 按需激活进程;
- 系统状态快照;
- 基于依赖关系定义服务控制逻辑;
- 基于socket的激活机制:socket与程序分离;
- 基于bus的激活机制;
- 基于device的激活机制;
- 基于Path的激活机制;
- 系统快照:保存各unit的当前状态信息于持久存储设备中;
- 向后兼容sysv init脚本; /etc/init.d/
核心概念unit
unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其它与init相关的信息; 这些配置文件主要保存在:
- /usr/lib/systemd/system
- /run/systemd/system
- /etc/systemd/system
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, 用于定义文件系统中的一文件或目录
管理系统服务
systemctl命令
- 简介 控制系统和管理服务工具
- 格式
-
- systemctl [OPTIONS…] COMMAND [NAME…]
- 常见用法
-
- 启动:systemctl start NAME.service
- 停止:systemctl stop NAME.service
- 重启:systemctl restart NAME.service
- 状态:systemctl status NAME.service
- 条件式重启:systemctl try-restart NAME.service
- 重载或重启服务: systemctl reload-or-restart NAME.servcie
- 重载或条件式重启服务:systemctl reload-or-try-restart NAME.service
- 查看某服务当前激活与否的状态: systemctl is-active NAME.service
- 查看所有已激活的服务:systemctl list-units –type service
- 查看所有服务(已激活及未激活): chkconfig –lsit ==> systemctl list-units -t service –all
- 设置服务开机自启:systemctl enable NAME.service
- 禁止服务开机自启:systemctl disable NAME.service
- 查看某服务是否能开机自启:systemctl is-enabled NAME.service
- 禁止某服务设定为开机自启: systemctl mask NAME.service
- 取消此禁止: systemctl unmask NAME.servcie
- 查看服务的依赖关系:systemctl list-dependencies NAME.service
管理target
- 运行级别:CentOS7并没有很明显的级别概念,更多的只是为了兼容CentOS5,CentOS6。
-
- 0 ==> runlevel0.target, poweroff.target 两种写法都是等价的,下同
- 1 ==> runlevel1.target, rescue.target
- 2 ==> runlevel2.tartet, multi-user.target
- 3 ==> runlevel3.tartet, multi-user.target
- 4 ==> runlevel4.tartet, multi-user.target
- 5 ==> runlevel5.target, graphical.target
- 6 ==> runlevel6.target, reboot.target
- 级别切换
-
- systemctl isolate NAME.target
- 级别查看
-
- systemctl list-units –type target
- 查看所有级别
-
- systemctl list-units -t target -a
- 获取默认运行级别:
-
- systemctl get-default
- 修改默认运行级别
-
- systemctl set-default NAME.target
- 切换至紧急救援模式
-
- systemctl rescue
- 切换至emergency模式
-
- systemctl emergency
-
- systemctl emergency
其他常用命令
- 关机: systemctl halt, systemctl poweroff
- 重启: systemctl reboot
- 挂起: systemctl suspend
- 快照: systemctl hibernate
- 快照并挂起: systemctl hybrid-sleep
unit file
- 文件通常有三部分组成:
-
- [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等;以下是一些常见选项
-
-
- Description:描述信息;服务的文档,可以是一个或多个文档的URL路径。;
- After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
- Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活;
- Wants:依赖到的其它units;弱依赖,其他units启动失败并不影响当前unit启动;
- Conflicts:定义units间的冲突关系,与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然;
-
- [Service]:与特定类型相关的专用选项;此处为Service类型;以下是一些常用选项
-
- Type:服务的类型,常用的有 simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork 系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。; 类型有以下几种
-
-
- simple:默认,表示execstart启动的进程就是主进程
- forking:表示execstart启动父进程的一个子进程为主进程,启动完成之后父进程会退出
- oneshot:执行一次之后就退出
- dbus:
- notify:
- idle:
-
-
- EnvironmentFile:环境配置文件;
- ExecStart:指明启动unit要运行命令或脚本; ExecStartPre, ExecStartPost
- ExecStop:指明停止unit要运行的命令或脚本;
- Restart:指名重启unit需要运行的命令或脚本
- [Install]:定义由“systemctl enable”以及”systemctl disable“命令在实现服务启用或禁用时用到的一些选项;
-
-
- Also:当这个服务被enable/disable时,将自动enable/disable后面列出的每个模块。
- RequiredBy:和前面的 Requires 作用相似,同样后面列出的不是服务所依赖的模块,而是依赖当前服务的模块;
- WantedBy:和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。
-
注意:对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件;
systemctl daemon-reload
例子
为当前系统的nginx服务提供一个unit文件
[Unit]
Description=The nginx HTTP
Server After=network.target remote-fs.target nss-lookup.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 stop
[Install]
WantedBy=multi-user.target
2、描述awk命令用法及示例(至少3例)
awk
简介
awk的作者是Aho, Weinberger, Kernighan,所以awk名字的由来就是三个作者的首字母组成。报告生成器,格式化文本输出;
语法
gawk [options] ‘program’ FILE …
program: PATTERN{ACTION STATEMENTS}
常用选项
- -F:指明输入时用到的字段分隔符;
- -v var=value: 自定义变量;
- -f program-file :可以用-f指定编写了awk程序的文件
常用的关键字
1.print
print item1, item2, …
要点:
- 逗号分隔符;
- 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
- 如省略item,相当于print $0;
例子:
查看系统上的所有用户
awk -F: ‘{print $1}’ /etc/passwd
2.变量
内建命令:
- 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:各文件分别计数;行数;
- FILENAME:当前文件名;
- ARGC:命令行参数的个数;
- ARGV:数组,保存的是命令行所给定的各参数;
自定义变量
- -v var=value
- 在program中直接定义
例子:
获取命令行的第二个参数
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab
将:作为字段分隔符,取出最后一个字段的值
awk -v FS=’:’ ‘{print $NF}’ /etc/passwd
awk ‘BEGIN{FS=”:”}{print $NF}’ /etc/passwd
3.printf
格式化输出
printf FORMAT, item1, item2, …
要点:
- FORMAT必须给出;
- 不会自动换行,需要显式给出换行控制符,\n
- FORMAT中需要分别为后面的每个item指定一个格式化符号;
常用的格式符
- %c: 显示字符的ASCII码;
- %d, %i: 显示十进制整数;
- %e, %E: 科学计数法数值显示;
- %f:显示为浮点数;
- %g, %G:以科学计数法或浮点形式显示数值;
- %s:显示字符串;
- %u:无符号整数;
- %%: 显示%自身;
修饰符:
- #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度; %3.1f
- -: 左对齐
- +:显示数值的符号
例子
格式化输出系统用户以及其UID
awk -F: ‘{printf “username:%15s,UID:%16d\n”,$1,$3}’ /etc/passwd
4.操作数
- 操作符:
-
- x+y
- x-y
- x*y
- x/y
- x^y
- x%y
- -x
- +x: 转换为数值;
- 赋值操作符:
-
- =:直接赋值
- +=:例如x+=5,等价于x=x+5
- -=:例如x-=5,等价于x=x-5
- *=:例如x*=5,等价于x=x*5
- /=:例如x/=5,等价于x=x/5
- %=:例如x%=5,等价于x=x%5,对5取余
- :自增;例如i;等价于i=i+1
- –:自减;例如i–;等价于i=i-1
- 比较操作符:
-
- >:大于比较
- >=:大于等于
- <:小于比较
- <=:小于等于
- !=:不等于
- ==:等于
- 模式匹配符:
-
- ~:是否匹配
- !~:是否不匹配
- 逻辑操作符:
-
- && 与
- || 或
- ! 非
- 函数调用:
-
- function_name(argu1, argu2, …)
- 条件表达式:
-
- selector?if-true-expression:if-false-expression
例子
awk -F: ‘{$3>=1000?usertype=”Common User”:usertype=”Sysadmin or SysUser”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd
5.PATTERN
- empty:空模式,匹配每一行;
- /regular expression/:仅处理能够被此处的模式匹配到的行;
- relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;
真:结果为非0值,非空字符串;
- line ranges:行范围,
- startline,endline:/pat1/,/pat2/
注意: 不支持直接给出数字的格式
- BEGIN/END模式
-
- BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
- END{}:仅在文本处理完成之后执行一次;
例子
1./etc/passwd 所有行的第一个字段
awk -F: ‘{print $1}’ /etc/passwd
2./etc/passwd 第二行到第十行,以:为分隔符的第一个字段
awk -F: ‘(NR>=2&&NR<=10){print $1}’ /etc/passwd
3./etc/passwd 匹配到开头为root的行
awk -F: ‘/^root\>/{print}’ /etc/passwd
4./etc/passwd 输出开头为root与bin之间的行
awk -F: ‘/^root\>/,/^bin\>/{print}’ /etc/passwd
5./etc/passwd 处理文件之前输出“BEGIN”,处理完输出“END”
awk ‘BEGIN{printf “BEGIN\n”}{print}END{printf “END\n”}’ /etc/passwd
6.常用的action
- if-else
语法:if(condition) statement [else statement]
使用场景:对awk取得的整行或某个字段做条件判断;
例子
/etc/passwd uid大于1000输出“Common user”,否则输出“root or Sysuser”
awk -F: ‘{if($3>=1000) {printf “Common user: %s\n”,$1} else {printf “root or Sysuser: %s\n”,$1}}’ /etc/passwd
输出shell为/bin/bash的用户
awk -F: ‘{if($NF==”/bin/bash”) print $1}’ /etc/passwd
如果字段数大于5输出此行
awk ‘{if(NF>5) print $0}’ /etc/fstab
输出使用量大于10%的磁盘
df -h | awk -F[%] ‘/^\/dev/{print $1}’ | awk ‘{if($NF>=10) print $1}’
- while循环
语法:while(condition) statement
条件“真”,进入循环;条件“假”,退出循环;
使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;
例子
输出/etc/grub2.cfg文件中匹配到linux16的行的每个单词长度
awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}’ /etc/grub2.cfg
输出/etc/grub2.cfg文件中匹配到linux16的行的长度大于等于7的单词
awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}’ /etc/grub2.cfg
- do-while循环
语法:do statement while(condition)
意义:至少执行一次循环体
- for循环
语法:
-
- for(expr1;expr2;expr3) statement
- for(variable assignment;condition;iteration process) {for-body}
- for(var in array) {for-body} 遍历数组
例子
输出/etc/grub2.cfg文件中匹配到linux16的行的每个单词长度
awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg
for遍历数组的特殊用法
awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]=”Tuesday”;for(i in weekdays) {print weekdays[i]}}’
- switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
- break和continue
-
- break[n] 表示退出n层循环,默认退出本层本层循环
- continue[n]表示退出本层循环
- next
提前结束对本行的处理直接进入下一行
输出UID为偶数的用户名与UID
awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd
7.array 数组
语法:array[index-expression]
index-expression:
- 可使用任意字符串;字符串要使用双引号;
- 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;
例子:
awk ‘BEGIN{for(i=0;i<10;i++){ary[i]=i}for(j=0;j<10;j++){printf “%d\n”,ary[j]}}’
查看各个tcp连接状态数量
netstat -tan | awk ‘/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}’
统计指定文件中每个单词出现的次数
awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}’ /etc/fstab
统计/etc/fstab文件中每个文件系统类型出现的次数;
awk ‘/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}’ /etc/fstab
8.函数
- 内置函数
-
- 常用的数值处理函数
-
-
- 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所表示的数组中;
-
- 自定义函数
3、描述awk函数示例(至少3例)
(1)输出10个随机数
awk ‘BEGIN{for (i=0;i<10;i++){print rand()}}’
(2)length使用示例
echo “Hello World” | awk ‘{print $0,length($0)}’
(3)split使用示例
netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}END{for (i in count) {print i,count[i]}}’
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/104631