1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理
Systemd:
POST--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
/run/systemd/system
/etc/systemd/system
Unit的常见类型:
Serveice unit:文件拓展名为.service,用于定义系统服务
Target unit:文件拓展名为.target,用于模拟实现“运行级别”
Device unit:文件拓展名为.device,用于定义内核识别的设备
Mount unit:文件拓展名为.mount,定义文件系统挂载点
Socket unit:文件拓展名为.socket,用于标识进程间通信用到的socket文件
Snapshot unit:文件拓展名为.snpashot管理系统快照
Swap unit:文件拓展名为.swap,用于标识swap设备
Automount unit:文件拓展名为.automount,定义文件系统自动挂载点设备
Path unit:文件拓展名为.path用于定义文件系统中的文件或目录
关键特性:
基于socket的激活机制:socket与程序分离
基于bus的激活机制
基于device的激活机制
基于path的激活机制
系统快照:保存各unit的当前状态信息与持久存储设备中
向后兼容sysv init脚本
/etc/init.d/
不兼容:
systemctl的命令是固定不变的
非由systemctl启动的服务,systemctl无法与之通信
管理系统服务:
CentOS 7:service类型的unit文件
systemctl命令:- Control the systemd system and service manager
systemctl [OPTIONS...] COMMAND [NAME...]
启动: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 ls-active NAME.service
查看所有已激活的服务:systemctl list-units --type service
查看所有服务(已激活及未激活):chkconfig --list ==>systemctl list-units -t service --all
设置服务开机启动:chkconfig NAME on ==>systemctl enable NAME.service
禁止服务开机启动:chkconfig NAME off ==>systemctl disable NAME.service
查看某服务是否能开机自启:chkconfig --list NAME ==>systemctl ls-enabled NAME.service
禁止某服务设定为开机启动:systemctl mask NAME.service
取消此禁止:systemctl unmask NAME.service
查看服务的依赖关系:systemctl list-dependencies NAME.service
管理target unit
运行级别:
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 --type target
查看所有级别:systemctl list-units -t target -a
获取默认运行级别:systemctl get-default
修改默认运行级别:systemctl set-default NAME.service
切换至紧急救援模式:systemctl rescue
切换至emergency模式:systemctl emergency
其他常用命令:
关机:systemctl halt,systemctl poweroff
重启:systemctlreboot
挂起:systemctl suspend
快照:systemctl hibernate
快照并挂起:systemctl hybrid-sleep
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,弱依赖,
Conficts:定义units之间的冲突
Service段的常用选项:
TYPE:用于定义影响ExecStart及相关参数的功能的unit进程启动类型
类型:
simple
forking
oneshot
dbus
notify
idle
EnvironmentFile:环境配置文件
ExecStart:指明启动unit要运行的命令或脚本,ExecStartPre、ExecStartPost
ExecStop:指明停止unit要运行的命令或脚本,
Restart:指明要重启unit要运行的命令或脚本
Install段的常用选项:
Alias:当前unit的别名
RequiredBy:被哪些unit所依赖,强依赖
WantedBY:被哪些unit所依赖,弱依赖
注意:对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件
#systemctl daemon-reload
配置nginx启动示例:
[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
2、描述awk命令用法及函数示例
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一,而我们日常所使用的awk是gawk(GNU awk).
基本用法:
gawk [options] ‘program’ FILE...
program:PATTERN{ACTION STATEMENTS}
语句之间用分号“;”分割
print printf
选项:
-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,字段数量
注意:{print NF}:表示打印每一行字段数量
{print $NF}:表示打印每一行的最后一个字段
NR:number of record,行数
FNR:各文件分别计数,行数
FILENAME:当前文件名
~]# awk '{print FILENAME}' /etc/fstab
ARGC:命令行参数的个数
~]# awk '{print ARGC}' /etc/fstab /etc/passwd
ARGV:数组,保存的是命令行所给定的各参数
~]# awk 'BEGIN{print ARGV[2]}' /etc/fstab /etc/passwd
2.2自定义变量
(1)-v var=value
变量名区分字符大小写
(2)在program中直接定义
3.printf命令
格式化地输出:printf FORMAT,item1,item2,...
(1)FORMAT必须给出
(2)不会自动换行,需要显示给出换行控制符:\n
(3)FORMAT中需要分别为后面的每个item指定一个格式化符号
格式符:
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:科学计数法数值显示
%f:显示为浮点数
%g,%G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
示例:
~]# awk -F: '{printf "Username: %s,UID: %d\n",$1,$3}' /etc/passwd
修饰符:
#[.#]:第一个#控制显示的宽度,第二个#表示小数点后的精度
%3.1f
-:左对齐
+:显示数值的符号
示例:
~]# awk -F: '{printf "Username: %-10s,UID: %d\n",$1,$3}' /etc/passwd
4.操作符
算数操作符:
x+y,x-y,x*y,x/y,x^y,x%y
-x
+x:转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=,<=,>=,<,>,==,!=
++,--
模式匹配符:
~:是否匹配
!~:是否不匹配
逻辑操作符
&&
||
!
函数调用:
function_name(argu1,argu2,...)
条件表达式:
selector?if-true-expression:if-fales-expression
示例:
~]# awk -F: '{$3>=1000?usertype="Common user":usertype="sysadmin or sysuser";printf "%10s:%-s\n",$1,usertype}' /etc/passwd
5.PATTERN
(1)empty:空模式,匹配每一行
(2)/regular expression/:仅处理能够被此处的模式所匹配到的行
~]# awk '/^UUID/ {print $3 }' /etc/fstab
(3)relational expression:关系表达式,结果有“真”有“假”,结果为“真”时才会被处理
真:结果为非0值,非空字符串
~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
(4)line ranges:行范围
startline,endline: /pat1/,/pat2/
注意:不支持直接给出数字的格式
~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
(5)BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:j仅在文本处理完成之后执行一次
示例:
~]# awk -F: 'BEGIN{print " username uid \n ---------------------"}{print $1,$3}END{print "-------------------\n end "}'
/etc/passwd
6.常用的action
(1)Expression
(2)Control statement:if,while等
(3)Compound statement:组合语句
(4)input statement
(5)output statement
7.控制语句
if(condition) {statement}
if(condition) {statement} else {statement}
while(condition) {statement}
do {statement} while {condition}
for(expr1;expr2;expr3) {statement}
break
continue
delete array[index]
delete array
exit
{ statement }
7.1 if-else
语法:if(condition) statement [else statement]
示例:
~]# awk -F: '{if($3>=100){printf"Common user: %s\n",$1} else {printf "sysadmin or sysuser: %s\n",$1}}' /etc/passwd
~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
~]# awk '{if(NF>2) print $0}' /etc/fstab
~]# df -h | awk -F[%] '/^\/dev/ {print $1}'| awk '{print $NF}'
使用场景:对awk取得的整行或某个字段做条件判断
7.2 while循环
语法:while(condition) statement
条件“真”,进入循环,条件“假”,退出循环
使用场景:对一行内的多个字段逐一作类似处理时使用;对数组中的各元素逐一处理时使用
length()
示例:
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg
~]# 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)
意义:至少执行一次循环体
7.4 for循环
语法: for(expr1;expr2;expr3) statement
for(控制变量初始化;条件判断表达式;控制变量的修正语句) (循环体)
示例:
~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
特殊用法:
能够遍历数组中的元素
语法:for(var in array) (for-body)
7.5 switch语句
语法: switch(表达式) {case VALUE or /REGEXP1/: statement; case VALUE2 or /REGEXP2/: statement;...; default:statement}
7.6 break和continue
break [n]
continue
7.7 next
示例:求用户ID为偶数的用户,显示其用户名以及ID
~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
提前结束对本行的处理而直接进入下一行
8. array
关联数组:array[index-expression]
index-expression:
(1)可使用任意字符串
(2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
若要判断数组中是否存在元素,要使用“index in array”格式进行
weekdays[mon]="monday"
~]# awk 'BEGIN{weekdays[mon]="monday";weekdays[tue]="tuesday";print weekdays[tue]}'
若要遍历数组中的每个元素,需要使用for循环
for(var in array) {for-body}
~]# awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"="tuesday";for(i in weekdays){print weekdays[i]}}'
注意:var会遍历array的每个索引
state["LISTEN"]++
state["EASTABLISHED"]++
~]# netstat -tan | awk '/^tcp\>/{state["LISTEN"]++}END{for(i in state) {print i,state[i]}}'
~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
练习1.统计/etc/fstab文件中每个文件系统类型出现的次数
~]# awk '/^\/dev/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
练习2.统计指定文件中每个单词出现的次数
~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
9. 函数
9.1 内置函数
数值处理:
rand():返回0和1直接的一个随机数
~]# awk 'BEGIN{print rand()}'
字符串处理:
length([s]):返回指定字符串的长度
sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容
gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现全部替换为s所表示的内容
split(s,a[r]):以r为分隔符切割字符s,并将其切割后的结果保存至a所表示的数组中
9.2 自定义函数
《sed和awk》
10 内置字符串函数
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分 详细说明一下各个函数的使用方法。
示例:
~]# cat tpm.txt | awk '{print substr($2,2,5)}' #截取第二列字符串中2-5位置的字符
转载于:https://blog.51cto.com/12068974/2338234