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位置的字符