一、systemd的新特性及unit常見類型
systemd即為system daemon,是Centos 7上用于替換init啟動進程的新的啟動進程宪摧。systemd出現(xiàn)的主要目的為減少系統(tǒng)引導時間和計算開銷岳颇。Linux系統(tǒng)使用Systemd引導程序取代傳統(tǒng)的SysV init,Systemd兼容init開機啟動腳本叮贩。
systemd的特性
- 系統(tǒng)引導時击狮,其服務并行啟動
- 按需激活進程
- 系統(tǒng)狀態(tài)快照
- 基于依賴關系定義服務控制邏輯
systemd的核心概念:unit單元
systemd的unit用于對相關配置文件進行標識、識別和配置益老;unit文件中主要包含了系統(tǒng)服務彪蓬、監(jiān)聽的socket、保存的快照以及其他的init相關的信息捺萌。這些unit文件主要保存在一下三個目錄中:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
unit常見類型
service unit:文件擴展名為.service档冬,用于定義系統(tǒng)服務
target unit:文件擴展名為.target,用于模擬實現(xiàn)“運行級別”
device unit:文件擴展名為.device桃纯,用于定義內(nèi)核識別的設備
mount unit:文件擴展名為.mount酷誓,定義文件系統(tǒng)的掛載點
socket unit:擴展名為.socket,用于表示進程間通信用到的socket文件
snapshot unit:文件擴展名為.snapshot态坦,用于管理系統(tǒng)快照
swap unit:文件擴展名為.swap盐数,用于表示swap設備
automount unit:擴展名為.automount,文件系統(tǒng)自動掛載點設備
path unit:文件擴展名為.path伞梯,用于定義文件系統(tǒng)中的文件或者目錄
unit的關鍵特性
系統(tǒng)支持的unit類型可通過命令systemctl -t help來進行查看玫氢。
- 基于socket的激活機制:socket與程序分離。systemd為支持此機制的服務監(jiān)聽socket谜诫,當接收到來自客戶端的socket通信時漾峡,由systemd激活對應的服務,應答客戶端的請求
- 基于bus的激活機制:基于總線的請求來激活設備
- 基于device的激活機制猜绣;當有設備接入到系統(tǒng)時灰殴,systemd會自動激活device、mount、automount等unit來識別牺陶、掛載伟阔、接入對應的設備
- 基于path的激活機制:當某個文件路徑變得可用時或路徑出現(xiàn)相應的文件時,激活相應的服務掰伸;
- 系統(tǒng)快照:保存各unit的當前狀態(tài)信息于持久存儲在設備中
- 向后兼容sysv init腳本:能夠繼續(xù)使用/etc/init.d/目錄中的服務管理腳本
不兼容的情況:
- systemctl的命令是固定不變的
- 不是由systemd啟動的服務皱炉,systemctl無法與之通信
unit文件的組成
unit文件通常有Unit、Service狮鸭、Install這三個段組成合搅。其每個段的意義及常用選項如下:
- [Unit]段:定義了與Unit類型無關的通用選項;用于提供unit的描述信息歧蕉、unit行為及依賴關系等
- Description:秒速信息灾部;意義性描述。
- After:定義unit的啟動次序惯退;表示當前unit應該晚于那些unit啟動赌髓;功能與Before相反。
- Requies:依賴到的其他units催跪;強依賴锁蠕,被依賴的units無法激活時,當前unit即無法激活
- Wants:依賴的其他units懊蒸;弱依賴荣倾。
- conflicts:定義units間的沖突關系
- [Service]段:與特定類型相關的專用選項,此處為service類型
- type:用于定義影響ExecStart及相關參數(shù)的功能的unit進程啟動類型骑丸。類型包括:simple舌仍、forking、oneshot通危、dbus抡笼、notify、idle
- EnvironmentFile:環(huán)境配置文件
- ExecStart:指明啟動unit要運行命令或腳本黄鳍;ExecStartPre、ExecStartPost
- ExecStop:指明停止unit要運行的命令或腳本
- Restart:啟動此項平匈,意外終止會自動重啟腳本
- [Install]段:定義由“systemctl enable”以及“systemctl disable”命令在實現(xiàn)服務啟用或僅用時用到的一些選項框沟。
- Alias:別名
- RequiredBy:被那些units所依賴
- WantedBy:被那些units所依賴
注意:對于新創(chuàng)建的unit文件或,修改了的unit文件增炭,要通知systemd重載此配置文件:systemctl daemon-reload
使用systemctl管理系統(tǒng)服務
語法
systemctl [OPTIONS···] COMMAND [NAME···]
常用命令
下面為常用的systemctl子命令的使用格式以及在舊版本中對應的實現(xiàn)方式:
功能 | 新指令 | 舊指令 |
---|---|---|
啟動服務 | systemctl start NAME.service | service NAME start |
停止服務 | systemctl stop NAME.service | service NAME stop |
重啟服務 | systemctl restart NAME.service | service NAME restart |
查看服務狀態(tài) | systemctl status NAME.service | service NAME status |
條件式重啟 | systemctl try-restart NAME.service | service NAME condrestart |
重載或重啟服務 | systemctl reload-or-try-restart NAME.service | -- |
重載或條件式重啟服務 | systemctl reload-or-try-restart NAME.service | -- |
查看某服務當前激活與否的狀態(tài)務 | systemctl is-active NAME.service | -- |
查看所有以激活的服務 | systemctl list-units --type service | -- |
查看所有服務 | systemctl list-units -t service --all(-a) | -- |
設置服務開機自啟 | systemctl enable NAME.service | chkconfig NAME on |
禁止服務開機自啟 | systemctl disable NAME.service | chkconfig NAME off |
查看某服務是否能開機自啟 | systemctl is-enabled NAME.service | chkconfig --list NAME |
禁止某服務設定為開機自啟動 | systemctl mask NAME.service | -- |
取消此禁止 | systemctl unmask NAME.service | -- |
查看服務的依賴關系 | systemctl list-dependencies NAME.service | -- |
查看所有運行級別 | systemctl list-units -t target --all(-a) | -- |
獲取默認運行級別 | systemctl get-default | -- |
修改默認運行級別 | systemctl set-default NAME.target | -- |
切換至緊急救援模式 | systemctl rescue | -- |
切換至emergency模式 | systemctl emergency | -- |
關機 | systemctl halt忍燥、systemctl poweroff | -- |
重啟 | systemctl reboot | -- |
掛起 | systemctl suspend | -- |
快照 | systemctl hibernate | -- |
快照并掛起 | systemctl hybrid-sleep | -- |
運行級別切換 | systemctl isolate NAME.target | init N |
centos7中target units文件中對應的級別:
- 級別0:runlevel0.target或poweroff.target
- 級別1:runlevel1.target或rescue.target
- 級別2:runlevel2.target或multi-user.target
- 級別3:runlevel3.target或multi-user.target
- 級別4:runlevel4.target或multi-user.target
- 級別5:runlevel5.target或graphical.taget
- 級別6:runlevel6.target或reboot.target
示例
1、查看服務的依賴關系
[root@localhost nginx]# systemctl list-dependencies nginx.service
nginx.service
● ├─-.mount
● ├─system.slice
● ├─var.mount
● └─basic.target
● ├─alsa-restore.service
● ├─alsa-state.service
● ├─microcode.service
● ├─rhel-dmesg.service
● ├─selinux-policy-migrate-local-changes@targeted.service
● ├─paths.target
● ├─slices.target
● │ ├─-.slice
● │ └─system.slice
● ├─sockets.target
● │ ├─avahi-daemon.socket
● │ ├─cups.socket
● │ ├─dbus.socket
● │ ├─dm-event.socket
● │ ├─iscsid.socket
● │ ├─iscsiuio.socket
● │ ├─rpcbind.socket
● │ ├─spice-vdagentd.socket
● │ ├─systemd-initctl.socket
● │ ├─systemd-journald.socket
● │ ├─systemd-shutdownd.socket
● │ ├─systemd-udevd-control.socket
● │ ├─systemd-udevd-kernel.socket
● │ ├─virtlockd.socket
● │ └─virtlogd.socket
● ├─sysinit.target
● │ ├─dev-hugepages.mount
● │ ├─dev-mqueue.mount
● │ ├─dmraid-activation.service
● │ ├─iscsi.service
● │ ├─kmod-static-nodes.service
lines 1-36
2隙姿、查看服務是否處于激活狀態(tài)
[root@localhost nginx]# systemctl is-active nginx.service
active
3梅垄、查看所有已激活的服務
[root@localhost nginx]# systemctl list-units --type service
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-xorg.service loaded active running ABRT Xorg log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
alsa-state.service loaded active running Manage Sound Card State (restore and store)
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
blk-availability.service loaded active exited Availability of block devices
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
cups.service loaded active running CUPS Printing Service
dbus.service loaded active running D-Bus System Message Bus
getty@tty1.service loaded active running Getty on tty1
gssproxy.service loaded active running GSSAPI Proxy Daemon
irqbalance.service loaded active running irqbalance daemon
iscsi-shutdown.service loaded active exited Logout off all iSCSI sessions on shutdown
kdump.service loaded active exited Crash recovery kernel arming
kmod-static-nodes.service loaded active exited Create list of required static device nodes for the current kernel
ksm.service loaded active exited Kernel Samepage Merging
ksmtuned.service loaded active running Kernel Samepage Merging (KSM) Tuning Daemon
libstoragemgmt.service loaded active running libstoragemgmt plug-in server daemon
libvirtd.service loaded active running Virtualization daemon
lvm2-lvmetad.service loaded active running LVM2 metadata daemon
4、psacct的unit文件
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[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}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
二输玷、文本處理三劍客之a(chǎn)wk
awk命令是一種編程語言队丝,用于在linux/unix下對文本和數(shù)據(jù)進行掃描和處理的工具靡馁,其數(shù)據(jù)來源可以為標準輸入、文件机久、管道等等臭墨。awk命令會從第一行輸入開始逐行掃描至最后一行,尋找其中匹配特定模式的行膘盖,并在相應的行上執(zhí)行用戶指定的操作胧弛。Awk命令的基本架構(gòu)由模式匹配和處理動作組成,默認處理動作為print打印行侠畔。
語法
awk [options] 'program...' FILE...
選項參數(shù)
options:
- -F fs:指明輸入時字段分隔符
- -v var=value:自定義變量
- -f programfile:從文件中讀取program命令
program
program語句的常用格式為:PATTERN{ACTION STATEMENTS}
结缚,其中多個program語句之間用分號‘;’分割。
PATTERN:
- PATTERN的格式為:
- empty:空模式软棺,表示匹配每一行
- /regular expression/:僅處理能被此模式匹配到的行
- relational expression:關系表達式红竭;結(jié)果為真才會被處理
- line ranges:行范圍。startline码党,endline:/pat1/,/pat2/或者(NR>=2&&NR<=10)德崭。不支持直接用數(shù)字表示的行號
- BEGIN{}和END{}:
BEGIN{}:表示在開始處理行前執(zhí)行一次指定的操作;
END{}:表示在結(jié)束對行的處理后執(zhí)行一次指定的操作
- program語句的變量
- 內(nèi)建變量
- FS:input field seperator,輸入時分隔符揖盘,默認為空白字符 awk -v FS=':' '{print 4}' /etc/passwd
- OFS:output field seperator眉厨,輸出時分隔符,默認為空白字符
- RS:input record Seperator兽狭,輸入時換行符
- ORS:output record Seperator憾股,輸出時換行符
- NF:number of field,統(tǒng)計字段數(shù)箕慧。awk '{print NF}' /etc/fstab服球。顯示最后一個字段awk '{print $NF}'
- NR:number of record:行數(shù)
- FNR:各文件分別統(tǒng)計行數(shù)
- FILENAME:當前文件名
- ARGC:命令行參數(shù)的個數(shù)
- ARGV:數(shù)組,保存的是命令行所給定的各參數(shù)
- 自定義變量
- -v var=value:定義變量
- 也可以在program語句中直接定義
ACTION
常用的action:
- print:使用格式為print item1,item2,....
- 逗號作為字段間的分隔符
- 輸出的各item可以是字符串颠焦、也可以是數(shù)值斩熊;當前記錄的字段、變量或awk表達式
- 如果省略item伐庭,相當于print $0粉渠,輸出整行
- printf:格式為printf FORMAT,item1,item2...
- FORMAT必須給出
- 不會自動換行圾另,需要顯示給出換行控制符\n
- FORMAT中需要分別為后面的每個item制定一個格式化符號:
- 格式符
- %c:顯示字符的ASCII碼
- %d,%i:顯示十進制整數(shù)
- %e霸株,%E:科學計數(shù)法數(shù)值顯示
- %f:顯示為浮點數(shù)
- %g,%G:以科學計數(shù)法或浮點形式顯示數(shù)據(jù)
- %s:顯示字符串
- %u:無符號整數(shù)
- %%:顯示%自身
- 修飾符:通過修飾符對格式符進行輸出格式的整理
- #[.#]:第一個#數(shù)字控制顯示的寬度;第二個#表示小數(shù)點后的精度集乔,如%3.1f
- -:左對齊
- +:顯示數(shù)值的符號
- 操作符:
- 算術(shù)操作符:x[+|-|/|*|%|^|%]y去件,-x,+x轉(zhuǎn)換為數(shù)值
- 字符串操作符:沒有符號的操作符,字符串連接
- 賦值操作符:=尤溜、+=倔叼、-=、*=靴跛、/=缀雳、%=、^=梢睛、++肥印、--
- 比較操作符:>,>=,<,<=,!=,==
- 模式匹配符::是否匹配,!:是否不匹配
- 邏輯操作符:&&绝葡,||深碱,!
- 函數(shù)調(diào)用:function_name(arg1,arg2,...)
- 條件表達式:
awk [options] '{selector?if-true-expression:if-false-expression}' /PATH/TO/SOMFILE
- expression表達式:
- control statements:if藏畅,while控制語句
- compound statements:組合語句
- input statements:輸入語句
示例
1敷硅、在program語句中自定義變量
[root@localhost ~]# ls -l | awk '/root/{hello="this is a test.";print $3,hello}'
root this is a test.
root this is a test.
root this is a test.
2、顯示/etc/passwd中的用戶名愉阎、uid和默認shell
[root@localhost ~]# awk -v FS=':' -v OFS=':' '{print $1,$3,$7}' /etc/passwd
root:0:/bin/bash
bin:1:/sbin/nologin
daemon:2:/sbin/nologin
adm:3:/sbin/nologin
lp:4:/sbin/nologin
sync:5:/bin/sync
shutdown:6:/sbin/shutdown
halt:7:/sbin/halt
mail:8:/sbin/nologin
operator:11:/sbin/nologin
games:12:/sbin/nologin
3绞蹦、顯示/etc/passwd中的用戶名、uid榜旦,并右對齊
[root@localhost ~]# 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
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: ods,UID:999
username:systemd-network,UID:192
username: dbus,UID:81
username: polkitd,UID:998
username: apache,UID:48
username: unbound,UID:997
4幽七、根據(jù)用戶ID判斷對應用戶是系統(tǒng)用戶還是普通用戶,顯示結(jié)果左對齊
[root@localhost ~]# awk -F: '{$3>=1000?usertype="this is a common user.":usertype="This is a system user.";printf "%-20s:%-s\n",$1,usertype}' /etc/passwd
root :This is a system user.
bin :This is a system user.
daemon :This is a system user.
adm :This is a system user.
lp :This is a system user.
sync :This is a system user.
shutdown :This is a system user.
halt :This is a system user.
mail :This is a system user.
operator :This is a system user.
games :This is a system user.
ftp :This is a system user.
nobody :This is a system user.
ods :This is a system user.
systemd-network :This is a system user.
dbus :This is a system user.
polkitd :This is a system user.
apache :This is a system user.
unbound :This is a system user.
libstoragemgmt :This is a system user.
rpc :This is a system user.
5、顯示默認為shell類型為bash的用戶
[root@localhost ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
wxq /bin/bash
hadoop /bin/bash
bash /bin/bash
testbash /bin/bash
basher /bin/bash
awk的高級應用
awk語句中的控制語句
awk命令是一種編程語言溅呢,有相應的控制語句澡屡。其控制語句的類型與bash shell編程的類似,包括:if-else咐旧、while驶鹉、for、switch铣墨、break室埋、continue和next。其中break伊约、continue用于跳出循環(huán)及跳出本次循環(huán)词顾,next用于提前結(jié)束當前行的處理,直接進入下一行碱妆。
- if-else語句
awk命令的if-else語句通常用于對匹配的行或字段做條件判斷選擇,支持雙分支if語句昔驱。其格式通常為:
awk [options] '{if (condition) {statements} [else {statements}] }' /PATH/TO/SOMEFILE
當使用了else語句時疹尾,if-else語句中的statements語句需要用{}括起來
示例:
以冒號為分隔符,判斷ID>=1000的用戶ID為普通用戶;
[root@localhost ~]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
root or Sysuser: root
root or Sysuser: bin
root or Sysuser: daemon
root or Sysuser: adm
root or Sysuser: lp
root or Sysuser: sync
root or Sysuser: shutdown
root or Sysuser: halt
root or Sysuser: mail
root or Sysuser: operator
root or Sysuser: games
root or Sysuser: ftp
root or Sysuser: nobody
root or Sysuser: ods
root or Sysuser: systemd-network
root or Sysuser: dbus
root or Sysuser: polkitd
root or Sysuser: apache
root or Sysuser: unbound
root or Sysuser: libstoragemgmt
root or Sysuser: rpc
root or Sysuser: colord
root or Sysuser: rpcuser
Common user: nfsnobody
- while循環(huán)語句
while語句主要應用于對一行內(nèi)多個字段逐一進行類似處理時使用纳本,亦或者是對數(shù)組中的各元素逐一處理時使用窍蓝。其語法格式通常為:
awk '[/PATTERN/]{while(condition) {statements}}' /PATH/TO/SOMEFILE
示例:
以空格開頭0次或多次,后跟linux16的行繁成,以空格為分隔符吓笙,只顯示每行中字段的長度>=7的字段;
[root@localhost ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
LANG=zh_CN.UTF-8 16
linux16 7
/vmlinuz-0-rescue-ee1d782742df449b86df71311eb27f85 50
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
- do-while循環(huán)
do-while循環(huán)的意義在于無論條件真假巾腕,循環(huán)體都會執(zhí)行一次面睛。也就是至少執(zhí)行一次循環(huán)體。其語法格式為:
awk '[/PATTERN/]{do statements while(condition)}' /PATH/TO/SOMEFILE
- for循環(huán)
awk命令的for 循環(huán)常用于進行累加或遍歷操作尊搬,如累計某個關鍵字出現(xiàn)次數(shù)叁鉴、遍歷數(shù)組等等。其常見的格式為:
awk '/PATTERN/{for(expr1;expr2;expr3) {循環(huán)體}}' /PATH/TO/SOMEFILE
expr1:控制變量初始化佛寿;
expr2:條件判斷;
expr3:控制變量的數(shù)值修正表達式幌墓;
即:
awk '/PATTERN/{for(變量賦值;判斷條件;條件變化) {循環(huán)體}}' /PATH/TO/SOMEFILE
示例:
以空格開頭0次或多次,后跟linux16的行冀泻,以空格為分隔符常侣,顯示每行中各字段的長度。
[root@localhost ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
LANG=zh_CN.UTF-8 16
linux16 7
/vmlinuz-0-rescue-ee1d782742df449b86df71311eb27f85 50
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
[root@localhost ~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
LANG=zh_CN.UTF-8 16
linux16 7
/vmlinuz-0-rescue-ee1d782742df449b86df71311eb27f85 50
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
- switch語句
awk的switch語句類似于bashshell編程的case語句弹渔,判斷表達式的值符合case里面的哪個條件胳施,可以等于case里的值,也可以是被case里的正則表達式匹配捞附;如果符合條件就執(zhí)行該case里的語句巾乳,不會往下判斷了;類似case語句鸟召,只不過是關鍵字寫法不同胆绊。其格式為:
awk [options] '{switch(CONDITION){case [VALUE|/PATTERN/]:statement;case [VALUE|/PATTERN/]:statement;...;default:statement}}'
示例:
打印行號為6以及5的倍數(shù)的行的行號
[root@localhost ~]# awk -F: '{switch(NR+5){case 6:{print NR;next}; case /[[:digit:]]+0/: {print NR; next} ;default: print "-------------"}}' /etc/passwd
1
-------------
-------------
-------------
5
-------------
-------------
-------------
-------------
-------------
-------------
-------------
-------------
-------------
swk語句中的數(shù)組
awk命令也可以結(jié)合數(shù)組來完成一系列的工作,其數(shù)組格式為:
array[index-expression]
- 其中index-expression可使用任意字符串欧募,字符串要使用雙引號括起來压状;
- 如果數(shù)組中的元素事先不存在,在引用時跟继,awk命令會自動創(chuàng)建此元素种冬,并將其值初始化為“空串”。
- 若要判斷數(shù)組中是否存在某元素舔糖,要使用"index in array"格式進行
示例
[root@localhost ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
Monday
若要遍歷數(shù)組中的每個元素娱两,要使用for循環(huán);
即for(變量名 in 數(shù)組名) {循環(huán)體}
變量名中保存的是數(shù)組的索引金吗,而不是數(shù)組中的元素十兢;對應的變量var會遍歷array數(shù)組的每個索引趣竣;
例如:
統(tǒng)計/etc/fstab文件中每個單詞出現(xiàn)的次數(shù)。
[root@localhost ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 1
man 1
UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 1
and/or 1
maintained 1
UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 1
xfs 4
Wed 1
/var 1
Accessible 1
# 7
awk中的函數(shù)
awk命令也支持函數(shù)的編寫旱物,通常來說用得較多的為awk命令的幾個內(nèi)置函數(shù)遥缕。
- 內(nèi)置函數(shù)
- length([s]):返回指定字符串的長度
- sub(r,s,[t]):以r表示的模式來查找t所代表的字符串中的匹配的內(nèi)容,并將其第一次出現(xiàn)替換為s所標識的內(nèi)容
- gsub(r,s,[t]):以r表示的模式來查找t所代表的字符串中的匹配的內(nèi)容宵呛,并將其所有出現(xiàn)替換為s所標識的內(nèi)容
- split(s,a[,r]):以r為分隔符切割字符s单匣,并將切割后的結(jié)果保存至a所表示的屬組中。
例如:
顯示來訪的主機地址連接的次數(shù)宝穗。
[root@localhost ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
0.0.0.0 6
192.168.2.112 1
- 自定義函數(shù)
其格式為:
function function_name(argument1,argument2,...)
{
function_body
}
function_name為用戶定義的函數(shù)的名稱户秤,函數(shù)通常可以接受以逗號分割的多個arguments讽营,參數(shù)是可選的虎忌;通常來說一個function_body是由一個或多個語句組成的。
例如:
打印UID大于100的用戶名及用戶UID橱鹏。
[root@localhost ~]# awk -F: 'function test(a,b){if(b>100) printf "User:%-20s UID:%-10s\n",a,b};test($1,$3)' /etc/passwd
User:ods UID:999
User:systemd-network UID:192
User:polkitd UID:998
User:unbound UID:997
User:libstoragemgmt UID:996
User:colord UID:995
User:nfsnobody UID:65534
User:saslauth UID:994
User:abrt UID:173
User:setroubleshoot UID:993
User:rtkit UID:172
示例:
打印九九乘法表膜蠢。
[root@localhost ~]# awk 'BEGIN{for(n=1;n<=9;n++){for (i=1;i<=n;i++) printf i"x"n"="i*n" ";printf "\n"}}'
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
三、編譯安裝NGINX莉兰,實現(xiàn)通過systemd管理挑围。
1.在進行編譯安裝nginx前需要先進安裝相關的依賴包,如下:
[root@localhost test1]# yum install gc gcc gcc-c++ pcre-devel zlib-devel openssl-devel
2.下載nginx糖荒,此處使用的是穩(wěn)定版nginx-1.14.0杉辙,然后解壓縮
[root@localhost test1]# wget http://nginx.org/download/nginx-1.14.0.tar.gz
--2018-10-14 17:24:16-- http://101.110.118.70/nginx.org/download/nginx-1.14.0.tar.gz
正在連接 101.110.118.70:80... 已連接。
已發(fā)出 HTTP 請求捶朵,正在等待回應... 200 OK
長度:1016272 (992K) [application/octet-stream]
正在保存至: “nginx-1.14.0.tar.gz”
100%[===========================================================================================>] 1,016,272 2.06MB/s 用時 0.5s
2018-10-14 17:24:17 (2.06 MB/s) - 已保存 “nginx-1.14.0.tar.gz” [1016272/1016272])
[root@localhost test1]# ll
總用量 996
-rw-r--r--. 1 root root 1016272 4月 17 23:35 nginx-1.14.0.tar.gz
[root@localhost test1]# tar -zxvf nginx-1.14.0.tar.gz
nginx-1.14.0/
nginx-1.14.0/auto/
nginx-1.14.0/conf
4.創(chuàng)建nginx安裝目錄:/usr/local/nginx蜘矢,并進入已解壓出的源碼包目錄nginx-1.14.0.
[root@localhost test1]# mkdir /usr/local/nginx
[root@localhost test1]# cd nginx-1.14.0
[root@localhost nginx-1.14.0]#
5.定義編譯設置,./configure综看,這里只設置一個基本能使用的nginx即可品腹,具體需要什么功能模塊可自主選擇,使用./configure --help 命令可以查看所有模塊红碑。若運行后沒有報錯舞吭,則可以進行編譯安裝。
[root@localhost nginx-1.14.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
checking for OS
+ Linux 3.10.0-862.el7.x86_64 x86_64
checking for C compiler ... found
6.進行編譯安裝:make && make install
[root@localhost nginx-1.14.0]# make && make install
make -f objs/Makefile
make[1]: 進入目錄“/tmp/test1/nginx-1.14.0”
......
[root@localhost nginx-1.14.0]# cd /usr/local/nginx
[root@localhost nginx]# ll
總用量 4
drwxr-xr-x. 2 root root 4096 10月 14 17:54 conf
drwxr-xr-x. 2 root root 40 10月 14 17:54 html
drwxr-xr-x. 2 root root 6 10月 14 17:54 logs
drwxr-xr-x. 2 root root 19 10月 14 17:54 sbin
7.編譯安裝成功后析珊,注意檢查防火墻和selinux是否關閉羡鸥,若未關閉需要關閉掉,以免影響輸出結(jié)果忠寻。
[root@localhost nginx]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since 日 2018-10-14 15:34:10 CST; 2h 28min ago
Docs: man:firewalld(1)
Main PID: 713 (firewalld)
CGroup: /system.slice/firewalld.service
└─713 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
10月 14 15:34:10 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
10月 14 15:34:10 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
[root@localhost nginx]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost nginx]# systemctl stop firewalld.service
[root@localhost nginx]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@localhost nginx]# getenforce #檢測selinux狀態(tài)
Enforcing #此為開啟狀態(tài)
[root@localhost nginx]# setenforce 0 #關閉selinux
[root@localhost nginx]# getenforce
Permissive
8.編輯nginx的unit文件惧浴。
在/usr/lib/systemd/system/目錄下新建一個名為nginx.service,編輯此文件并寫入以下腳本并保存:
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
9.創(chuàng)建并編輯完成nginx的unit文件之后奕剃,就可以運用systemd管理nginx服務了衷旅。
首先啟動nginx服務:systemctl start nginx.service
然后用systemctl status nginx.service
查看nginx服務的運行狀態(tài)
[root@localhost nginx]# systemctl start nginx.service
[root@localhost nginx]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since 日 2018-10-14 18:21:43 CST; 2s ago
Docs: http://nginx.org/en/docs/
Process: 6326 ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf (code=exited, status=0/SUCCESS)
Process: 6324 ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 6328 (nginx)
Tasks: 2
CGroup: /system.slice/nginx.service
├─6328 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
└─6329 nginx: worker process
10月 14 18:21:43 localhost.localdomain systemd[1]: Starting nginx - high performance web server...
10月 14 18:21:43 localhost.localdomain nginx[6324]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
10月 14 18:21:43 localhost.localdomain nginx[6324]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
10月 14 18:21:43 localhost.localdomain systemd[1]: Failed to read PID from file /usr/local/nginx/logs/nginx.pid: Invalid argument
10月 14 18:21:43 localhost.localdomain systemd[1]: Started nginx - high performance web server.
10.在瀏覽器中輸入配置了nginx的服務器地址哑姚,出現(xiàn)以下頁面,說明編譯安裝后運行成功芜茵。
11.可以使用以下命令對nginx服務進行管理
- systemctl enable nginx.service:開機運行nginx
- systemctl is-enabled nginx.service:開機運行nginx
[root@localhost nginx]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@localhost nginx]# systemctl is-enabled nginx.service
enabled
- systemctl disable nginx.service:取消開機運行nginx
- systemctl stop nginx.service:停止nginx
- systemctl restart nginx.service:重啟nginx
- systemctl reload nginx.service:重新加載nginx配置文件
- systemctl --failed:顯示啟動失敗的服務