系統引導時實現服務並行啓動; 按需激活進程; 系統狀態快照; 基於依賴關係定義服務控制邏輯;
unit由其相關配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息; 這些配置文件主要保存在: /usr/lib/systemd/system /run/systemd/system /etc/systemd/system
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文件
編譯安裝nginx服務
安裝軟件node
[root@node1 ~]# yum install -y pcre pcre-devel openssl-devel [root@node1 ~]# useradd nginx [root@node1 ~]# passwd nginx [root@node1 ~]# tar -vzxf nginx-1.13.3.tar.gz -C /usr/local [root@node1 ~]# cd nginx-1.13.3/ [root@node1 nginx-1.13.3]# ./configure \ > --group=nginx \ > --user=nginx \ > --prefix=/usr/local/nginx \ > --sbin-path=/usr/sbin/nginx \ > --conf-path=/etc/nginx/nginx.conf \ > --error-log-path=/var/log/nginx/error.log \ > --http-log-path=/var/log/nginx/access.log \ > --http-client-body-temp-path=/tmp/nginx/client_body \ > --http-proxy-temp-path=/tmp/nginx/proxy \ > --http-fastcgi-temp-path=/tmp/nginx/fastcgi \ > --pid-path=/var/lock/nginx \ > --with-http_stub_status_module \ > --with-http_ssl_module \ > --with-http_gzip_static_module \ > --with-pcre [root@node1 nginx-1.13.3]# make && make install
編輯文件,實現systemd管理linux
[root@node1 nginx-1.13.3]# cat /usr/lib/systemd/system/nginx.service [Unit] Description=Nginx Service [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop
最後重啓並關閉nginx
[root@node1 nginx-1.13.3]# /usr/local/nginx/sbin/nginx [root@node1 nginx-1.13.3]# /usr/local/nginx/sbin -s reload [root@node1 nginx-1.13.3]# /usr/local/nginx/sbin -s stop
文本三劍客之awk
awk是一種報表生成器,與sed,grep都是文本處理工具,能夠將編輯的文本進行格式化排版處理後以更加美觀的形式輸出,在linux上使用的awk是GNUawk即gawk,gawk是awk的套接字文件,兩者相同。express
基本用法:gawk [options] 'program' FILE ... program: PATTERN{ACTION STATEMENTS} 語句之間用分號分隔 選項: -F:指明輸入時用到的字段分隔符; -v var=value: 自定義變量 一、print print item1, item2, ... 要點: (1) 逗號分隔符; (2) 輸出的各item能夠字符串,也能夠是數值;當前記錄的字段、變量或awk的表達式; (3) 如省略item,至關於print $0;
2.1 內建變量 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, 行數; FNR:各文件分別計數;行數; FILENAME:當前文件名; ARGC:命令行參數的個數; ARGV:數組,保存的是命令行所給定的各參數; 2.2 自定義變量 (1) -v var=value 變量名區分字符大小寫; (2) 在program中直接定義
示例:apache
[root@node1 ~]# awk -F ':' '{print $1,$3}' /etc/passwd root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11 games 12 ftp 14 nobody 99 systemd-network 192 dbus 81 polkitd 999 postfix 89 sshd 74 chrony 998 user1 1001 hadoop 1006 bash 1007 testbash 1008 basher 1009 nologin 1010 centos 1011 fedoer 1012 nginx 1013 [root@node1 ~]# 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 ftp#14#/sbin/nologin nobody#99#/sbin/nologin systemd-network#192#/sbin/nologin dbus#81#/sbin/nologin polkitd#999#/sbin/nologin postfix#89#/sbin/nologin sshd#74#/sbin/nologin chrony#998#/sbin/nologin user1#1001#/bin/bash hadoop#1006#/bin/bash bash#1007#/bin/bash testbash#1008#/bin/bash basher#1009#/bin/bash nologin#1010#/sbin/nologin centos#1011#/bin/bash fedoer#1012#/bin/bash nginx#1013#/bin/bash
格式化輸出:printf FORMAT, item1, item2, ... (1) FORMAT必須給出; (2) 不會自動換行,須要顯式給出換行控制符,\n (3) FORMAT中須要分別爲後面的每一個item指定一個格式化符號; 格式符: %c: 顯示字符的ASCII碼; %d, %i: 顯示十進制整數; %e, %E: 科學計數法數值顯示; %f:顯示爲浮點數; %g, %G:以科學計數法或浮點形式顯示數值; %s:顯示字符串; %u:無符號整數; %%: 顯示%自身; 修飾符: #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後的精度; %3.1f -: 左對齊 +:顯示數值的符號
算術操做符: x+y, x-y, x*y, x/y, x^y, x%y -x +x: 轉換爲數值; 字符串操做符:沒有符號的操做符,字符串鏈接 賦值操做符: =, +=, -=, *=, /=, %=, ^= ++, -- 比較操做符: >, >=, <, <=, !=, == 模式匹配符: ~:是否匹配 !~:是否不匹配 邏輯操做符: && || ! 函數調用: function_name(argu1, argu2, ...) 條件表達式: selector?if-true-expression:if-false-expression
示例:c#
[root@node1 ~]# 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 lp:Sysadmin or SysUser sync:Sysadmin or SysUser shutdown:Sysadmin or SysUser halt:Sysadmin or SysUser mail:Sysadmin or SysUser operator:Sysadmin or SysUser games:Sysadmin or SysUser ftp:Sysadmin or SysUser nobody:Sysadmin or SysUser systemd-network:Sysadmin or SysUser dbus:Sysadmin or SysUser polkitd:Sysadmin or SysUser postfix:Sysadmin or SysUser sshd:Sysadmin or SysUser chrony:Sysadmin or SysUser user1:Common User hadoop:Common User bash:Common User testbash:Common User basher:Common User nologin:Common User centos:Common User fedoer:Common User nginx:Common User
(1) empty:空模式,匹配每一行; (2) /regular expression/:僅處理可以被此處的模式匹配到的行; (3) relational expression: 關係表達式;結果有「真」有「假」;結果爲「真」纔會被處理; 真:結果爲非0值,非空字符串; (4) line ranges:行範圍, startline,endline:/pat1/,/pat2/ 注意: 不支持直接給出數字的格式 ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd (5) BEGIN/END模式 BEGIN{}: 僅在開始處理文件中的文本以前執行一次; END{}:僅在文本處理完成以後執行一次;
示例:
定義一個數組,裏面有三個元素,循環打印裏面的元素各一次centos
[root@node1 ~]# awk 'BEGIN{weekday["mon"]="Monday";weekday["tue"]="Tuesday";weekday["wen"]="Wensday";for(i in weekday)print weekday[i]}' Wensday Tuesday Monday
顯示fstab文件中每一個文件系統類型出現的次數,UUID開頭的行的第三個字段表示掛載的文件系統類型數組
[root@node1 ~]# awk '/^UUID\>/{fs[$3]++}END{for(i in fs)print i,fs[i]}' /etc/fstab xfs 1
rand():返回0和1之間一個隨機數;bash
length([s]):返回指定字符串的長度; sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其第一次出現替換爲s所表示的內容; gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其全部出現均替換爲s所表示的內容; split(s,a[,r]):以r爲分隔符切割字符s,並將切割後的結果保存至a所表示的數組中;
示例:app
[root@node1 ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}' 192.168.10.1 1 0.0.0.0 2 [root@node1 ~]# awk '{for(i=1;i<=NF;i++)count[$i]++}END{for(i in count) print i,count[i]}' /etc/fstab swap 2 fstab(5), 1 filesystems, 1 2018 1 on 1 /etc/fstab 1 5 1 /boot 1 more 1 mount(8) 1 UUID=38a2a3be-952e-4541-814b-77553d4e9204 1 pages 1 '/dev/disk' 1 21:24:35 1 Sep 1 /dev/mapper/centos-swap 1 blkid(8) 1 See 1 /dev/mapper/centos-root 1 for 1 and/or 1 anaconda 1 / 1 findfs(8), 1 under 1 Created 1 0 6 info 1 Accessible 1 # 7 defaults 3 xfs 2 man 1 are 1 reference, 1 by 2 maintained 1 Wed 1