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開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺贐EGIN語句塊中
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.www58058.com/47864
總結的很全面,但是沒什么層次感,建議能進行一些層次化的劃分,即通過各個小標題來實現。