systemd与awk的用法

awk,systemd

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

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code