1. 程式人生 > >Linux的systemd特性及gawk使用

Linux的systemd特性及gawk使用

nts boot 表示 per 令行 邏輯 begin ets fas

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

  • Systemd的新特性:

    系統引導時實現服務並行啟動;
        按需激活進程;
        系統狀態快照;
        基於依賴關系定義服務控制邏輯;

    核心概念:unit

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

    unit的常見類型:

    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服務
    安裝軟件

    [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管理

    [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

    最後重啟並關閉

    [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
    • 2、描述awk命令用法及示例(至少3例)

    文本三劍客之awk
    awk是一種報表生成器,與sed,grep都是文本處理工具,可以將編輯的文本進行格式化排版處理後以更加美觀的形式輸出,在linux上使用的awk是GNUawk即gawk,gawk是awk的套接字文件,二者相同。

    gawk - pattern scanning and processing language

    基本用法:gawk [options] ‘program‘ FILE ...
              program: PATTERN{ACTION STATEMENTS}
        語句之間用分號分隔
    
    選項:
        -F:指明輸入時用到的字段分隔符;
        -v var=value: 自定義變量
    1、print
    print item1, item2, ...
    
    要點:
    (1) 逗號分隔符;
    (2) 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;
    (3) 如省略item,相當於print $0;

    2、變量

    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中直接定義

    示例:

    [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

    3、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
                    -: 左對齊
                    +:顯示數值的符號

    4、操作符

            算術操作符:
                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

    示例:

    [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

    5、PATTERN

            (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{}:僅在文本處理完成之後執行一次;

    示例:
    定義一個數組,裏面有三個元素,循環打印裏面的元素各一次

    [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
    • 3、描述awk函數示例(至少3例)

    awk函數分為內置函數與自定義函數

    • 內置函數

      數值處理:

      rand():返回0和1之間一個隨機數;

    字符串處理:

    length([s]):返回指定字符串的長度;
    sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其第一次出現替換為s所表示的內容;
    gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其所有出現均替換為s所表示的內容;
    split(s,a[,r]):以r為分隔符切割字符s,並將切割後的結果保存至a所表示的數組中;

    示例:

    [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

    Linux的systemd特性及gawk使用