一、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理。
1、Systemd的新特性:
- 系統引導時實現服務并行啟動;
- 按需激活進程;
- 系統狀態快照;
- 基于依賴關系定義服務控制邏輯;
- 支持快照和系統恢復;
- 維護掛載點和自動掛載點;
2、核心概念:unit
- unit由其相關配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息;
- 這些配置文件主要保存在以下目錄中:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
3、unit的常見類型:
- Service unit:文件擴展名為.service,用于定義系統服務;
- Target unit:文件擴展為.target,用于模擬實現“運行級別”;(centos7 實際上是沒有運行級別的默認都是不啟動的)
- Device unit:后綴名為.device,用于定義內核識別的設備;
- Mount unit:后綴名為.mount,定義文件系統掛載點;
- Socket unit:后綴名為.socket,用于標識進程間通信用到的socket文件;
- Snapshot unit:后綴名為 .snapshot,管理系統快照;
- Swap unit:后綴名為.swap, 用于標識swap設備;
- Automount unit:后綴名為.automount,文件系統自動點設備;
- Path unit:后綴名為.path, 用于定義文件系統中的一文件或目錄;
4、關鍵特性:
- 基于socket的激活機制:socket與程序分離,將套接字先分配但時程序本身未啟動
- 基于bus的激活機制:基于總線的請求來激活設備
- 基于device的激活機制:設備插入時候自動掛載激活設備,掛載點不存在自動創建
- 基于Path的激活機制:監控目錄文件是否存在來激活服務或者進程
- 系統快照:保存各unit的當前狀態信息于持久存儲設備中;
- 向后兼容sysv init腳本; /etc/init.d/下的腳本也能兼容
注意:也存在不兼容情況:
1)systemctl的命令是固定不變的;
2)非由systemd啟動的服務,systemctl無法與之通信;
5、管理系統服務:
CentOS 7: service類型的unit文件;
- syscemctl命令:控制systemd系統和服務管理
- 格式:systemctl [OPTIONS…] COMMAND [NAME…]
?
6、服務單元模塊
文件通常由三部分組成:
(1)[Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述信息、unit行為及依賴關系等;
Unit段的常用選項:
- Description:描述信息;意義性描述;
- After:定義unit的啟動次序;表示當前unit應該晚于哪些unit啟動;其功能與Before相反;
- Requies:依賴到的其它units;強依賴,被依賴的units無法激活時,當前unit即無法激活;
- Wants:依賴到的其它units;弱依賴
- Conflicts:定義units間的沖突關系;
(2) [Service]:與特定類型相關的專用選項;此處為Service類型;
Service段的常用選項:
- Type:用于定義影響ExecStart及相關參數的功能的unit進程啟動類型;
- 類型種類:
- simple:默認。由ExecStart指明的進程所啟動起來進程為主進程
- forking:由ExecStart所啟動的進程生成的一個子進程為主,父進程退出
- oneshot:一次性的啟動,后續的unit進程啟動后,該進程退出
- dbus:僅在得到dbus之后才推出
- notify:發送通知以后才能運行
- idle:類似于simple
- 類型種類:
- EnvironmentFile:環境配置文件,為ExecStart提供一些變量;
- ExecStart:指明啟動unit要運行命令或腳本;ExecStartPre, ExecStartPost
- ExecStop:指明停止unit要運行的命令或腳本;
- Restart:啟動此項,意外終止會自動重啟腳本
(3) [Install]:定義由“systemctl enable”以及”systemctl disable“命令在實現服務啟用或禁用時用到的一些選項;
- Install段的常用選項:
Alias:當前unit的別名
RequiredBy:被哪些units所依賴;
WantedBy:被哪些units所依賴;
(4)注意:對于新創建的unit文件或,修改了的unit文件,要通知systemd重載此配置文件;
- #systemctl daemon-reload
7、源碼安裝apache實現通過systemd來管理
(1)源碼編譯安裝Apache至少需要apr、apr-util、pcre組件的支持。
源碼的安裝一般由3個步驟組成:配置(configure)、編譯(make)、安裝(make install)。
(2)查詢是否安裝了apache服務器httpd
[root@localhost ]# rpm -qa | grep httpd
httpd-2.4.6-45.el7.centos.x86_64
httpd-tools-2.4.6-45.el7.centos.x86_64
(3)卸載系統自動裝的apache服務器httpd
[root@localhost ]# httpd -k stop #停止httpd服務器
[root@localhost ]# yum remove httpd #卸載httpd服務器
(4)下載apr、apr-util、pcre組件和Apache源碼
[root@localhost ]# wget http://archive.apache.org/dist/apr/apr-1.6.2.tar.gz #下載apr
[root@localhost ]# wget http://archive.apache.org/dist/apr/apr-util-1.6.0.tar.dz2 #下載apr-util
[root@localhost ]# wget http://archive.apache.org/dist/httpd/httpd-2.4.27.tar.bz2 #下載httpd
[root@localhost ]# wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz #下載pcre
(5)安裝expat-devel和編譯環境包
[root@localhost ]# yum install expat-devel #安裝expat-deval
[root@localhost ]# yum groupinstall “Development Tools”#安裝包含gcc的包組
(6)安裝apr組件
[root@localhost ]# tar xvf apr-1.6.2.tar.gz #解壓縮 apr
[root@localhost ]# cd apr-1.6.2 #切換目錄
[root@localhost apr-1.6.2]# ./configure –prefix=/usr/local/apr #配置安裝路徑和相關組件路徑
[root@localhost apr-1.6.2]# make #編譯
[root@localhost apr-1.6.2]# make install #安裝
(7)安裝apr-util組件
[root@localhost ]# tar xvf apr-util-1.6.0.tar.bz2 #解壓縮 apr-util
[root@localhost ]# cd apr-util-1.6.0 #切換目錄
[root@localhost apr-util-1.6.0]# ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr #配置安裝路徑和相關組件路徑
[root@localhost apr-util-1.6.0]# make #編譯
[root@localhost apr-util-1.6.0]# make install #安裝
(8)安裝pcre組件
[root@localhost ]# tar xvf pcre-8.41.tar.gz #解壓縮 pcre
[root@localhost ]# cd pcre-8.41 #切換目錄
[root@localhost pcre-8.41]# ./configure –prefix=/usr/local/pcre #配置安裝路徑和相關組件路徑
[root@localhost pcre-8.41]# make #編譯
[root@localhost pcre-8.41]# make install #安裝
(9)安裝Apache
[root@localhost ]# tar xvf httpd-2.4.27.tar.bz2 #解壓縮httpd
[root@localhost ]# cd httpd-2.4.27 #切換目錄
[root@localhost httpd-2.4.27]#./configure –prefix=/usr/local/apache –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –with-pcre=/usr/local/pcre #配置安裝路徑和相關組件路徑
[root@localhost httpd-2.4.27]# make #編譯
[root@localhost httpd-2.4.27]# make install #安裝
(10)配置httpd腳本
[root@localhost ~]# vim /usr/local/apache/conf/httpd.conf #修改httpd.conf
[root@localhost ~]# /usr/local/apache/bin/apachectl start #測試啟動httpd
httpd (pid 106576) already running #啟動成功
[root@localhost ~]# cd /etc/rc.d/init.d #切換目錄
[root@localhost init.d]# ls #查找是否有httpd文件
functions netconsole network README
[root@localhost init.d]# vim httpd #新建編輯httpd文件寫入腳本
#!/bin/bash## httpd Startup script for the Apache HTTP Server## chkconfig: – 85 15# description: The Apache HTTP Server is an efficient and extensible \# server implementing the current HTTP standards.if [ -f /etc/sysconfig/httpd ]; then. /etc/sysconfig/httpdfiprog=${HTTPD-/usr/local/apache/bin/httpd}[ -L /usr/sbin/httpd ] || ln -sv $prog /usr/sbinlockfile=${LOCKFILE-/var/lock/subsys/httpd}prog=$(basename $prog)?check_prog() {[ -f $lockfile ] && RETVAL=0 || RETVAL=1return $RETVAL}?lcc_start() {check_progif [ $RETVAL -eq 0 ]; thenecho “$prog is started.”else#$prog $OPTIONS -DFOREGROUND$prog $OPTIONSif [ $? -eq 0 ]; thentouch $lockfileecho “$prog start ok”elseecho “$prog start fail”fifi?}lcc_stop() {check_progif [ $RETVAL -eq 0 ]; thenkill -9 `pgrep $prog` &> /dev/nullrm -f $lockfile[ $? -eq 0 ] && echo “$prog stop finished.” || echo “$prog stop fail.”elseecho “$prog is stopped.”fi}lcc_restart() {lcc_stoplcc_start}lcc_status() {check_prog[ $? -eq 0 ] && echo “$prog is running.” || echo “$prog is stopping”}?case “$1“ instart|stop|restart|status)lcc_$1;;*)echo $“Usage: $prog {start|stop|restart|status}”RETVAL=2;;esac?exit $RETVAL
[root@localhost init.d]# chkconfig –add httpd #添加服務后重啟
[root@localhost ~]# systemctl start httpd.service #啟動命令
[root@localhost ~]# systemctl is-active httpd.service
active #已啟動
[root@localhost ~]# systemctl stop httpd #停止命令
[root@localhost ~]# systemctl is-active httpd.service #查詢httpd狀態
failed #已停止
二、描述awk命令用法及示例
1、什么是gawk
gawk 是模式掃描和實現處理的語言,主要功能是實現文本格式化輸出
2、基本用法:
- 格式:gawk [options] ‘program’ FILE …
- program: PATTERN{ACTION STATEMENTS}
語句之間用分號分隔
print, printf實現文本格式化輸出 - 選項:
-F:指明輸入時用到的字段分隔符;
-v var=value: 自定義變量;
- program: PATTERN{ACTION STATEMENTS}
3、print
- 格式 print item1, item2, …
示例:
- 要點:
(1) 逗號分隔符;
(2) 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;
(3) 如省略item,相當于print $0;
4、變量
內建變量
- FS:input field seperator,輸入默認為空白字符;
- FS: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:數組,保存的是命令行所給定的各參數;
示例:
- (1) -v var=value
變量名區分字符大小寫; - (2) 在program中直接定義
6、printf命令
- 格式化輸出:printf FORMAT, item1, item2, …
- (1) FORMAT格式符必須給出;
- (2) 不會自動換行,需要顯式給出換行控制符,\n
- (3) FORMAT中需要分別為后面的每個item指定一個格式化符號;
- 格式符:
%c: 顯示字符的ASCII碼;
%d, %i: 顯示十進制整數;
%e, %E: 科學計數法數值顯示;
%f:顯示為浮點數;
%g, %G:以科學計數法或浮點形式顯示數值;
%s:顯示字符串;
%u:無符號整數;
%%: 顯示%自身; - 修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度;
%3.1f
-: 左對齊
+:顯示數值的符號 - 示例:
- 算術操作符:x+y, x-y, x*y, x/y, x^y, x%y ,-x,+x: 轉換為數值;
- 字符串操作符:沒有符號的操作符,字符串連接
- 賦值操作符:=, +=, -=, *=, /=, %=, ^=++, –
- 比較操作符:>, >=, <, <=, !=, ==
- 模式匹配符:
- ~:是否匹配
- !~:是否不匹配
- 邏輯操作符:&&,||,!
示例:判斷用戶id大于1000的為系統用戶:
- (1) empty:空模式,匹配每一行;
- (2) /regular expression/:僅處理能夠被此處的模式匹配到的行;
- (3) relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;真:結果為非0值,非空字符串;
- (4) line ranges:行范圍,
startline,endline:/pat1/,/pat2/
BEGIN{}: 僅在開始處理文件中的文本之前執行一次;
END{}:僅在文本處理完成之后執行一次;
(1)if語句
格式:
- if(condition) {statments}
- if(condition) {statments} else {statements}
- while(conditon) {statments}
- do {statements} while(condition)
- for(expr1;expr2;expr3) {statements}
- break
- continue
- delete array[index]
- delete array
- exit
(2)判斷語句 if-else
- 語法:if(condition) statement [else statement]
- 使用場景:對awk取得的整行或某個字段做條件判斷;
(3)、 while循環
- 語法:while(condition) statement
條件“真”,進入循環;條件“假”,退出循環; - 使用場景:對一行內的多個字段逐一類似處理時使用;對數組中的各元素逐一處理時使用;
(4)、do-while循環
- 語法:do statement while(condition)
意義:至少執行一次循環體
(5)、 for循環
- 語法:for(expr1;expr2;expr3) statement
- 格式:for(variable assignment;condition;iteration process) {for-body}
- 特殊用法:
能夠遍歷數組中的元素;
語法:for(var in array) {for-body}
(6) switch語句
- 語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
(7) break和continue
- break [n]:跳出循環
- continue:提前結束本次循環,進入下一次循環
(8) next
- 提前結束對本行的處理而直接進入下一行;
10、array關聯數組
- 關聯數組:array[index-expression]
- index-expression:
(1) 可使用任意字符串;字符串要使用雙引號;
(2) 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”; - 若要判斷數組中是否存在某元素,要使用”index in array”格式進行;
- 用法:
- weekdays[mon]=”Monday”
- 若要遍歷數組中的每個元素,要使用for循環;
- for(var in array) {for-body}
- 注意:var會遍歷array的每個索引;
state[“LISTEN”]++數組state
state[“ESTABLISHED”]++數組establish
示例:統計/etc/fstab文件中每個文件系統類型出現的次數;
示例:統計指定文件中每個單詞出現的次數;
三、描述awk函數示例
- 內置函數
- 數值處理:
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所表示的數組中;
示例:
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97967