Linux 第22天: (09月20日) Linux GAWK SYSTEMD

 

 

 

 


GAWK

 

 

本章内容
awk介绍
awk基本用法
awk变量
awk格式化
awk操作符
awk条件判断
awk循环
awk数组
awk函数
调用系统命令

 

awk
awk: Aho, Weinberger, Kernighan,报告生成器,格式化文本输出
有多种版本:New awk(nawk),GNU awk(gawk)
gawk –模式扫描和处理语言
基本用法:
awk[options] ‘program’ var=value file…
awk[options] -f programfilevar=value file…
awk[options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成
program通常是被单引号或双引号中
选项:
-F指明输入时用到的字段分隔符
-v var=value: 自定义变量

 

awk语言
基本格式:awk [options] 'program' file…
program:pattern{action statements;..}
pattern和action:
pattern部分决定动作语句何时触发及触发事件
(BEGIN,END)
action statements对数据进行处理,放在{}内指明
(print, printf)
分割符、域和记录
awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。$0为所有域,注意:和shell中变量$符含义不同
文件的每一行称为记录
省略action,则默认执行print $0 的操作

 

awk工作原理
第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

 

awk
print格式:print item1, item2, ...
要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3) 如省略item,相当于print $0
示例:
awk '{print "hello,awk"}'
awk –F: '{print}' /etc/passwd
awk –F: ‘{print “wang”}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $0}’ /etc/passwd
awk–F: ‘{print $1”\t”$3}’ /etc/passwd
tail –3 /etc/fstab |awk ‘{print $2,$4}’

 

awk变量
变量:内置和自定义变量
FS:输入字段分隔符,默认为空白字符
awk-v FS=':' '{print $1,$3,$7}’ /etc/passwd
awk–F: '{print $1,$3,$7}’ /etc/passwd
OFS:输出字段分隔符,默认为空白字符
awk-v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
awk-v RS=' ' ‘{print }’ /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符
awk-v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
NF:字段数量
awk -F:‘{print NF}’ /etc/fstab,引用内置变量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
NR:行号
awk '{print NR}' /etc/fstab; awk END'{print NR}' /etc/fstab
FNR:各文件分别计数,行号
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:当前文件名
awk '{print FILENAME}’ /etc/fstab
ARGC:命令行参数的个数
awk '{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab

 

awk变量
自定义变量
(1) -v var=value
变量名区分字符大小写
(2) 在program中直接定义
示例:
awk-v test='hello gawk' '{print test}' /etc/fstab
awk-v test='hello gawk' 'BEGIN{print test}'
awk'BEGIN{test="hello,gawk";print test}'

 

printf命令
格式化输出:printf“FORMAT”, item1, item2, ...
(1) 必须指定FORMAT
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%: 显示%自身
修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐)%-15s
+:显示数值的正负符号%+d

 

printf示例
awk -F: ‘{printf "%s",$1}’ /etc/passwd
awk -F: ‘{printf "%s\n",$1}’ /etc/passwd
awk -F: ‘{printf "Username: %s\n",$1}’ /etc/passwd
awk -F: ‘{printf “Username: %s,UID:%d\n",$1,$3}’
/etc/passwd
awk -F: ‘{printf "Username: %15s,UID:%d\n",$1,$3}’
/etc/passwd
awk -F: ‘{printf "Username: %-15s,UID:%d\n",$1,$3}’
/etc/passwd

 

操作符
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
比较操作符:
>, >=, <, <=, !=, ==
模式匹配符:
~:左边是否和右边匹配包含
!~:是否不匹配
awk –F: '$0 ~ /root/{print $1}‘ /etc/passwd
awk '$0 !~ /root/‘ /etc/passwd
逻辑操作符:与&&,或||,非!
示例:
awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
awk -F: ‘!($3==0){print $1}' /etc/passwd
awk -F: ‘!($3>=500) {print $3}}’ /etc/passwd
函数调用: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

 

awk PATTERN
PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk'/^UUID/{print $1}' /etc/fstab
awk'!/^UUID/{print $1}' /etc/fstab
(3) relational expression: 关系表达式,结果有“真”有“假”,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
示例:
awk ‘!0’ /etc/passwd ; awk ‘!1’ /etc/passwd
awk –F: '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$3<1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
awk -F: '$NF==/bash$/{print $1,$NF}' /etc/passwd
seq 10 | awk 'i=!i'
(4) line ranges:行范围
startline,endline:/pat1/,/pat2/不支持直接给出数字格式
awk-F: '/^root/,/^nobody/{print $1}' /etc/passwd
awk-F: ‘(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次

 

示例
awk -F : 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "end file"}' /etc/passwd
awk -F : '{print "USER USERID“;print $1":"$3} END{print "end file"}' /etc/passwd
awk -F: 'BEGIN{print " USER UID \n ---------------"}{print $1,$3}' /etc/passwd
awk -F: 'BEGIN{print " USER UID \n ---------------"}{print $1,$3}'END{print "=============="} /etc/passwd
seq 10 |awk ‘i=0’
seq 10 |awk ‘i=1’
seq 10 | awk 'i=!i‘
seq 10 | awk '{i=!i;print i}‘
seq 10 | awk ‘!(i=!i)’
seq 10 |awk -v i=1 'i=!i'

 

awkaction
常用的action分类
(1) Expressions:算术,比较表达式等
(2) Control statements:if, while等
(3) Compound statements:组合语句
(4) input statements
(5) output statements:print等

 

awk控制语句
{ statements;… } 组合语句
if(condition) {statements;…}
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…}
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
delete array[index]
delete array
exit

 

awk控制语句
语法:if(condition) statement [else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}
使用场景:对awk取得的整行或某个字段做条件判断
示例:
awk-F: '{if($3>=1000)print $1,$3}' /etc/passwd
awk-F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
awk'{if(NF>5) print $0}' /etc/fstab
awk-F: '{if($3>=1000) {printf"Common user: %s\n",$1} else {printf"root or Sysuser: %s\n",$1}}' /etc/passwd
awk -F: '{if($3>=1000) printf "Common user: %s\n",$1;
else printf "root or Sysuser: %s\n",$1}' /etc/passwd
df -h|awk-F% '/^\/dev/{print $1}'|awk'$NF>=80{print $1,$5}‘
awk'BEGIN{ test=100;if(test>90){print "very good"}
else if(test>60){ print "good"}else{print "no pass"}}'

 

awk控制语句
while循环
语法:while(condition){statement;…}
条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用
示例:
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)>=10) {print $i,length($i)}; i++}}' /etc/grub2.cfg

 

awk控制语句
do-while循环
语法:do {statement;…}while(condition)
意义:无论真假,至少执行一次循环体
示例:
awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}‘
思考:下面两语句有何不同?
awk ‘BEGIN{i=0;print ++i,i}’
awk ‘BEGIN{i=0;print i++,i}’

 

awk控制语句
for循环
语法:for(expr1;expr2;expr3) {statement;…}
常见用法:
for(variable assignment;condition;iterationprocess)
{for-body}
特殊用法:能够遍历数组中的元素;
语法:for(varin array) {for-body}
示例:
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg

 

性能比较
time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')
time(total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)
time(for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)

 

awk控制语句
switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ...; default: statement}
break和continue
awk‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i%2==0){continue}sum+=i}print sum}‘
awk‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i==66){break}sum+=i}print sum}‘

 

awk控制语句
break [n]
continue [n]
next:
提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

 

awk数组
关联数组:array[index-expression]
index-expression:
(1) 可使用任意字符串;字符串要使用双引号括起来
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
示例:
weekdays[“mon”]="Monday“
awk 'BEGIN{weekdays["mon"]="Monday";
weekdays["tue"]="Tuesday";print weekdays["mon"]}‘
awk ‘!a[$0]++’ dupfile
若要遍历数组中的每个元素,要使用for循环
for(varin array) {for-body}
注意:var会遍历array的每个索引
示例:
awk'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]
="Tuesday";for(iin weekdays) {print weekdays[i]}}‘
netstat-tan | awk'/^tcp\>/{state[$NF]++}END
{for(index in state) { print index,state[index]}}'
awk'{ip[$1]++}END{for(iin ip) {print i,ip[i]}}' /var/log/httpd/access_log

 

awk函数
数值处理:
rand():返回0和1之间一个随机数
awk'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
字符串处理:
length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s
echo "2008:08:08 08:08:08" | awk'sub(/:/,“-",$1)'
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
echo "2008:08:08 08:08:08" | awk‘gsub(/:/,"",$1)'
split(s,array,[r]):以r为分隔符,切割字符s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…
netstat-tan | awk'/^tcp\>/{split($5,ip,":");count[ip[1]]++}
END{for (iin count) {print i,count[i]}}'

 

awk函数
自定义函数
格式:
function name ( parameter, parameter, ... ) {
statements
return expression
}
示例:
#cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}
#awk –f fun.awk

 

awk中调用shell命令
system命令
空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用""引用起来。
awk BEGIN'{system("hostname") }'
awk'BEGIN{score=100; system("echo your score is " score) }'

 

awk脚本
将awk程序写成脚本,直接调用或执行
示例:
#cat f1.awk
if($3>=1000)print $1,$3}
#awk -F: -f f1.awk /etc/passwd
#cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
#chmod +x f2.awk
#f2.awk –F: /etc/passwd

 

向awk脚本传递参数
格式:
awkfile var=value var2=value2... Inputfile
示例:
#cat test.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
#chmod +x test.awk
#test.awk -F: min=100 max=200 /etc/passwd

 

练习
1、统计/etc/fstab文件中每个文件系统类型出现的次数
# awk'/^UUID/{fs[$3]++}END{for(iin fs) {print i,fs[i]}}' /etc/fstab
2、统计/etc/fstab文件中每个单词出现的次数;
# awk'{for(i=1;i<=NF;i++){count[$i]++}}END{for(iin count) {print i,count[i]}}' /etc/fstab

 

 

 

 

 

 

SYSTEMD

 


本章内容
CentOS7启动
Unit介绍
服务管理和查看
启动排错
破解口令
修复grub2

 

systemd
POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs--> /sbin/init
init:CentOS 5: SysVinit
CentOS 6: Upstart
CentOS 7: Systemd
Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
Systemd新特性:
系统引导时实现服务并行启动
按需启动守护进程
自动化的服务依赖关系管理
同时采用socket式与D-Bus总线式激活服务
系统状态快照

 

systemd
核心概念:unit
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
配置文件:
/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行

 

Unit类型
Systemctl –t help 查看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,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录

 

特性
关键特性:
基于socket的激活机制:socket与服务程序分离
基于d-bus的激活机制:
基于device的激活机制:
基于path的激活机制:
系统快照:保存各unit的当前状态信息于持久存储设备中
向后兼容sysvinit脚本
不兼容:
systemctl命令固定不变,不可扩展
非由systemd启动的服务,systemctl无法与之通信和控制

 

管理服务
管理系统服务:
CentOS 7: service unit
注意:能兼容早期的服务脚本
命令:systemctlCOMMAND name.service
启动:service name start ==> systemctlstart name.service
停止:service name stop ==> systemctlstop name.service
重启:service name restart ==> systemctlrestart name.service
状态:service name status ==> systemctlstatus name.service
条件式重启:已启动才重启,否则不做操作
service name condrestart==> systemctltry-restart name.service
重载或重启服务:先加载,再启动
systemctlreload-or-restart name.service
重载或条件式重启服务:
systemctlreload-or-try-restart name.service
禁止自动和手动启动:
systemctlmask name.service
取消禁止:
systemctlunmask name.service

 

服务查看
查看某服务当前激活与否的状态:
systemctlis-active name.service
查看所有已经激活的服务:
systemctllist-units --type|-t service
查看所有服务:
systemctllist-units --type service –all|-a
chkconfig命令的对应关系:
设定某服务开机自启:
chkconfigname on ==> systemctlenable name.service
设定某服务开机禁止启动:
chkconfigname off ==> systemctldisable name.service
查看所有服务的开机自启状态:
chkconfig--list ==> systemctllist-unit-files --type service
用来列出该服务在哪些运行级别下启用和禁用
chkconfig sshd –list ==>
ls /etc/systemd/system/*.wants/sshd.service
查看服务是否开机自启:
systemctlis-enabled name.service
其它命令:
查看服务的依赖关系:
systemctllist-dependencies name.service
杀掉进程:
systemctlkill 进程名

 

服务状态
systemctl list-units --type service --all显示状态
loaded:Unit配置文件已处理
active(running):一次或多次持续处理的运行
active(exited):成功完成一次性的配置
active(waiting):运行中,等待一个事件
inactive:不运行
enabled:开机启动
disabled:开机不启动
static:开机不启动,但可被另一个启用的服务激活

 

显示所有单元状态
systemctl 或systemctl list-units
只显示服务单元的状态
systemctl--type=service
显示sshd服务单元
systemctlstatus sshd.service–l
验证sshd服务当前是否活动
systemctlis-active sshd
启动,停止和重启sshd服务
systemctlstart sshd.service
systemctlstop sshd.service
systemctlrestart sshd.service
systemctl 命令示例

 

重新加载配置
systemctlreload sshd.service
列出活动状态的所有服务单元
systemctllist-units --type=service
列出所有服务单元
systemctllist-units --type=service --all
查看服务单元的启用和禁用状态。
systemctllist-unit-files --type=service
列出失败的服务
systemctl--failed --type=service
systemctl 命令示例

 

列出依赖的单元
systemctllist-dependencies sshd
验证sshd服务是否开机启动
systemctlis-enabled sshd
禁用network,使之不能自动启动,但手动可以
systemcltdisable network
启用network
systemctlenable network
禁用network,使之不能手动或自动启动
systemcltmask network
启用network
systemctlumasknetwork
systemctl 命令示例

 

运行级别
target units:
unit配置文件:.target
ls /usr/lib/systemd/system/*.target
systemctl list-unit-files --type target --all
运行级别:
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
查看依赖性:
systemctl list-dependencies graphical.target

 

运行级别
级别切换:init N ==> systemctlisolate name.target
systemctl isolate multi-user.target
注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctldaemon-reload才能生效)
查看target:
runlevelwho -r
systemctllist-units --type target
获取默认运行级别:
/etc/inittab==> systemctlget-default
修改默认级别:
/etc/inittab==> systemctlset-default name.target
systemctl set-default multi-user.target
ls –l /etc/systemd/system/default.target

 

其它命令
切换至紧急救援模式:
systemctlrescue
切换至emergency模式:
systemctlemergency
其它常用命令:
传统命令init,poweroff,halt,reboot都成为
systemctl的软链接
关机:systemctlhalt、systemctlpoweroff
重启:systemctlreboot
挂起:systemctlsuspend
休眠:systemctlhibernate
休眠并挂起:systemctlhybrid-sleep

 

CentOS7引导顺序
UEFi或BIOS初始化,运行POST开机自检
选择启动设备
引导装载程序, centos7是grub2
加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加载initramfs驱动模块
加载内核选项
内核初始化,centos7使用systemd代替init
执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件/etc/systemd/default.target /etc/systemd/system/
systemd执行sysinit.target初始化系统及basic.target准备操作系统
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登入服务
systemd执行graphical需要的服务

 

service unit文件格式
/etc/systemd/system:系统管理员和用户使用/usr/lib/systemd/system:发行版打包者使用
以“#” 开头的行后面的内容会被认为是注释
相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭。
时间单位默认是秒,所以要用毫秒(ms)分钟(m)等请显式说明
service unit file文件通常由三部分组成:
[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
[Service]:与特定类型相关的专用选项;此处为Service类型
[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
Unit段的常用选项:
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
Requires:依赖到的其它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:ExecStart前运行
ExecStartPost:ExecStart后运行
ExecStop:指明停止unit要运行的命令或脚本
Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
Install段的常用选项:
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务
注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启
# systemctl daemon-reload

 

服务Unit文件示例:
vim /etc/systemd/system/bak.service
[Unit]
Description=backup my etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start bak

 

设置内核参数,只影响当次启动
启动时,在linux16行后添加systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=recure.target
recure.target 比emergency 支持更多的功能,例如日志等
设置内核参数

 

文件系统损坏
先尝试自动修复,失败则进入emergency shell
,提示用户修复
在/etc/fstab不存在对应的设备和UUID
等一段时间,如不可用,进入emergency shell
在/etc/fstab不存在对应挂载点
systemd尝试创建挂载点,否则提示进入emergency shell.
在/etc/fstab不正确的挂载选项
提示进入emergency shell
启动排错

 

启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,添加内核参数rd.break
按ctrl-x启动
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
破解root口令

 

修复GRUB2
GRUB“the Grand Unified Bootloader”
引导提示时可以使用命令行界面
可从文件系统引导
主要配置文件/boot/grub2/grub.cfg
修复配置文件
grub2-mkconfig > /boot/grub2/grub.cfg
修复grub
grub2-install /dev/sda BIOS环境
grub2-install UEFI环境

 

练习
为编译安装的httpd服务,实现service unit文件
破解centos7 口令
修改默认的启动内核
启动时临时禁用SELinux
启动时进入emergency模式
删除编译安装的新内核