1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理
2、描述awk命令用法及示例(至少3例)
3、描述awk函數示例(至少3例)
1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理
Systemd
簡介
系統初始化與服務管理工具,是Centos7與Centos5,Centos6不同的init工具。
特性
- 系統引導時實現服務并行啟動;
- 按需激活進程;
- 系統狀態快照;
- 基于依賴關系定義服務控制邏輯;
- 基于socket的激活機制:socket與程序分離;
- 基于bus的激活機制;
- 基于device的激活機制;
- 基于Path的激活機制;
- 系統快照:保存各unit的當前狀態信息于持久存儲設備中;
- 向后兼容sysv init腳本; /etc/init.d/
核心概念unit
unit由其相關配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息; 這些配置文件主要保存在:
- /usr/lib/systemd/system
- /run/systemd/system
- /etc/systemd/system
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, 用于定義文件系統中的一文件或目錄
管理系統服務
systemctl命令
- 簡介 控制系統和管理服務工具
- 格式
-
- systemctl [OPTIONS…] COMMAND [NAME…]
- 常見用法
-
- 啟動:systemctl start NAME.service
- 停止:systemctl stop NAME.service
- 重啟:systemctl restart NAME.service
- 狀態:systemctl status NAME.service
- 條件式重啟:systemctl try-restart NAME.service
- 重載或重啟服務: systemctl reload-or-restart NAME.servcie
- 重載或條件式重啟服務:systemctl reload-or-try-restart NAME.service
- 查看某服務當前激活與否的狀態: systemctl is-active NAME.service
- 查看所有已激活的服務:systemctl list-units –type service
- 查看所有服務(已激活及未激活): chkconfig –lsit ==> systemctl list-units -t service –all
- 設置服務開機自啟:systemctl enable NAME.service
- 禁止服務開機自啟:systemctl disable NAME.service
- 查看某服務是否能開機自啟:systemctl is-enabled NAME.service
- 禁止某服務設定為開機自啟: systemctl mask NAME.service
- 取消此禁止: systemctl unmask NAME.servcie
- 查看服務的依賴關系:systemctl list-dependencies NAME.service
管理target
- 運行級別:CentOS7并沒有很明顯的級別概念,更多的只是為了兼容CentOS5,CentOS6。
-
- 0 ==> runlevel0.target, poweroff.target 兩種寫法都是等價的,下同
- 1 ==> runlevel1.target, rescue.target
- 2 ==> runlevel2.tartet, multi-user.target
- 3 ==> runlevel3.tartet, multi-user.target
- 4 ==> runlevel4.tartet, multi-user.target
- 5 ==> runlevel5.target, graphical.target
- 6 ==> runlevel6.target, reboot.target
- 級別切換
-
- systemctl isolate NAME.target
- 級別查看
-
- systemctl list-units –type target
- 查看所有級別
-
- systemctl list-units -t target -a
- 獲取默認運行級別:
-
- systemctl get-default
- 修改默認運行級別
-
- systemctl set-default NAME.target
- 切換至緊急救援模式
-
- systemctl rescue
- 切換至emergency模式
-
- systemctl emergency
-
- systemctl emergency
其他常用命令
- 關機: systemctl halt, systemctl poweroff
- 重啟: systemctl reboot
- 掛起: systemctl suspend
- 快照: systemctl hibernate
- 快照并掛起: systemctl hybrid-sleep
unit file
- 文件通常有三部分組成:
-
- [Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述信息、unit行為及依賴關系等;以下是一些常見選項
-
-
- Description:描述信息;服務的文檔,可以是一個或多個文檔的URL路徑。;
- After:定義unit的啟動次序;表示當前unit應該晚于哪些unit啟動;其功能與Before相反;
- Requies:依賴到的其它units;強依賴,被依賴的units無法激活時,當前unit即無法激活;
- Wants:依賴到的其它units;弱依賴,其他units啟動失敗并不影響當前unit啟動;
- Conflicts:定義units間的沖突關系,與這個模塊有沖突的模塊,如果列出模塊中有已經在運行的,這個服務就不能啟動,反之亦然;
-
- [Service]:與特定類型相關的專用選項;此處為Service類型;以下是一些常用選項
-
- Type:服務的類型,常用的有 simple(默認類型) 和 forking。默認的 simple 類型可以適應于絕大多數的場景,因此一般可以忽略這個參數的配置。而如果服務程序啟動后會通過 fork 系統調用創建子進程,然后關閉應用程序本身進程的情況,則應該將 Type 的值設置為 forking,否則 systemd 將不會跟蹤子進程的行為,而認為服務已經退出。; 類型有以下幾種
-
-
- simple:默認,表示execstart啟動的進程就是主進程
- forking:表示execstart啟動父進程的一個子進程為主進程,啟動完成之后父進程會退出
- oneshot:執行一次之后就退出
- dbus:
- notify:
- idle:
-
-
- EnvironmentFile:環境配置文件;
- ExecStart:指明啟動unit要運行命令或腳本; ExecStartPre, ExecStartPost
- ExecStop:指明停止unit要運行的命令或腳本;
- Restart:指名重啟unit需要運行的命令或腳本
- [Install]:定義由“systemctl enable”以及”systemctl disable“命令在實現服務啟用或禁用時用到的一些選項;
-
-
- Also:當這個服務被enable/disable時,將自動enable/disable后面列出的每個模塊。
- RequiredBy:和前面的 Requires 作用相似,同樣后面列出的不是服務所依賴的模塊,而是依賴當前服務的模塊;
- WantedBy:和前面的 Wants 作用相似,只是后面列出的不是服務所依賴的模塊,而是依賴當前服務的模塊。
-
注意:對于新創建的unit文件或修改了的unit文件,要通知systemd重載此配置文件;
systemctl daemon-reload
例子
為當前系統的nginx服務提供一個unit文件
[Unit]
Description=The nginx HTTP
Server After=network.target remote-fs.target nss-lookup.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 stop
[Install]
WantedBy=multi-user.target
2、描述awk命令用法及示例(至少3例)
awk
簡介
awk的作者是Aho, Weinberger, Kernighan,所以awk名字的由來就是三個作者的首字母組成。報告生成器,格式化文本輸出;
語法
gawk [options] ‘program’ FILE …
program: PATTERN{ACTION STATEMENTS}
常用選項
- -F:指明輸入時用到的字段分隔符;
- -v var=value: 自定義變量;
- -f program-file :可以用-f指定編寫了awk程序的文件
常用的關鍵字
1.print
print item1, item2, …
要點:
- 逗號分隔符;
- 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;
- 如省略item,相當于print $0;
例子:
查看系統上的所有用戶
awk -F: ‘{print $1}’ /etc/passwd
2.變量
內建命令:
- 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:當前文件名;
- ARGC:命令行參數的個數;
- ARGV:數組,保存的是命令行所給定的各參數;
自定義變量
- -v var=value
- 在program中直接定義
例子:
獲取命令行的第二個參數
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab
將:作為字段分隔符,取出最后一個字段的值
awk -v FS=’:’ ‘{print $NF}’ /etc/passwd
awk ‘BEGIN{FS=”:”}{print $NF}’ /etc/passwd
3.printf
格式化輸出
printf FORMAT, item1, item2, …
要點:
- FORMAT必須給出;
- 不會自動換行,需要顯式給出換行控制符,\n
- FORMAT中需要分別為后面的每個item指定一個格式化符號;
常用的格式符
- %c: 顯示字符的ASCII碼;
- %d, %i: 顯示十進制整數;
- %e, %E: 科學計數法數值顯示;
- %f:顯示為浮點數;
- %g, %G:以科學計數法或浮點形式顯示數值;
- %s:顯示字符串;
- %u:無符號整數;
- %%: 顯示%自身;
修飾符:
- #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度; %3.1f
- -: 左對齊
- +:顯示數值的符號
例子
格式化輸出系統用戶以及其UID
awk -F: ‘{printf “username:%15s,UID:%16d\n”,$1,$3}’ /etc/passwd
4.操作數
- 操作符:
-
- x+y
- x-y
- x*y
- x/y
- x^y
- x%y
- -x
- +x: 轉換為數值;
- 賦值操作符:
-
- =:直接賦值
- +=:例如x+=5,等價于x=x+5
- -=:例如x-=5,等價于x=x-5
- *=:例如x*=5,等價于x=x*5
- /=:例如x/=5,等價于x=x/5
- %=:例如x%=5,等價于x=x%5,對5取余
- :自增;例如i;等價于i=i+1
- –:自減;例如i–;等價于i=i-1
- 比較操作符:
-
- >:大于比較
- >=:大于等于
- <:小于比較
- <=:小于等于
- !=:不等于
- ==:等于
- 模式匹配符:
-
- ~:是否匹配
- !~:是否不匹配
- 邏輯操作符:
-
- && 與
- || 或
- ! 非
- 函數調用:
-
- 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
- empty:空模式,匹配每一行;
- /regular expression/:僅處理能夠被此處的模式匹配到的行;
- relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;
真:結果為非0值,非空字符串;
- line ranges:行范圍,
- startline,endline:/pat1/,/pat2/
注意: 不支持直接給出數字的格式
- BEGIN/END模式
-
- BEGIN{}: 僅在開始處理文件中的文本之前執行一次;
- END{}:僅在文本處理完成之后執行一次;
例子
1./etc/passwd 所有行的第一個字段
awk -F: ‘{print $1}’ /etc/passwd
2./etc/passwd 第二行到第十行,以:為分隔符的第一個字段
awk -F: ‘(NR>=2&&NR<=10){print $1}’ /etc/passwd
3./etc/passwd 匹配到開頭為root的行
awk -F: ‘/^root\>/{print}’ /etc/passwd
4./etc/passwd 輸出開頭為root與bin之間的行
awk -F: ‘/^root\>/,/^bin\>/{print}’ /etc/passwd
5./etc/passwd 處理文件之前輸出“BEGIN”,處理完輸出“END”
awk ‘BEGIN{printf “BEGIN\n”}{print}END{printf “END\n”}’ /etc/passwd
6.常用的action
- if-else
語法:if(condition) statement [else statement]
使用場景:對awk取得的整行或某個字段做條件判斷;
例子
/etc/passwd uid大于1000輸出“Common user”,否則輸出“root or Sysuser”
awk -F: ‘{if($3>=1000) {printf “Common user: %s\n”,$1} else {printf “root or Sysuser: %s\n”,$1}}’ /etc/passwd
輸出shell為/bin/bash的用戶
awk -F: ‘{if($NF==”/bin/bash”) print $1}’ /etc/passwd
如果字段數大于5輸出此行
awk ‘{if(NF>5) print $0}’ /etc/fstab
輸出使用量大于10%的磁盤
df -h | awk -F[%] ‘/^\/dev/{print $1}’ | awk ‘{if($NF>=10) print $1}’
- while循環
語法:while(condition) statement
條件“真”,進入循環;條件“假”,退出循環;
使用場景:對一行內的多個字段逐一類似處理時使用;對數組中的各元素逐一處理時使用;
例子
輸出/etc/grub2.cfg文件中匹配到linux16的行的每個單詞長度
awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}’ /etc/grub2.cfg
輸出/etc/grub2.cfg文件中匹配到linux16的行的長度大于等于7的單詞
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)
意義:至少執行一次循環體
- for循環
語法:
-
- for(expr1;expr2;expr3) statement
- for(variable assignment;condition;iteration process) {for-body}
- for(var in array) {for-body} 遍歷數組
例子
輸出/etc/grub2.cfg文件中匹配到linux16的行的每個單詞長度
awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg
for遍歷數組的特殊用法
awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]=”Tuesday”;for(i in weekdays) {print weekdays[i]}}’
- switch語句
語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
- break和continue
-
- break[n] 表示退出n層循環,默認退出本層本層循環
- continue[n]表示退出本層循環
- next
提前結束對本行的處理直接進入下一行
輸出UID為偶數的用戶名與UID
awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd
7.array 數組
語法:array[index-expression]
index-expression:
- 可使用任意字符串;字符串要使用雙引號;
- 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”;
例子:
awk ‘BEGIN{for(i=0;i<10;i++){ary[i]=i}for(j=0;j<10;j++){printf “%d\n”,ary[j]}}’
查看各個tcp連接狀態數量
netstat -tan | awk ‘/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}’
統計指定文件中每個單詞出現的次數
awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}’ /etc/fstab
統計/etc/fstab文件中每個文件系統類型出現的次數;
awk ‘/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}’ /etc/fstab
8.函數
- 內置函數
-
- 常用的數值處理函數
-
-
- rand():返回0和1之間一個隨機數;
-
-
- 常用的字符串處理
-
-
- length([s]):返回指定字符串的長度;
- sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其第一次出現替換為s所表示的內容;
- gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其所有出現均替換為s所表示的內容;
- split(s,a[,r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中;
-
- 自定義函數
3、描述awk函數示例(至少3例)
(1)輸出10個隨機數
awk ‘BEGIN{for (i=0;i<10;i++){print rand()}}’
(2)length使用示例
echo “Hello World” | awk ‘{print $0,length($0)}’
(3)split使用示例
netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}END{for (i in count) {print i,count[i]}}’
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/104631