Systemd的特性與常見unit類型及awk簡介

一、systemd的新特性及unit常見類型


systemd即為system daemon,是Centos 7上用于替換init啟動進程的新的啟動進程宪摧。systemd出現(xiàn)的主要目的為減少系統(tǒng)引導時間和計算開銷岳颇。Linux系統(tǒng)使用Systemd引導程序取代傳統(tǒng)的SysV init,Systemd兼容init開機啟動腳本叮贩。

systemd的特性

  1. 系統(tǒng)引導時击狮,其服務并行啟動
  2. 按需激活進程
  3. 系統(tǒng)狀態(tài)快照
  4. 基于依賴關系定義服務控制邏輯

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來進行查看玫氢。

  1. 基于socket的激活機制:socket與程序分離。systemd為支持此機制的服務監(jiān)聽socket谜诫,當接收到來自客戶端的socket通信時漾峡,由systemd激活對應的服務,應答客戶端的請求
  2. 基于bus的激活機制:基于總線的請求來激活設備
  3. 基于device的激活機制猜绣;當有設備接入到系統(tǒng)時灰殴,systemd會自動激活device、mount、automount等unit來識別牺陶、掛載伟阔、接入對應的設備
  4. 基于path的激活機制:當某個文件路徑變得可用時或路徑出現(xiàn)相應的文件時,激活相應的服務掰伸;
  5. 系統(tǒng)快照:保存各unit的當前狀態(tài)信息于持久存儲在設備中
  6. 向后兼容sysv init腳本:能夠繼續(xù)使用/etc/init.d/目錄中的服務管理腳本
    不兼容的情況:
    1. systemctl的命令是固定不變的
    2. 不是由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的格式為:
  1. empty:空模式软棺,表示匹配每一行
  2. /regular expression/:僅處理能被此模式匹配到的行
  3. relational expression:關系表達式红竭;結(jié)果為真才會被處理
  4. line ranges:行范圍。startline码党,endline:/pat1/,/pat2/或者(NR>=2&&NR<=10)德崭。不支持直接用數(shù)字表示的行號
  5. BEGIN{}和END{}:
    BEGIN{}:表示在開始處理行前執(zhí)行一次指定的操作;
    END{}:表示在結(jié)束對行的處理后執(zhí)行一次指定的操作
  • program語句的變量
  • 內(nèi)建變量
    • FS:input field seperator,輸入時分隔符揖盘,默認為空白字符 awk -v FS=':' '{print 1,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)以下頁面,說明編譯安裝后運行成功芜茵。


nginx..png

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:顯示啟動失敗的服務
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倡蝙,隨后出現(xiàn)的幾起案子九串,更是在濱河造成了極大的恐慌,老刑警劉巖寺鸥,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猪钮,死亡現(xiàn)場離奇詭異,居然都是意外死亡胆建,警方通過查閱死者的電腦和手機烤低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笆载,“玉大人扑馁,你說我怎么就攤上這事×棺ぃ” “怎么了腻要?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涝登。 經(jīng)常有香客問我雄家,道長聘芜,這世上最難降的妖魔是什么魏颓? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任见秤,我火速辦了婚禮鉴象,結(jié)果婚禮上妄田,老公的妹妹穿的比我還像新娘萤衰。我一直安慰自己霎俩,他們只是感情好碱璃,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布褐荷。 她就那樣靜靜地躺著勾效,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叛甫。 梳的紋絲不亂的頭發(fā)上层宫,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音其监,去河邊找鬼萌腿。 笑死,一個胖子當著我的面吹牛抖苦,可吹牛的內(nèi)容都是我干的毁菱。 我是一名探鬼主播米死,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贮庞!你這毒婦竟也來了峦筒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤窗慎,失蹤者是張志新(化名)和其女友劉穎物喷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遮斥,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡峦失,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了术吗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尉辑。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖较屿,靈堂內(nèi)的尸體忽然破棺而出隧魄,到底是詐尸還是另有隱情,我是刑警寧澤吝镣,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布堤器,位于F島的核電站,受9級特大地震影響末贾,放射性物質(zhì)發(fā)生泄漏闸溃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一拱撵、第九天 我趴在偏房一處隱蔽的房頂上張望辉川。 院中可真熱鬧,春花似錦拴测、人聲如沸乓旗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屿愚。三九已至,卻和暖如春务荆,著一層夾襖步出監(jiān)牢的瞬間妆距,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工函匕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娱据,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓盅惜,卻偏偏與公主長得像中剩,于是被迫代替她去往敵國和親忌穿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容