Systemd服务启动管理以及awk命令详解

1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理


Systemd:

    POST--BIOS--Bootloader(MBR)--Kernel(ramdisk)--rootfs--/sbin/init

      init:

         CentOS 5:Sysv init

         CentOS 6:Upstart

         CentOS 7:systemd



      systemd的特性:

         系统引导时实现服务并运行启动

         按需激活选项

         系统状态快照

         基于依赖关系定义控制逻辑


      核心概念:Unit

         Unit由其相关配置文件进行标识、识别和配置,文件中主要包含了系统服务、监听的socket,保存的快照以及其他与init相关的信息,这些配置文件主要保存


在:

              /usr/lib/systemd/system

              /run/systemd/system

              /etc/systemd/system


         Unit的常见类型:

             Serveice unit:文件拓展名为.service,用于定义系统服务

             Target unit:文件拓展名为.target,用于模拟实现“运行级别”

             Device unit:文件拓展名为.device,用于定义内核识别的设备

             Mount unit:文件拓展名为.mount,定义文件系统挂载点

             Socket unit:文件拓展名为.socket,用于标识进程间通信用到的socket文件

             Snapshot unit:文件拓展名为.snpashot管理系统快照

             Swap unit:文件拓展名为.swap,用于标识swap设备

             Automount unit:文件拓展名为.automount,定义文件系统自动挂载点设备

             Path unit:文件拓展名为.path用于定义文件系统中的文件或目录

         

         关键特性:

             基于socket的激活机制:socket与程序分离

             基于bus的激活机制

             基于device的激活机制

             基于path的激活机制

             系统快照:保存各unit的当前状态信息与持久存储设备中

             向后兼容sysv init脚本

                 /etc/init.d/



         不兼容:

             systemctl的命令是固定不变的

             非由systemctl启动的服务,systemctl无法与之通信



         

         管理系统服务:

             CentOS 7:service类型的unit文件


                 systemctl命令:- Control the systemd system and service manager


                     systemctl [OPTIONS...] COMMAND [NAME...]

                         启动:service NAME start ==>systemctl start NAME.service

                         停止:service NAME stop ==>systemctl stop NAME.service

                         重启:service NAME restart ==>systemctl restart NAME.service

                         状态:service NAME status ==>systemctl status NAME.service

                         条件式重启:service NAME condrestart ==>systemctl try-restart NAME.service

                         重载或重启服务:systemctl reload-or-restart NAME.service

                         重载或条件式重启服务:systemctl reload-or-try-restart NAME.service


                         查看某服务当前激活与否的状态:systemctl ls-active NAME.service

                         查看所有已激活的服务:systemctl list-units --type service

                         查看所有服务(已激活及未激活):chkconfig --list ==>systemctl list-units -t service --all


                         设置服务开机启动:chkconfig NAME on ==>systemctl enable NAME.service

                         禁止服务开机启动:chkconfig NAME off ==>systemctl disable NAME.service 

                         查看某服务是否能开机自启:chkconfig --list NAME ==>systemctl ls-enabled NAME.service


                         禁止某服务设定为开机启动:systemctl mask NAME.service

                         取消此禁止:systemctl unmask NAME.service


                         查看服务的依赖关系:systemctl list-dependencies NAME.service


         管理target unit

             运行级别:

                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.target

                6 ==>runlevel6.target,reboot.target



             级别切换:init N ==>systemctl isolate NAME.target


             查看级别:runlevel ==>systemctl list-units --type target

             查看所有级别:systemctl list-units -t target -a


             获取默认运行级别:systemctl get-default

             修改默认运行级别:systemctl set-default NAME.service


             切换至紧急救援模式:systemctl rescue

             切换至emergency模式:systemctl emergency


         其他常用命令:

             关机:systemctl halt,systemctl poweroff

             重启:systemctlreboot

             挂起:systemctl suspend

             快照:systemctl hibernate

             快照并挂起:systemctl hybrid-sleep



        service unit file:

             文件通常由三部分组成:

                 [Unit]:定义与unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等

                 [Service]:与特定类型相关的专用选项;此处为Service类型

                 [Install]:定义由"systemctl enable"以及"systemctl disable"命令在实现服务启用后禁用时用到的一些选项



             Unit段的常用选项:

                 Description:描述信息,意义性描述

                 After:定义unit的启动顺序,表示当前unit应该晚于哪些unit启动,其功能与Before相反

                 Requies:依赖到的其他units,强依赖,被依赖的units无法激活时,当前unit即无法激活

                 Wants:依赖到的其他units,弱依赖,

                 Conficts:定义units之间的冲突


             Service段的常用选项:

                 TYPE:用于定义影响ExecStart及相关参数的功能的unit进程启动类型

                     类型:

                        simple

                        forking

                        oneshot

                        dbus

                        notify

                        idle

                 EnvironmentFile:环境配置文件

                 ExecStart:指明启动unit要运行的命令或脚本,ExecStartPre、ExecStartPost

                 ExecStop:指明停止unit要运行的命令或脚本,

                 Restart:指明要重启unit要运行的命令或脚本


             Install段的常用选项:

                 Alias:当前unit的别名

                 RequiredBy:被哪些unit所依赖,强依赖

                 WantedBY:被哪些unit所依赖,弱依赖


        注意:对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件

              #systemctl daemon-reload 


 配置nginx启动示例:

        [Unit]

        Description=nginx

        After=network.target


       [Service]

       Type=forking

       ExecStart=/usr/local/nginx/sbin/nginx

       ExecReload=/usr/local/nginx/sbin/nginx -s reload

       ExecStop=/usr/local/nginx/sbin/nginx -s quit

       PrivateTmp=true


       [Install]

       WantedBy=multi-user.target


2、描述awk命令用法及函数示例


AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一,而我们日常所使用的awk是gawk(GNU awk).

基本用法:

 gawk [options] ‘program’ FILE...

      program:PATTERN{ACTION STATEMENTS}

         语句之间用分号“;”分割


         print printf


         选项:

            -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:当前文件名

             ~]# awk '{print FILENAME}' /etc/fstab 


             ARGC:命令行参数的个数

                ~]# awk '{print ARGC}' /etc/fstab /etc/passwd

             ARGV:数组,保存的是命令行所给定的各参数

                ~]# awk 'BEGIN{print ARGV[2]}' /etc/fstab /etc/passwd


           2.2自定义变量

             (1)-v var=value 


                 变量名区分字符大小写


             (2)在program中直接定义


       3.printf命令


            格式化地输出:printf FORMAT,item1,item2,...


                (1)FORMAT必须给出

                (2)不会自动换行,需要显示给出换行控制符:\n

                (3)FORMAT中需要分别为后面的每个item指定一个格式化符号


                格式符:

                    %c:显示字符的ASCII码

                    %d,%i:显示十进制整数

                    %e,%E:科学计数法数值显示

                    %f:显示为浮点数

                    %g,%G:以科学计数法或浮点形式显示数值

                    %s:显示字符串

                    %u:无符号整数

                    %%:显示%自身


                示例:

                   ~]# awk -F: '{printf "Username: %s,UID: %d\n",$1,$3}' /etc/passwd 


                修饰符:

                   #[.#]:第一个#控制显示的宽度,第二个#表示小数点后的精度

                     %3.1f


                   -:左对齐

                   +:显示数值的符号


                示例:

                   ~]# awk -F: '{printf "Username: %-10s,UID: %d\n",$1,$3}' /etc/passwd 



       4.操作符


            算数操作符:

               x+y,x-y,x*y,x/y,x^y,x%y

               -x

               +x:转换为数值


            字符串操作符:没有符号的操作符,字符串连接


            赋值操作符:

               =,<=,>=,<,>,==,!=

               ++,--


            模式匹配符:

               ~:是否匹配

               !~:是否不匹配


            逻辑操作符

               &&

               ||

               !


            函数调用:

               function_name(argu1,argu2,...)


            条件表达式:

               selector?if-true-expression:if-fales-expression


            示例:

               ~]# awk -F: '{$3>=1000?usertype="Common user":usertype="sysadmin or sysuser";printf "%10s:%-s\n",$1,usertype}' /etc/passwd


       

       5.PATTERN


           (1)empty:空模式,匹配每一行

           (2)/regular expression/:仅处理能够被此处的模式所匹配到的行

                ~]# awk '/^UUID/ {print $3 }' /etc/fstab 

           (3)relational expression:关系表达式,结果有“真”有“假”,结果为“真”时才会被处理

               真:结果为非0值,非空字符串

                  ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd

                  ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd

           (4)line ranges:行范围

               startline,endline: /pat1/,/pat2/


               注意:不支持直接给出数字的格式

                 ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd

           (5)BEGIN/END模式

               BEGIN{}:仅在开始处理文件中的文本之前执行一次

               END{}:j仅在文本处理完成之后执行一次

            示例:

               ~]# awk -F: 'BEGIN{print " username     uid \n ---------------------"}{print $1,$3}END{print "-------------------\n end    "}' 


/etc/passwd



        

       6.常用的action


           (1)Expression

           (2)Control statement:if,while等

           (3)Compound statement:组合语句

           (4)input statement

           (5)output statement



       7.控制语句


           if(condition) {statement}

           if(condition) {statement} else {statement}

           while(condition) {statement}

           do {statement} while {condition}

           for(expr1;expr2;expr3) {statement}

           break

           continue

           delete array[index]

           delete array

           exit

           { statement }



           7.1  if-else


              语法:if(condition) statement [else statement]


              示例:

                 ~]# awk -F: '{if($3>=100){printf"Common user: %s\n",$1} else {printf "sysadmin or sysuser: %s\n",$1}}' /etc/passwd


                 ~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd


                 ~]# awk '{if(NF>2) print $0}' /etc/fstab 


                 ~]# df -h | awk -F[%] '/^\/dev/ {print $1}'| awk '{print $NF}'


              使用场景:对awk取得的整行或某个字段做条件判断


           7.2 while循环


              语法:while(condition) statement

                   条件“真”,进入循环,条件“假”,退出循环


              使用场景:对一行内的多个字段逐一作类似处理时使用;对数组中的各元素逐一处理时使用


                 length()


              示例:

                 ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg 


                 ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)};i++}}' /etc/grub2.cfg


           7.3 do-while循环


               语法: do statement while (condition)

                   意义:至少执行一次循环体



           7.4 for循环


               语法: for(expr1;expr2;expr3) statement


                   for(控制变量初始化;条件判断表达式;控制变量的修正语句) (循环体)


               示例:

                   ~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg


               特殊用法:

                   能够遍历数组中的元素

                       语法:for(var in array) (for-body)


           7.5 switch语句


               语法: switch(表达式) {case VALUE or /REGEXP1/: statement; case VALUE2 or /REGEXP2/: statement;...; default:statement}


           7.6 break和continue

                break [n]

                continue


           7.7 next

              

               示例:求用户ID为偶数的用户,显示其用户名以及ID

                 ~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd


               提前结束对本行的处理而直接进入下一行



        8. array


               关联数组:array[index-expression]


                   index-expression:

                      (1)可使用任意字符串

                      (2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”


                      若要判断数组中是否存在元素,要使用“index in array”格式进行


                      weekdays[mon]="monday"


                       ~]# awk 'BEGIN{weekdays[mon]="monday";weekdays[tue]="tuesday";print weekdays[tue]}'


                       若要遍历数组中的每个元素,需要使用for循环

                           for(var in array) {for-body}


                       ~]# awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"="tuesday";for(i in weekdays){print weekdays[i]}}'


                       注意:var会遍历array的每个索引

                       state["LISTEN"]++

                       state["EASTABLISHED"]++


                       ~]# netstat -tan | awk '/^tcp\>/{state["LISTEN"]++}END{for(i in state) {print i,state[i]}}'


                       ~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log 



            练习1.统计/etc/fstab文件中每个文件系统类型出现的次数

               ~]# awk '/^\/dev/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab 


            练习2.统计指定文件中每个单词出现的次数

               ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab 

          

        9. 函数


               9.1 内置函数

                  数值处理:

                    rand():返回0和1直接的一个随机数

                       ~]# awk 'BEGIN{print rand()}'


                  字符串处理:

                    length([s]):返回指定字符串的长度

                    sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容  

                    gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现全部替换为s所表示的内容 


                    split(s,a[r]):以r为分隔符切割字符s,并将其切割后的结果保存至a所表示的数组中


               9.2 自定义函数

                  《sed和awk》


          10 内置字符串函数


                gsub(r,s)    在整个$0中用s替代r

                gsub(r,s,t)    在整个t中用s替代r

                index(s,t)    返回s中字符串t的第一位置

                length(s)    返回s长度

                match(s,r)    测试s是否包含匹配r的字符串

                split(s,a,fs)    在fs上将s分成序列a

                sprint(fmt,exp)    返回经fmt格式化后的exp

                sub(r,s)    用$0中最左边最长的子串代替s

                substr(s,p)    返回字符串s中从p开始的后缀部分

                substr(s,p,n)    返回字符串s中从p开始长度为n的后缀部分 详细说明一下各个函数的使用方法。


            示例:

               ~]# cat tpm.txt | awk '{print substr($2,2,5)}'  #截取第二列字符串中2-5位置的字符









猜你喜欢

转载自blog.51cto.com/12068974/2338234