Linux 第22天: (09月20日) Linux GAWK SYSTEMDlinux
GAWKshell
本章內容
awk介紹
awk基本用法
awk變量
awk格式化
awk操做符
awk條件判斷
awk循環
awk數組
awk函數
調用系統命令express
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: 自定義變量vim
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 的操做centos
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}’bash
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}'ssh
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
+:顯示數值的正負符號%+dsocket
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
練習
一、統計/etc/fstab文件中每一個文件系統類型出現的次數
# awk'/^UUID/{fs[$3]++}END{for(iin fs) {print i,fs[i]}}' /etc/fstab
二、統計/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:發行版打包者使用
以「#」 開頭的行後面的內容會被認爲是註釋
相關布爾值,一、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模式刪除編譯安裝的新內核