第八周博客作業

一、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理。
二、描述awk命令用法及示例
三、描述awk函數示例

一、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理。

1、Systemd的新特性:

  • 系統引導時實現服務并行啟動;
  • 按需激活進程;
  • 系統狀態快照;
  • 基于依賴關系定義服務控制邏輯;
  • 支持快照和系統恢復;
  • 維護掛載點和自動掛載點;

2、核心概念:unit

  • unit由其相關配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息;
  • 這些配置文件主要保存在以下目錄中:
    /usr/lib/systemd/system
    /run/systemd/system
    /etc/systemd/system

3、unit的常見類型:

9

  • 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…]

?1

2

3

4

5

6

6、服務單元模塊

文件通常由三部分組成:

10

(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

20
[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/httpd
fi
prog=${HTTPD-/usr/local/apache/bin/httpd}
[ -L /usr/sbin/httpd ] || ln -sv $prog /usr/sbin
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
prog=$(basename $prog)
?
check_prog() {
[ -f $lockfile ] && RETVAL=0 || RETVAL=1
return $RETVAL
}
?
lcc_start() {
check_prog
if [ $RETVAL -eq 0 ]; then
echo $prog is started.”
else
#$prog $OPTIONS -DFOREGROUND
$prog $OPTIONS
if [ $? -eq 0 ]; then
touch $lockfile
echo $prog start ok”
else
echo $prog start fail”
fi
fi
?
}
lcc_stop() {
check_prog
if [ $RETVAL -eq 0 ]; then
kill -9 `pgrep $prog` &> /dev/null
rm -f $lockfile
[ $? -eq 0 ] && echo $prog stop finished.” || echo $prog stop fail.”
else
echo $prog is stopped.”
fi
}
lcc_restart() {
lcc_stop
lcc_start
}
lcc_status() {
check_prog
[ $? -eq 0 ] && echo $prog is running.” || echo $prog is stopping”
}
?
case $1 in
start|stop|restart|status)
lcc_$1
;;
*)
echo $“Usage: $prog {start|stop|restart|status}”
RETVAL=2
;;
esac
?

exit $RETVAL

[root@localhost ~]# chmod ug+x /etc/init.d/httpd #添加屬主、組可執行權限
[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: 自定義變量;

3、print

  • 格式 print item1, item2, …
    示例:
root@bogon ~]# tail -5 /etc/fstab |awk ‘{print $2,$4}’ #讀取fatab最后五行取第二和第四字段
swap defaults
/dev/shm defaults
/dev/pts gid=5,mode=620
/sys defaults
/proc defaults
  • 要點:
    (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:數組,保存的是命令行所給定的各參數;
    示例:
[root@bogon ~]# awk ‘{print NF}’ /etc/fstab #每一行的字段數量
0
1
2
root@bogon ~]# awk ‘{print FILENAME}’ /etc/fstab #取出文件名
/etc/fstab
/etc/fstab
5、定義變量
  • (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
    -: 左對齊
    +:顯示數值的符號
  • 示例:
[root@bogon ~]# awk -F: ‘{printf “Username: %-15s, 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
7、操作符
  • 算術操作符:x+y, x-y, x*y, x/y, x^y, x%y ,-x,+x: 轉換為數值;
    • 字符串操作符:沒有符號的操作符,字符串連接
  • 賦值操作符:=, +=, -=, *=, /=, %=, ^=++, –
  • 比較操作符:>, >=, <, <=, !=, ==
  • 模式匹配符:
    • ~:是否匹配
    • !~:是否不匹配
  • 邏輯操作符:&&,||,!
    示例:判斷用戶id大于1000的為系統用戶:
[root@bogon ~]# awk -F: ‘{$3>=1000?usertype=”Common User”:usertype=”Sysadmin or SysUser”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd
root:Sysadmin or SysUser
bin:Sysadmin or SysUser
daemon:Sysadmin or SysUser
adm:Sysadmin or SysUser
8、PATTERN:模式
  • (1) empty:空模式,匹配每一行;
[root@bogon ~]# awk ‘/^UUID/{print $1}’ /etc/passwd
  • (2) /regular expression/:僅處理能夠被此處的模式匹配到的行;
  • (3) relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;真:結果為非0值,非空字符串;
[root@bogon ~]# awk -F: ‘$NF~/bash$/{print $1,NF}’ /etc/passwd
root 7
  • (4) line ranges:行范圍,
    startline,endline:/pat1/,/pat2/
[root@bogon ~]# awk -F: ‘/^r/,/^m/{print $1}’ /etc/passwd
root
bin
注意:不支持直接給出數字的格式
~]# awk -F: ‘(NR>=2&&NR<=10){print $1}’ /etc/passwd
(5) BEGIN/END模式
BEGIN{}: 僅在開始處理文件中的文本之前執行一次;
END{}:僅在文本處理完成之后執行一次;
[root@bogon ~]# awk -F: ‘BEGIN[print “username uid \n—————–“}{print $1,$3}END{print “================\n end “}’ /etc/passwd
9、控制語句
(1)if語句

格式:

  • if(condition) {statments}
[root@localhost ~]# awk -F: ‘{if($3>=1000) print $1,$3}’ /etc/passwd
nfsnobody 65534
  • if(condition) {statments} else {statements}
[root@localhost ~]# awk -F: ‘{if($3>=1000) {print “Common user:%s\n”,$1} else {printf “root or Sysuser:%s\n”,$1}}’ /etc/passwd
root or Sysuser: root #大于1000的為普通用戶否則為系統用戶
root or Sysuser: bin
root or Sysuser: daemon
  • 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]
[root@localhost ~]# awk -F: ‘{if($NF==“/bin/bash”) print $1}’ /etc/passwd
root
hadoop
bash
testbash
[root@bogon ~]# awk ‘{if(NF>5) print $0}’ /etc/fstab # 空白大于五個打印出來
[root@bogon ~]# df -h | awk -F[%] ‘/^\/dev/{print $1}’ | awk ‘{if($NF>=20) print $1}’ #df顯示對應設備的使用空間比例指明以%號或空白作為分割以dev開頭的條件過濾使用大于百分之20的設備打印出來
/dev/sda1
  • 使用場景:對awk取得的整行或某個字段做條件判斷;
(3)、 while循環
  • 語法:while(condition) statement
    條件“真”,進入循環;條件“假”,退出循環;
  • 使用場景:對一行內的多個字段逐一類似處理時使用;對數組中的各元素逐一處理時使用;
[root@bogon ~]# awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}’ /etc/grub2.cfg #以空白字符開頭,可以多個的linux16的字段,如果i小于nf去打印$i,調用length傳遞參數計算長度如果大于7打印
(4)、do-while循環
  • 語法:do statement while(condition)
    意義:至少執行一次循環體
(5)、 for循環
  • 語法:for(expr1;expr2;expr3) statement
  • 格式:for(variable assignment;condition;iteration process) {for-body}
[root@bogon ~]# awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg
  • 特殊用法:
    能夠遍歷數組中的元素;
    語法: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
  • 提前結束對本行的處理而直接進入下一行;
[root@bogon ~]# awk -F: ‘{if($3%2!=0) next; print $1,$3}‘ /etc/passwd #顯示用戶號為偶數的ID,如果不符合結束本行,提前進入下一行

10、array關聯數組

  • 關聯數組:array[index-expression]
  • index-expression:
    (1) 可使用任意字符串;字符串要使用雙引號;
    (2) 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”;
  • 若要判斷數組中是否存在某元素,要使用”index in array”格式進行;
  • 用法:
    • weekdays[mon]=”Monday”
    • 若要遍歷數組中的每個元素,要使用for循環;
    • for(var in array) {for-body}
[root@localhost ~]# awk ‘BEGIN{weekdays[“mon”]=“Monday”;weekdays[“tue”]=“Tuesday”;for(i in weekdays) {print weekdays[i]}}’ #輸出數組weekday里面i的值
Monday
Tuesday
  • 注意:var會遍歷array的每個索引;
    state[“LISTEN”]++數組state
    state[“ESTABLISHED”]++數組establish
[root@localhost ~]# netstat -tan | awk ‘/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}’ #以tap開頭每行的最后一個字段遍歷一次記錄到數組state里每個相同字段+1 碰到另一個字段+1end 統計i里的數據
[root@localhost ~]# awk ‘{ip[$1]++}END{for(i in ip) {print i,ip[i]}}’ /var/log/httpd/access_log #Ip地址做下標i為索引每個ip訪問多少次報告生成器

示例:統計/etc/fstab文件中每個文件系統類型出現的次數;

[root@bogon ~]# awk ‘/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}’ /etc/fstab #以UUID為開頭的行fs數組以$3 做下標遍歷end統計
xfs 1

示例:統計指定文件中每個單詞出現的次數;

[root@bogon ~]# awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}’ /etc/fstab #做行內字段遍歷每一個字段NF count數組下標$i end統計
swap 2
fstab(5), 1
filesystems, 1
2018 1

三、描述awk函數示例

  • 內置函數
    • 數值處理:
      rand():返回0和1之間一個隨機數;
[root@bogon ~]# awk ‘BEGIN{srand();fr=int(100*rand());print fr;}’ #獲取一個隨機數
71
  • 字符串處理:
    • length([s]):返回指定字符串的長度;
    • sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其第一次出現替換為s所表示的內容;
    • gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其所有出現均替換為s所表示的內容;
[root@bogon ~]# awk -F: ‘/.*bash$/{gsub(/bash$/,”BASH”,$0);print $0}’ /etc/passwd
root:x:0:0:root:/root:/bin/BASH #把匹配到的字符替換成大寫
  • split(s,a[,r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中;
    示例:
[root@bogon ~]# netstat -tan | awk ‘/^tcp\>/{split($5,ip,“:”);count[ip[1]]++}END{for (i in count) {print i,count[i]}}’
192.168.1.103 1
0.0.0.0 2
# 對第五段做切割保存到ip數組中以:做分隔符對每個ip數組分別做統計顯示i各自出現次數

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97967

(1)
任總任總
上一篇 2018-05-09
下一篇 2018-05-10

相關推薦

  • 手把手系列(一)教你通過VMware虛擬化軟件安裝CentOS 6系統

    手把手教你用VMware虛擬化軟件安裝CentOS 6系統

    2018-03-27
  • 網絡管理基礎

    IP地址由網絡ID和主機ID組成 A類:0 000 0000 – 0 111 1111:1-127 網絡數:126 每個網絡中的主機數2^ 24-2=16777214 B類:10 00 0000 – 10 11 1111:128-191 網絡數:2^ 14=16384 每個網絡中的主機數:2^ 16–2=65534 C類:100 0 …

    2018-04-01
  • linux基礎知識

    本博文寫的是linux的基礎知識,比較雜,但是都很重要。

    Linux筆記 2018-07-22
  • 權限管理

    權限管理 普通權限 通過劃分為三種人來管理,所有者u,所屬組g,其他人o,所有人a 文件 刪除文件用文件所在文件夾的寫權限來決定 讀寫權限root不受控制,執行受控制 對于目錄沒有執行權限,無法進入目錄,無法查看目錄內文件屬性,無法查看文件內容 執行權限是基礎權限沒有執行讀寫權限無用 程序要運行,所在目錄要有執行權限 普通用戶無法更改文件的所有者,要更改文件…

    Linux筆記 2018-03-31
  • 網絡屬性配置第三種方式——修改配置文件

    網絡屬性配置第三種方式——修改配置文件 IP ,MASK,GW,DNS相關的配置文件:/etc/sysconfig/network-scripts/ifcfg-eth0 路由相關的配置文件:/etc/sysconfig/network-scripts/route-enth0(這個文件默認不存在,需要手動去創建) (1)/etc/sys…

    Linux筆記 2018-05-06
  • 初識VIM和正則表達式

    vim和正則表達式練習

    Linux筆記 2018-05-31
欧美性久久久久