GNU awkGNU awk
文本处理三工具:grep,sed,awk
grep,egrep,fgrep:文本过滤工具
sed:行(流)编辑器
awk:报告生成器,格式化文本输出
awk
awk: Aho, Weinberger, Kernighan,报告生成器,格式化文本输出
有多种版本:New awk(nawk),GNU awk(gawk)
gawk -模式扫描和处理语言
基本用法:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'pattern{ action;… }' file …
通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成
program通常是被单引号或双引号中,语句之间用分号分割
选项:
awk工作原理
第一步:执行BEGIN{action $1,$2..}语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{action $1,$2..}语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{print},即打印每一个读取到的行,awk读取的每一行都会执行该语句块
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
1、awk [options] 'pattern{action $1,$2..}' file…
pattern和action:
pattern部分决定动作语句何时触发及触发事件(BEGIN,END)
action对数据进行处理,放在{}内指明(print, printf)
分割符、域和记录
段称为域,行称为记录
以逗号作为域标记分隔符,$1,$2..$n称为域标识,$0为所有域。
以空格作为域标记分割符时,将会被认为一个域
注意:
文件的每一行称为记录
和shell中变量$符含义不同
放在引号内将被认为普通字符串
省略$1,$2..,则默认执行$0的操作。
输出的各$1,$2..可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
练习:
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}’
2、awk变量:
自定义变量
-v var='value': 自定义变量(一个-v定义一个变量)
(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}'
内置变量
-v var='value': 定义内置变量值(一个-v定义一个变量)
FS:输入字段分隔符,默认为任意个空白字符
-F:指明输入时用到的字段分隔符,默认为任意个空格
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,第二个参数/etc/fstab,第三个参数/etc/inittab
3、printf命令
格式化输出:printf “FORMAT”, $1,$2…
(1) 必须指定FORMAT
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%: 显示%自身
修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐)%-15s
+:显示数值的正负符号%+d
示例:
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: 转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, —
比较操作符:
>, >=, <, <=, !=, ==
模式匹配符:
~:左边是否和右边匹配包含
!~:是否不匹配
示例
cat /etc/passwd|awk'$0 ~ /root/'|wc-l
cat /etc/passwd|awk'$0 !~ /root/'|wc-l
逻辑操作符:&&,||,!
示例:
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
5、PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
示例:
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
(3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;
真:结果为非0值或非空字符串
假:结果为空字符串
示例:
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'
seq 10 | awk 'i=!i'
4) line ranges:行范围
startline,endline:/pat1/,/pat2/不支持直接给出数字格式
示例:
awk -F: '/^root/,/^nobody/{print $1}' /etc/passwd
awk -F: '(NR>=2&&NR<=10){print $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
6、action分类
(1) Expressions:算术,比较表达式等
(2) Control statements:if, while等
(3) Compound statements:组合语句
(4) input statements:输入语句
(5) output statements:输出语句
{statements;…} 组合语句
if(condition) statements;… 单分支if语句
if(condition) {statements;…} else {statements;…} 双分支if语句
while(conditon) {statments;…} while循环
do {statements;…} while(condition) do循环(无论条件如何,先执行一遍循环体)
for(expr1;expr2;expr3) {statements;…} for循环
break 中断循环
continue 中断本次循环(重新开始循环)
delete array[index] 删除数组中的指定元素
delete array 删除整个属组
exit 退出语句
if语句
if(condition) statements;… 单分支
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
df -h | awk -F[%] '/^\/dev/{print $1}'| awk '{if($NF>=80) print $1}'
awk 'BEGIN{ test=100;if(test>90) { print "very good";} else if(test>60) { print "good";} else { print "no pass";}}'
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)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
do-while循环
do statement while(condition) 无论真假,至少执行一次循环体
示例:
awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}'
for循环
for(expr1;expr2;expr3) statement
for(variable assignment;condition;iterationprocess) {for-body}
变量初始化 条件判断 变量修正表达式 循环体
示例:
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
特殊用法:for(var in array) {for-body} 遍历数组中的元素;
性能比较
#time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')
#time(total=0;for i in $(seq 10000);do total=$(($total+i));done;echo $total)
switch语句
switch(expression) {case VALUE1: statement; case VALUE2: statement; …; default: statement}
switch(expression) {case /REGEXP1/: statement; case /REGEXP2/: statement; …; default: statement}
break和continue
break [n]
continue [n]
示例:
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==11){break}sum+=i}print sum}‘
next 提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
7、awk数组
array[index-expression] 关联数组
index-expression 索引表达式
(1) 可使用任意字符串;字符串要使用双引号括起来
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
示例:
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
awk '!a[$0]++' dupfile
若要遍历数组中的每个元素,要使用for循环
for(var in array) {for-body}
注意:var会遍历array的每个索引
示例:
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
netstat -tan | awk '/^tcp\>/{state[$NF]++}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
8、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所表示的数组中
示例:
netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++} END{for (i in count) {print i,count[i]}}'
自定义函数
格式:
function name ( parameter, parameter, … ) {
statements
return expression
}
示例:
#cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
END{a=3;b=2;print max(a,b);}
#awk -f fun.awktestfile
9、awk中调用shell命令
system命令
空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用""引用起来。
示例:
awk BEGIN'{system("hostname") }'
awk'BEGIN{a=12; system("echo " a) }'
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
#f1.awk -F: /etc/passwd
向awk脚本传递参数
格式:awk.awk var=value var2=value2… Inputfile
示例:
#cat f2.awk
#!/bin/awk -f
{if($3 >=min && $3<=max)print $1,$3}
#f2.awk -F: min=100 max=200 /etc/passwd
练习
1、统计/etc/fstab文件中每个文件系统类型出现的次数
awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
2、统计/etc/fstab文件中每个单词出现的次数;
awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in 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: SysV init
CentOS 6: Upstart
CentOS 7: Systemd
Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
Systemd新特性:
系统引导时实现服务并行启动
按需启动守护进程
自动化的服务依赖关系管理
同时采用socket式与D-Bus总线式激活服务
系统状态快照
核心概念: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的当前状态信息于持久存储设备中
向后兼容sysv init脚本
不兼容:
systemctl命令固定不变,不可扩展
非由systemd启动的服务,systemctl无法与之通信和控制
管理系统服务:
CentOS 7: service unit
注意:能兼容早期的服务脚本
命令:systemctl COMMAND name.service
重载或重启服务:systemctl reload-or-restart name.service 先加载,再启动
重载或条件式重启服务:systemctl reload-or-try-restart name.service
禁止自动和手动启动:systemctl mask name.service
取消禁止:systemctl unmask name.service
查看所有已经激活的服务:systemctl list-units –type|-t service
chkconfig命令的对应关系:
启动: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
systemctl is-active name.service 查看某服务当前激活与否的状态
条件式重启:service name condrestart ==> systemctl try-restart name.service 已启动才重启,否则不做操作
设定某服务开机自启:chkconfig name on ==> systemctl enable name.service
设定某服务开机禁止启动:chkconfig name off ==> systemctl disable name.service
查看服务是否开机自启chkconfig name -list ==> systemctl is-enabled name.service
查看所有服务的开机自启状态:chkconfig –list ==> systemctl list-unit-files –type service
查看服务的依赖关系:systemctl list-dependencies name.service
杀掉进程:systemctl kill 进程名
服务状态
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服务单元systemctl status sshd.service -l
验证sshd服务当前是否活动systemctl is-active sshd
启动,停止和重启sshd服务
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
重新加载配置systemctl reload sshd.service
列出活动状态的所有服务单元systemctl list-units –type=service
列出所有服务单元systemctl list-units –type=service –all
查看服务单元的启用和禁用状态systemctl list-unit-files –type=service
列出失败的服务systemctl –failed –type=service
列出依赖的单元systemctl list-dependencies sshd
验证sshd服务是否开机启动systemctl is-enabled sshd
禁用network,使之不能自动启动,但手动可以systemclt disable network
启用network systemctl enable network
禁用network,使之不能手动或自动启动systemclt mask network
启用network systemctl umask network
运行级别 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 ==> systemctl isolate name.target
示例:systemctl isolate multi-user.target
注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl daemon-reload才能生效)
查看当前运行级别:
runlevel who -r
systemctl list-units –type target
ls -l /etc/systemd/system/default.target
获取默认运行级别:/etc/inittab ==> systemctl get-default
修改默认级别:
/etc/inittab配置文件修改为systemctl set-default name.target
systemctl set-default multi-user.target
手动删除旧软链接并创建新软链接
切换至紧急救援模式:systemctl rescue
切换至emergency模式:systemctl emergency
传统命令init,poweroff,halt,reboot都成为systemctl的软链接
关机:systemctl halt、systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend 不保存内存信息
休眠:systemctl hibernate 保存内存信息
休眠并挂起:systemctl hybrid-sleep
CentOS7引导顺序
UEFi或BIOS初始化,运行POST开机自检
选择启动设备
引导装载程序, centos7是grub2
加载装载程序的配置文件:
/boot/grub2/grub.cfg grub主配置文件
/etc/grub.d/
/etc/grub–>/boot/grub2/grub.cfg
/etc/default/grub 配置文件的模板文件,修改后执行grub2-mkconfig -o /boot/grub2/grub.cfg
加载initramfs驱动模块
加载内核选项
内核初始化,centos7使用systemd代替init
执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件
/etc/systemd/default.target
/etc/systemd/system/
CentOS7引导顺序
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
示例:
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 支持更多的功能,例如日志等,无法进入recure时进入emergency
启动排错
文件系统损坏
先尝试自动修复,失败则进入emergency shell,提示用户修复
在/etc/fstab不存在对应的设备和UUID
等一段时间,如不可用,进入emergency shell
在/etc/fstab不存在对应挂载点
systemd 尝试创建挂载点,否则提示进入emergency shell.
在/etc/fstab不正确的挂载选项
提示进入emergency shell
破解root口令
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,添加内核参数rd.break
按ctrl-x启动
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
修复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模式
删除编译安装的新内核
原创文章,作者:anonymous,如若转载,请注明出处:http://www.178linux.com/47864
评论列表(1条)
总结的很全面,但是没什么层次感,建议能进行一些层次化的划分,即通过各个小标题来实现。