一欢际、簡(jiǎn)述systemd的新特性及unit常見(jiàn)類(lèi)型分析会钝,能夠?qū)崿F(xiàn)編譯安裝的如nginx\apache實(shí)現(xiàn)通過(guò)systemd來(lái)管理
1这吻、systemd新特性及unit常見(jiàn)類(lèi)型分析
Systemd的新特性:
系統(tǒng)引導(dǎo)時(shí)實(shí)現(xiàn)服務(wù)并行啟動(dòng)揩抡;
按需激活進(jìn)程簇爆;
系統(tǒng)狀態(tài)快照;
基于依賴(lài)關(guān)系定義服務(wù)控制邏輯视译;
核心概念:unit
unit由其相關(guān)的配置文件進(jìn)行標(biāo)識(shí)嬉荆、識(shí)別和配置;文件中主要包含了系統(tǒng)服務(wù)酷含、監(jiān)聽(tīng)的socket鄙早、保存的快照以及其它與init相關(guān)的信息汪茧;這些配置文件主要保存在:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
unit的常見(jiàn)類(lèi)型:
Service unit:文件擴(kuò)展名為.service,用于定義系統(tǒng)服務(wù)限番;
Target unit:文件擴(kuò)展名為.target舱污,用于模擬實(shí)現(xiàn)“運(yùn)行級(jí)別”;
Device unit:文件擴(kuò)展名為.device弥虐,用于定義內(nèi)核識(shí)別的設(shè)備扩灯;
Mount unit:文件擴(kuò)展名為.mount,定義文件系統(tǒng)掛載點(diǎn)霜瘪;
Socket unit:文件擴(kuò)展名為.socket珠插,用于標(biāo)識(shí)進(jìn)程間通信用到的socket文件;
Snapshot unit:文件擴(kuò)展名為.snapshot颖对,管理系統(tǒng)快照捻撑;
Swap unit:文件擴(kuò)展名為.swap,用于標(biāo)識(shí)swap設(shè)備缤底;
Automount unit:文件擴(kuò)展名為.automount顾患,文件系統(tǒng)自動(dòng)點(diǎn)設(shè)備;
Path unit:文件擴(kuò)展名為.path训堆,用于定義文件系統(tǒng)中的文件或目錄描验;
關(guān)鍵特性:
基于socket的激活機(jī)制:socket與程序分離;
基于bus的激活機(jī)制坑鱼;
基于device的激活機(jī)制膘流;
基于Path的激活機(jī)制;
系統(tǒng)快照:保存各unit的當(dāng)前狀態(tài)信息于持久存儲(chǔ)設(shè)備中鲁沥;
向后兼容sysv init腳本呼股;
/etc/init.d
2、實(shí)現(xiàn)systemd管理nginx/apache
第一步:首先下載nginx源碼包并編譯安裝
[root@localhost ~]# wget https://nginx.org/download/nginx-1.15.5.tar.gz
--2018-10-18 10:00:33-- https://nginx.org/download/nginx-1.15.5.tar.gz
Resolving nginx.org (nginx.org)... 206.251.255.63, 95.211.80.227, 2001:1af8:4060:a004:21::e3, ...
Connecting to nginx.org (nginx.org)|206.251.255.63|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1024791 (1001K) [application/octet-stream]
Saving to: ‘nginx-1.15.5.tar.gz’
100%[=======================================================================================================================================================================>] 1,024,791 96.0KB/s in 11s
2018-10-18 10:00:49 (92.0 KB/s) - ‘nginx-1.15.5.tar.gz’ saved [1024791/1024791]
[root@localhost ~]# tar zxf nginx-1.15.5.tar.gz
[root@localhost ~]# cd nginx-1.15.5
[root@localhost nginx-1.15.5]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@localhost nginx-1.15.5]# ./configure --prefix=/usr/local/nginx
checking for OS
+ Linux 3.10.0-327.el7.x86_64 x86_64
checking for C compiler ... found
+ using GNU C compiler
+ gcc version: 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
checking for gcc -pipe switch ... found
......
checking for -Wl,-E switch ... found
checking for gcc builtin atomic operations ... found
checking for zlib library ... found
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
[root@localhost nginx-1.15.5]# make && make install
make -f objs/Makefile
make[1]: Entering directory `/root/nginx-1.15.5'
cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
-o objs/src/core/nginx.o \
src/core/nginx.c
cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
-o objs/src/core/ngx_log.o \
......
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
make[1]: Leaving directory `/root/nginx-1.15.5'
[root@localhost nginx-1.15.5]#
第二步:確認(rèn)nginx安裝成功画恰,且正常提供服務(wù)
測(cè)試啟動(dòng)nginx服務(wù)
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
ESTAB 0 52 192.168.0.131:22 192.168.0.1:60069
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
此時(shí)可通過(guò)服務(wù)器IP地址彭谁,訪問(wèn)到nginx歡迎頁(yè)面,說(shuō)明nginx安裝成功允扇,且正常提供服務(wù)
image.png
第三步:創(chuàng)建unit文件
由于nginx屬于服務(wù)類(lèi)unit缠局,故unit文件類(lèi)型以.service結(jié)尾
[root@localhost ~]# cd /usr/lib/systemd/system
[root@localhost system]# cat << EOF >> nginx.service
> [unit]
> Desciption=This is a web service
> After=network.target
>
> [Service]
> Type=forking
> ExecStart=/usr/local/nginx/sbin/nginx
> ExecStop=/usr/local/nginx/sbin/nginx -s stop
> ExecReload=/usr/local/nginx/sbin/nginx -s reload
>
> [Install]
> WantedBy=multi-user.target
> EOF
第四步:systemd重載此配置文件
[root@localhost system]# systemctl daemon-reload
最后:測(cè)試systemctl的管理效果
[root@localhost system]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost system]# ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
ESTAB 0 52 192.168.0.131:22 192.168.0.1:60069
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
image.png
[root@localhost system]# systemctl start nginx
[root@localhost system]# ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
ESTAB 0 52 192.168.0.131:22 192.168.0.1:60069
SYN-SENT 0 1 192.168.0.131:47014 192.168.204.129:8090
SYN-SENT 0 1 192.168.0.131:55349 192.168.204.129:8080
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
image.png
二、描述awk命令用法及示例(至少3例)
awk命令
基本用法:awk [options] 'program' FILE ...
program:PATTERN{ACTION STATEMENTS}
語(yǔ)句之間用分號(hào)分隔
options:
-F:指明輸入時(shí)用到的字段分隔符考润;
-v var=value:自定義變量狭园;
常見(jiàn)用法1——print
print item1,item2,...
要點(diǎn):
(1)逗號(hào)分隔符;
(2)輸出的各item可以是字符串糊治,也可以是數(shù)值唱矛;當(dāng)前記錄的字段、變量或awk的表達(dá)式;
(3)如省略item绎谦,相當(dāng)于print $0管闷,即打印整行;
示例:打印當(dāng)前系統(tǒng)的用戶名和其所用shell
[root@localhost system]# awk -F: '{print $1,"\t",$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
avahi-autoipd /sbin/nologin
systemd-bus-proxy /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
tss /sbin/nologin
postfix /sbin/nologin
sshd /sbin/nologin
常見(jiàn)用法2——變量
2.1 內(nèi)建變量
FS:input field seperator:默認(rèn)為空白字符窃肠;
OFS:output field seperator:默認(rèn)為空白字符包个;
RS:input record seperator,把某字符當(dāng)做輸入時(shí)的換行符
ORS:output record seperator:把某字符當(dāng)做輸入時(shí)的換行符
NF:number of field冤留,字段數(shù)量
{print NF}:打印每段的字段數(shù)量;$NF:最后一個(gè)字段
*注:awk中引用變量時(shí)不加$赃蛛,引用字段才用$
NR:number of record,行數(shù)
FNR:行數(shù)搀菩,各文件分別計(jì)數(shù)
FILENAME:當(dāng)前文件名;
ARGC:命令行參數(shù)的個(gè)數(shù)破托;
ARGV:數(shù)組肪跋,保存的是命令行所給定的各參數(shù);
2.2 自定義變量
(1)-v var=value
變量名區(qū)分字符大小寫(xiě)土砂;
(2)在program中直接定義
示例:打印當(dāng)前系統(tǒng)的用戶名和其所用shell州既,中間使用###分隔
[root@localhost system]# awk -v FS=':' -v OFS='###' '{print $1,$7}' /etc/passwd
root###/bin/bash
bin###/sbin/nologin
daemon###/sbin/nologin
adm###/sbin/nologin
lp###/sbin/nologin
sync###/bin/sync
shutdown###/sbin/shutdown
halt###/sbin/halt
mail###/sbin/nologin
operator###/sbin/nologin
games###/sbin/nologin
ftp###/sbin/nologin
nobody###/sbin/nologin
avahi-autoipd###/sbin/nologin
systemd-bus-proxy###/sbin/nologin
systemd-network###/sbin/nologin
dbus###/sbin/nologin
polkitd###/sbin/nologin
tss###/sbin/nologin
postfix###/sbin/nologin
sshd###/sbin/nologin
常見(jiàn)用法3——printf命令
格式化輸出:printf FROMAT,item1,item2,...
(1)FORMAT必須要給出;
(2)不會(huì)自動(dòng)換行萝映,需要顯式給出換行控制符吴叶,\n;
(3)FORMAT中需要分別為后面的每個(gè)item指定一個(gè)格式化符號(hào)序臂;
格式符:
%c:顯示字符的ASCII碼蚌卤;
%d,%i:顯示十進(jìn)制整數(shù)奥秆;
%e逊彭,%E:科學(xué)計(jì)數(shù)法數(shù)值顯示;
%f:顯示為浮點(diǎn)數(shù)构订;
%g侮叮,%G:以科學(xué)計(jì)數(shù)法或浮點(diǎn)形式顯示數(shù)值;
%s:顯示字符串悼瘾;
%u:無(wú)符號(hào)整數(shù)囊榜;
%%:顯示%本身;
修飾符:
#[.#]:第一個(gè)數(shù)字控制顯示的寬度亥宿;第二個(gè)#表示小數(shù)點(diǎn)后的精度卸勺;
%3.1f
-:左對(duì)齊(默認(rèn)為右對(duì)齊)
+:顯示數(shù)值的符號(hào)(即正負(fù),+箩绍、-)
示例1:格式化輸出當(dāng)前系統(tǒng)的用戶名和UID
[root@localhost system]# awk -F: '{printf "Username: %s,UID: %d\n",$1,$3}' /etc/passwd
Username: root,UID: 0
Username: bin,UID: 1
Username: daemon,UID: 2
Username: adm,UID: 3
Username: lp,UID: 4
Username: sync,UID: 5
Username: shutdown,UID: 6
Username: halt,UID: 7
Username: mail,UID: 8
Username: operator,UID: 11
Username: games,UID: 12
Username: ftp,UID: 14
Username: nobody,UID: 99
Username: avahi-autoipd,UID: 170
Username: systemd-bus-proxy,UID: 999
Username: systemd-network,UID: 998
Username: dbus,UID: 81
Username: polkitd,UID: 997
Username: tss,UID: 59
Username: postfix,UID: 89
Username: sshd,UID: 74
示例2:左對(duì)齊的格式化輸出
[root@localhost system]# awk -F: '{printf "Username: %-20s,UID: %d\n",$1,$3}' /etc/passwd
Username: root ,UID: 0
Username: bin ,UID: 1
Username: daemon ,UID: 2
Username: adm ,UID: 3
Username: lp ,UID: 4
Username: sync ,UID: 5
Username: shutdown ,UID: 6
Username: halt ,UID: 7
Username: mail ,UID: 8
Username: operator ,UID: 11
Username: games ,UID: 12
Username: ftp ,UID: 14
Username: nobody ,UID: 99
Username: avahi-autoipd ,UID: 170
Username: systemd-bus-proxy ,UID: 999
Username: systemd-network ,UID: 998
Username: dbus ,UID: 81
Username: polkitd ,UID: 997
Username: tss ,UID: 59
Username: postfix ,UID: 89
Username: sshd ,UID: 74
常見(jiàn)用法4——PATTERN(模式匹配)
(1)empty:空模式孔庭,匹配每一行;
(2)/regular expression/:僅處理能夠被此處的模式匹配到的行
(3)relational expression:關(guān)系表達(dá)式;結(jié)果有“真”有“假”圆到;結(jié)果為“真”才會(huì)被處理怎抛;
真:結(jié)果為非0值,非空字符串芽淡;
(4)line ranges:行范圍
starline,endline:/pat1/,/pat2/
注意:不支持直接給出數(shù)字的格式
(5)BEGIN/END模式
BEGIN{}:僅在開(kāi)始處理文件中的文本之前執(zhí)行一次马绝;
END{}:僅在文本處理完成之后執(zhí)行一次;
示例:顯示默認(rèn)shell為bash的用戶
[root@localhost ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
或
[root@localhost ~]# awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd
root /bin/bash
常見(jiàn)用法5——控制語(yǔ)句
5.1 if-else
語(yǔ)法:if(condition) statement [else statement]
示例:
awk -F: '{if($3>=1000) print $1,$3}' /etc/passwd
awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or sysadmin: %s\n",$1}}'
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}'
使用場(chǎng)景:對(duì)awk取得的整行或某個(gè)字段做條件判斷挣菲;
5.2 while循環(huán)
語(yǔ)法:while(condition) statement
條件“真”富稻,進(jìn)入循環(huán);條件“假”白胀,退出循環(huán)椭赋;
使用場(chǎng)景:對(duì)一行內(nèi)的多個(gè)字段逐一類(lèi)似處理時(shí)使用;對(duì)數(shù)組中的各元素逐一處理時(shí)使用或杠;
示例:
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
5.3 do-while循環(huán)
語(yǔ)法:do statement while(condition)
意義:至少執(zhí)行一次循環(huán)體
5.4 for循環(huán)
語(yǔ)法:for(expr1;expr2哪怔;expr3)statement
for (variable assighment;condition;iteration process) {for-body}
示例:
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++){print $i,length($1)}}' /etc/grub2.cfg
特殊用法:
能夠遍歷數(shù)組中的元素:
語(yǔ)法:for(var in array) {for-body}
5.5 switch語(yǔ)句
語(yǔ)法:switch(expression) {case VALUE1 or /REGEXP/: statement;case VALUE2 or /REGEXP2/: statement;...;default: statement}
5.6 break和continue
break [n]
continue
5.7 next
提前結(jié)束對(duì)本行的處理而直接進(jìn)入下一行;
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
常見(jiàn)用法6——array(數(shù)組)
關(guān)聯(lián)數(shù)組:array[index-expression]
index-expression:
(1)可使用任意字符串:字符串要使用雙引號(hào)向抢;
(2)如果某數(shù)組元素事先不存在认境,在引用時(shí),awk會(huì)自動(dòng)創(chuàng)建此元素挟鸠,并將其值初始化為“空串”叉信;
若要判斷數(shù)組中是否存在某元素,要使用“index in array”格式進(jìn)行
weekdays[mon]="Monday"
若要遍歷數(shù)組中的每個(gè)元素艘希,要使用for循環(huán):
for (var in array) {for-body}
示例:
awk 'BEGIN{weekdays["mon"="Monday";weekdays["tue"="Tuesday";for(i in weekdays) {print weekdays[i]}}'
注意:var會(huì)遍歷array的每個(gè)索引;
state["LISTEN"]++
state["ESTABLISHED"]++
示例:
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
實(shí)用示例:統(tǒng)計(jì)/etc/fstab文件中以UUID開(kāi)頭的行文件系統(tǒng)類(lèi)型出現(xiàn)的次數(shù)
[root@localhost ~]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
xfs 1
三硼身、描述awk函數(shù)示例(至少3例)
內(nèi)置函數(shù)
數(shù)值處理:
rand():返回0和1之間一個(gè)隨機(jī)數(shù);(注:取一次之后枢冤,后面此值就固定)
字符串處理:
length([s]):返回指定字符串的長(zhǎng)度鸠姨;
sub(r呀潭,s谤职,[t]):以r表示的模式來(lái)查找t所表示的字符中的匹配的內(nèi)容,并將其第一次出現(xiàn)替換為s所表示的內(nèi)容鬓长;
gsub(r核蘸,s巍糯,[t]):以r表示的模式來(lái)查找t所表示的字符中的匹配的內(nèi)容,并將其所有出現(xiàn)替換為s所表示的內(nèi)容客扎;
split(s,a[,r]):以r為分隔符切割字符s祟峦,并將切割后的結(jié)果保存至a所表示的數(shù)組中;
示例1:全局替換字符串并打印
[root@localhost ~]# awk -F: 'gsub("/sbin/nologin","/bin/false"){print $1,$7}' /etc/passwd
bin /bin/false
daemon /bin/false
adm /bin/false
lp /bin/false
mail /bin/false
operator /bin/false
games /bin/false
ftp /bin/false
nobody /bin/false
avahi-autoipd /bin/false
systemd-bus-proxy /bin/false
systemd-network /bin/false
dbus /bin/false
polkitd /bin/false
tss /bin/false
postfix /bin/false
sshd /bin/false
示例2:打印長(zhǎng)度為4字符的用戶名
[root@localhost ~]# awk -F: 'length($1)==4{print $1}' /etc/passwd
root
sync
halt
mail
dbus
sshd
示例3:打印當(dāng)前系統(tǒng)建立了的TCP連接的IP地址及數(shù)量
[root@localhost ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
192.168.0.1 1
0.0.0.0 3