1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理
- Systemd
- POST–>Boot Swqueue(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的常見類型:
- 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,用于定義文件系統中的文件或目錄;
- 關鍵特性:
- 基于socket的激活機制:socket與程序分離;
- 基于bus的激活機制;
- 基于device的激活機制
- 基于path的激活機制
- 系統快照:保存各Unit的當前狀態信息于持久存儲設備中;
- 向后兼容sysv init腳本;
- /etc/init.d/
- 不兼容:
- systemctl的命令時固定不變的;
- 非由systemd啟動的服務,systemctl無法與之通信;
- 管理系統服務:
- centos 7:service類型的Unit文件;
- control 他和systemd system andservice 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==>systemct try-restart name.service
- 重載或重啟服務:systemctl reload-or-try-restart name.service
- 查看某服務當前激活與否的狀態:systemctl is-active name.service
- 查看所有已激活的服務:systemctl list-units –type service
- 查看所有服務(已激活及未激活):chkconfig–list==>systemctl list-unit -t service -a
- 設置服務開機自啟:chkconfig name on ==>systemctl enable name.service
- 禁止服務開機自啟:chkconfig name off==>systemctl disable name.service
- 查看某服務是否能開機自啟:chkconfig –list name==>systemctl is-enabled name.service
- 禁止某服務設定為開機自啟:systemctl mask name.service
- 取消上面的設定:systemctl unmask name.service
- 查看服務的依賴關系:systemctl list-dependencies name.service
- 管理target units:
- 運行級別:
- 0==>runlevel0.target,poweroff.target
- 1==>runlevel1.target,rescue.target
- 2==>runlevel2.target,multi-user.target
- 3==>runlevel3.target,nulti-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-unit -t target
- 查看所有級別:systemctl list-unit -t target -a
- 獲取默認運行級別:systemctl get-default
- 修改默認運行級別:systemctl set-default name.target
- 切換至緊急救援模式:systemctl rescue
- 切換至emergency模式:systemctl energency
- 其他常用命令:
- 關機:systemctl halt,systemctl poweroff
- 重啟:systemctl reboot
- 掛起: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啟動;其功能與被fore相反;
- Requles:依賴到的其他units;強依賴,被依賴的units無法激活時,當前unit即無法激活;
- Wants:一來到的其他units;弱依賴;
- Conflicts:定義units間的沖突關系
- service段的常用選項:
- type:用于定義影響execStart及相關參數的功能的unit進程啟動類型;
- 類型:
- simple:
- forking:
- oneshot
- dbus
- notify
- idle
- enironmentFILE:環境配置文件
- execstart:指明啟動unit要運行命令或腳本;execstartpre,execstartpost
- execstop:指明停止unit要運行的命令或腳本;
- restart:
- install段的常用選項:
- alias:
- requiredBy:被那些units所以賴;
- wantedBy:被那些units所以賴;
- 注意:對于新創建的unit文件或修改了的unit文件,要通知systemd重載此配置文件;
- systemctl daemon-reload
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??練習:為當前系統的httpd服務提供一個Unit文件;
- httpd.service
- [Unit]
- Description=The Apache HTTP Server
- After=network.target remote-fs.target nss-lookup.target
- [Service]
- Type=notify
- EnvironmentFile=/etc/sysconfig/httpd
- ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
- ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
- ExecStop=/bin/kill -WINCH ${MAINPID}
- KillSignal=SIGCONT
- PrivateTmp=true
- [Install]
- WantedBy=multi-user.target
- 編譯安裝的如nginx\apache實現通過systemd來管理
- 安裝開發環境
- [root@yinwei httpd]#yum install expat-devel
- [root@yinwei httpd]#yum install Development Tools
- [root@yinwei httpd]#yum install Server Platform Development
- root@yinwei ~]#tar -xf httpd-2.4.33.tar.bz2
- root@yinwei ~]#tar -xf apr-1.6.3.tar.gz
- root@yinwei ~]#tar -xf apr-util-1.6.1.tar.gz
- 安裝apr,apr-util
- root@yinwei ~]# cd apr-1.6.3
- root@yinwei ~]# ./configure 默認安裝
- root@yinwei ~]# make && make install
- root@yinwei ~]# cd apr-util-1.6.1
- root@yinwei ~]# ./configure 默認安裝
- root@yinwei ~]#make && make install
- 安裝pcre
- [root@yinwei ~]# unzip pcre-8.42.zip
- [root@yinwei ~]# cd pcre-8.42
- [root@yinwei pcre-8.42]# ./configure –prefix=/usr/local/pcre
- [root@yinwei pcre-8.42]# make && make install
- 安裝httpd
- [root@yinwei httpd]#cd /httpd
- [root@yinwei httpd]# ./configure –prefix=/usr/local/apache –with-pcre=/usr/local/pcre/ –with/usr/local/apr –with/usr/local/apr-util
- [root@yinwei httpd]#make
- [root@yinwei httpd]#make install
- 配置httpd腳本
- root@yinwei ~]#vim /usr/local/apache/conf/httpd.conf
- root@yinwei ~]#添加 ServerName localhost:80
- root@yinwei ~]#cd /etc/rc.d/init.d
- root@yinwei ~]#vi httpd
- #!/bin/bash# chkconfig: 12345 80 90function start_http(){
/usr/local/apache2/bin/apachectl ?start
}function stop_http()
{
?/usr/local/apache2/bin/apachectl ?stop
}case “$1” in
start)
????start_http
;; ?
stop)
????stop_http
;; ?
restart)
????stop_http
????start_http
;;
*) ???echo “Usage : start | stop | restart”
;;esac
root@yinwei ~]#chmod ug+x /etc/init.d/httpd
root@yinwei ~]#systemctl ?daemon-reload
root@yinwei ~]#systemctl ?start ?httpd
root@yinwei ~]#chkconfig –add httpd
2、描述awk命令用法及示例(至少3例)
- GNU awk
- 文本處理三工具:grep,sed,awk
- grep,egrep,ggrep:文本過濾工具;pattern
- sed:行編輯器
- awk:報告生成器,格式化文本輸出;
- AWK:Aho,Weinbereger,Kernighan–>New AWK,NAWK
- GNU awk,gawk
- gawk – pattern scanning and processing language
- 基本用法:gawk [options] ‘program’ FILE …
- 語句之間用分號分隔
- print,printf
- 選項:
- -F:指明輸入時用到的字段分隔符;
- -V var=value:自定義變量;
- 1.print
- print item1,item2,…
- 要點:
- 逗號分隔符:
- 輸出的各item可以是字符串,也可以時數值;當前記錄的字段,變量或awk的表達式:
- 如省略item,相當于 print $0;
- 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,行數
- FILENAME:當前文件名;
- ARGC:命令行參數的個數;
- ARGV:命令行數組的元素…[]可以列出
- 示例:awk ‘BEGIN{print ARGC}’
- awk ‘BEGIN{print ARGV[1]}’
- 自定義變量
- -v var=value
- 變量名區分字符大小寫;
- 在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}’
- printf命令
- 格式化輸出:printf FORMAT,item1,item2,…
- FORMAT必須給出;
- 不會自動換行,需要顯式給出換行控制符,\n
- FORMAT中需要分別為后面的每個item指定一個格式化符號;
- 格式符號
- %c:顯示字符的ASCII;
- %d,%i:顯示十進制整數;
- %e,%E:科學計數法數值顯示;
- %f:顯示為浮點數;
- %g,%G:以科學計數法或浮點形式顯示數值;
- %s:顯示字符串
- %u:無符號整數;
- %%:顯示%自身;
- 修飾符:
- #[.#]:第一個數字顯示的寬度:第二個標識小數點后的精度;
- %3.1f ?3個字符位置,小數點后一位顯示
- -:左對齊
- +:顯示數值的符號
- 操作符
- 算數操作符
- x+y,x-y,x*y,x/y,x^y,x%y
- -x:數前加-符號
- +x:轉換為數值;
- 字符串操作符:沒有符號的操作符,字符串連接
- 賦值操作符
- =,+=,-=,*=,/=,%= …..
- 比較操作符:
- >,>=,<,<=,==,!=
- 模式匹配服:
- ~:是否匹配
- !~:是否不匹配
- 邏輯操作符:
- &&
- ||
- !
- 函數調用:
- function_name(argu1,argu2,…)
- 條件表達式:
- selection?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
- PATTERN
- empty:空模式,匹配每一行;
- /regular expression/:僅處理能夠被此處的模式匹配到的行;
- relational expression:關系表達式:結果有真有假:結果為真才會被處理;真:結果為非零值,非空字符串;
- line ranges:行范圍 /pat1/,/pat2/
- 注意:不支持直接給出數字的格式
- 示例: awk -F: ‘(NR>=2&&NR<=10){print $1}’ /etc/passwd
- BEGIN/END模式
- BEGIN{}:僅在開始處理文件中的文本之前執行一次:
- END{}:僅在文本處理完成之后執行一次;
- 常用的action
- Expressions
- Control statemments: if,while等
- Compound statemments:
- input statements
- output statements
- 控制語句
- if(condition) {statments}
- if(condition) {statments} else {statements}
- while(condit) {statments}
- do {statments} while (condition)
- for(expr1;expr2;expr3) ?{statments}
- break
- continue
- delete array[index]
- delete array
- exit
- {statements}
- 控制語句 if-else
- 語法:if(condition) statement [else statement]
- 示例:
- awk -F: ‘{if($3>=1000) {printf “Common user:%s\n”,$1} else {printf “root or Sysuser:%s\n”,$1}}’ /etc/passwd
- awk -F: ‘{if($NF==”/bin/bash”) print $1}’ /etc/passwd
- awk ‘{if(NF>5) print $0}’ /etc/fstab
- df -h | awk -F[%] ‘/^\/dev/{print $1}’ |awk ‘{if($NF>=20) print $1}’
- 使用場景:對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)>=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}
- 示例:
- awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg
- 特殊用法:
- 能夠遍歷數組中的元素:
- 語法:for(var in array) {for-body}
- switch語句:
- swithc(expression) {case value1 or /regexp/:statement; case value2 or /regexp2/:statement; …}
- default:statement
- break和continue
- break [n]
- continue
- next:提前結束對本行的處理而直接進入下一行;
- 示例:
- awk -F: ‘{if($3%2!=0) next;print $1,$3}’ /etc/passwd
- array
- 關聯數組:array[index-expression]
- [index-expression]
- 1.可使用任意字符串;
- 2.如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為”空串”;
- 若要判斷數組中是否存在某元素,要使用”index in array”格式進行;
- weekdays[mon]=”Monday”
- 若要遍歷數組中的每個元素,要使用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[“ESTABLISHED”]++
- 示例:
- netstat -tan | awk ‘/^tpc\>/{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
- awk ‘/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}’ /etc/fstab
- awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}’ /etc/fstab
3、描述awk函數示例(至少3例)
awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg
netstat -tan | awk ‘/^tcp\>/{split($5,ip,”1″);count[ip[1]]++}END{for(i in count) {print i,count[i]}}’
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/101948